关于云计算:Spring-Cloud-Gateway过滤器精确控制异常返回实战控制http返回码和message字段

16次阅读

共计 2251 个字符,预计需要花费 6 分钟才能阅读完成。

欢送拜访我的 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 内容,篇幅所限,这种终极的解决形式就留在下一篇吧,敬请期待,欣宸原创,必不辜负您 …

你不孤独,欣宸原创一路相伴

  1. Java 系列
  2. Spring 系列
  3. Docker 系列
  4. kubernetes 系列
  5. 数据库 + 中间件系列
  6. DevOps 系列

欢送关注公众号:程序员欣宸

微信搜寻「程序员欣宸」,我是欣宸,期待与您一起畅游 Java 世界 …
https://github.com/zq2599/blog_demos

正文完
 0