写点什么

Spring Cloud Gateway 过滤器精确控制异常返回 (实战,控制 http 返回码和 message 字段)

  • 2022 年 4 月 15 日
  • 本文字数:1094 字

    阅读完需:约 4 分钟

| git 仓库地址(ssh) | git@github.com:zq2599/blog_demos.git | 该项目源码的仓库地址,ssh 协议 |


  • 这个 git 项目中有多个文件夹,本篇的源码在 spring-cloud-tutorials 文件夹下,如下图红框所示:



  • spring-cloud-tutorials 文件夹下有多个子工程,本篇的代码是 gateway-change-body,如下图红框所示:


[](()第一种:抛出 ResponseStatusException 异常

  • 打开 gateway-change-body 工程的 RequestBodyRewrite.java 文件,改动如下图红框,如果请求 body 不含 user-id 参数就返回 Mono.error,入参是 ResponseStatusException 异常,设置了返回码为 400,message 为一段中文描述:



  • 接下来运行 nacos、provider-hello 工程、gateway-change-body 工程

  • 用 postman 发请求试试,请求和响应的详情如下图:



  • 从上图可见,返回码为 400,和我们设定的一样,但是 message 却为空,这是怎么回事呢?按照 Java 开源项目【ali1024.coding.net/public/P7/Java/git】 咱们的设定,这里应该显示请求参数必须包含 user-id 字段,看来咱们遇到一只拦路虎了

[](()小小拦路虎

  • 咱们代码中,抛异常的时候设定 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;

结尾


这不止是一份面试清单,更是一种”被期望的责任“,因为有无数个待面试者,希望从这篇文章中,找出通往期望公司的”钥匙“,所以上面每道选题都是结合我自身的经验于千万个面试题中经过艰辛的两周,一个题一个题筛选出来再次对好答案和格式做出来的,面试的答案也是再三斟酌,深怕误人子弟是小,影响他人仕途才是大过,也希望您能把这篇文章分享给更多的朋友,让他帮助更多的人,帮助他人,快乐自己,最后,感谢您的阅读。


由于细节内容实在太多啦,在这里我花了两周的时间把这些答案整理成一份文档了,在这里只把部分知识点截图出来粗略的介绍,每个小节点里面都有更细化的内容!

用户头像

还未添加个人签名 2022.04.13 加入

还未添加个人简介

评论

发布
暂无评论
Spring Cloud Gateway过滤器精确控制异常返回(实战,控制http返回码和message字段)_Java_爱好编程进阶_InfoQ写作平台