欢送拜访我的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