欢送拜访我的 GitHub
这里分类和汇总了欣宸的全副原创 (含配套源码):https://github.com/zq2599/blog_demos
本篇概览
- 前文《Spring Cloud Gateway 过滤器准确管制异样返回 (剖析篇)》咱们浏览源码,理解到 Spring Cloud Gateway 是如何解决全局异样信息的,学了那么多实践,未免手痒想实战验证学习效果,明天咱们就来写代码,最终目标是改写下图两个红框中的内容:
- 为了简略起见,本篇不再新增 maven 子工程,而是基于前文创立的子工程 <font color=”red”>gateway-change-body</font>,在这外面持续写代码;
源码下载
- 本篇实战中的残缺源码可在 GitHub 下载到,地址和链接信息如下表所示 (https://github.com/zq2599/blo…):
名称 | 链接 | 备注 |
---|---|---|
我的项目主页 | https://github.com/zq2599/blo… | 该我的项目在 GitHub 上的主页 |
git 仓库地址 (https) | https://github.com/zq2599/blo… | 该我的项目源码的仓库地址,https 协定 |
git 仓库地址 (ssh) | git@github.com:zq2599/blog_demos.git | 该我的项目源码的仓库地址,ssh 协定 |
- 这个 git 我的项目中有多个文件夹,本篇的源码在 <font color=”blue”>spring-cloud-tutorials</font> 文件夹下,如下图红框所示:
- <font color=”blue”>spring-cloud-tutorials</font> 文件夹下有多个子工程,本篇的代码是 <font color=”red”>gateway-change-body</font>,如下图红框所示:
第一种:抛出 ResponseStatusException 异样
- 关上 <font color=”red”>gateway-change-body</font> 工程的 RequestBodyRewrite.java 文件,改变如下图红框,如果申请 body 不含 user-id 参数就返回 Mono.error,入参是 ResponseStatusException 异样,设置了返回码为 400,message 为一段中文形容:
- 接下来运行 nacos、provider-hello 工程、gateway-change-body 工程
- 用 postman 发申请试试,申请和响应的详情如下图:
- 从上图可见,返回码为 400,和咱们设定的一样,然而 message 却为空,这是怎么回事呢?依照咱们的设定,这里应该显示 <font color=”blue”> 申请参数必须蕴含 user-id 字段 </font>,看来咱们遇到一只拦路虎了
小小拦路虎
- 咱们代码中,抛异样的时候设定 message 内容如下图红框所示,但运行的时候返回的是空字符串,这是怎么回事呢?
- 来看 DefaultErrorWebExceptionHandler.isIncludeMessage 办法,看下图红框中的那个 errorProperties,您会不会豁然开朗:这不就是 springboot 配置中的 erro 配置嘛!
- 批改工程的配置文件,红框内是新增的配置:
- 再用 postman 试试,如下图,这一次,status、message、exception、trace 齐聚一堂,完全符合预期:
- 看来第一种办法是可行的:返回 ResponseStatusException 类型的异样;
第二种:自定义异样,带 ResponseStatus 注解
- 接下来试试第二种办法:通 ResponseStatus 注解
- 首先新建一个异样类 MyGatewayException.java,应用了 ResponseStatus,在外面配置返回码和 message 内容,这次的返回码用的是 403:
package com.bolingcavalry.changebody.exception;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.ResponseStatus;
@ResponseStatus(code = HttpStatus.FORBIDDEN, reason = "user-id 字段不能为空")
public class MyGatewayException extends Exception {}
- 编码实现,重启利用,而后再发一次申请,如下图,返回码和 message 内容都合乎预期:
- 至此,两种最简略的形式都实现验证,个别状况下曾经满足要求:将错误信息精确传递给调用方
留有瑕疵
- 聪慧的您应该已发现上述两种计划有瑕疵:返回 body 的格局和字段都是固定的,如果我的项目中对返回 body 的内容有严格要求,例如只容许 code、message、data 三个字段,其余字段一律不能返回,此时又该怎么办呢?
- 仿佛须要一种办法,让咱们能够得心应手的设置 body 内容,篇幅所限,这种终极的解决形式就留在下一篇吧,敬请期待,欣宸原创,必不辜负您 …
你不孤独,欣宸原创一路相伴
- Java 系列
- Spring 系列
- Docker 系列
- kubernetes 系列
- 数据库 + 中间件系列
- DevOps 系列
欢送关注公众号:程序员欣宸
微信搜寻「程序员欣宸」,我是欣宸,期待与您一起畅游 Java 世界 …
https://github.com/zq2599/blog_demos