前提:
项目中统一使用 HttpResponseCode 来作为服务正常的返回, body 中放具体返回的内容.
如果抛出异常的情况下,期望 code 是4XX,body 中存放错误信息给用户友好提示
但是,在SpringCloud 中默认的异常抛出是一个包含五个字段的对象.如下:

{"timestamp": 1513303905953,"status": 400,"error": "Bad Request","exception": "org.springframework.web.bind.MissingServletRequestParameterException","message": "Required Integer parameter 'userId' is not present","path": "/info"
}

我们需要的是这样一种情况的:

接下来我们来实现这种情况.

首先,第一个想到的是使用 @ControllerAdvice 来做全局的异常拦截,对异常进行处理

但是,重启过后并没有什么作用,忽然想到@ControllerAdvice 应该是只处理到达 Controller 中的请求才能被拦截到,而 filter 在 controller 之前,所以拦截不到.那么就要找其他方法来处理.

ZuulFilter 中的 FilterType 中有一个 Error 的处理器.查找这方面资料StackOverflow,别人也遇到过这种情况需要同样的处理.
解决方案如下:

  1. error 类型的 zuulFilter
  2. 执行顺序在默认的 SendErrorFilter (index=0)之前,因此,我们设置为-1
  3. should 方法中检查有没有抛出异常
  4. run 方法中对异常进行处理

代码如下:

@Component
public class ErrorFilter extends ZuulFilter {private final Logger log = LoggerFactory.getLogger(Http401UnauthorizedEntryPoint.class);@Overridepublic String filterType() {return "error";}@Overridepublic int filterOrder() {//需要在默认的 SendErrorFilter 之前return -1; // Needs to run before SendErrorFilter which has filterOrder == 0}@Overridepublic boolean shouldFilter() {// only forward to errorPath if it hasn't been forwarded to alreadyreturn RequestContext.getCurrentContext().containsKey("throwable");}@Overridepublic Object run() {try {RequestContext ctx = RequestContext.getCurrentContext();Object e = ctx.get("throwable");if (e != null && e instanceof ZuulException) {ZuulException zuulException = (ZuulException) e;// Remove error code to prevent further error handling in follow up filters// 删除该异常信息,不然在下一个过滤器中还会被执行处理ctx.remove("throwable");// 根据具体的业务逻辑来处理ctx.setResponseStatusCode(HttpStatus.UNAUTHORIZED.value());}} catch (Exception ex) {log.error("Exception filtering in custom error filter", ex);ReflectionUtils.rethrowRuntimeException(ex);}return null;}
}

作者:罗曼蒂克
链接:https://www.jianshu.com/p/2de6290d7bf1
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

自定义 ZuulFilter抛出异常相关推荐

  1. 服务网关第一步,自定义ZuulFilter

    直接撸代码 public class AccessFilter extends ZuulFilter { private static Logger log = LoggerFactory.getLo ...

  2. 自定义ZuulFilter用于验证生成的token

    问题背景 微服务体系,一般都是把安全验证做再网关层面的.而一般zuul跟shiro或者spring security的集成会比较好. 但是,有时候公司的业务场景并不复杂,根本无需复杂的架构,那么手写一 ...

  3. Spring Cloud 入门 之 Zuul 篇(五)

    一.前言 随着业务的扩展,微服务会不对增加,相应的其对外开放的 API 接口也势必增多,这不利于前端的调用以及不同场景下数据的返回,因此,我们通常都需要设计一个 API 网关作为一个统一的 API 入 ...

  4. 2018-06-13 第三十八天

    ä¸ãwait--notify--sleep Object obj = new Object(); obj.wait(): 让当前线程在 obj上  等待.在调用obj.wait 之前,当前线程必须 ...

  5. python自定义抛出异常信息_浅谈python抛出异常、自定义异常, 传递异常

    一. 抛出异常 Python用异常对象(exception object)表示异常情况,遇到错误后,会引发异常.如果异常对象并未被处理或捕捉,程序就会用所谓的回溯(Traceback,一种错误信息)终 ...

  6. php 自定义抛出异常,TP6自定义抛出异常实例

    优势: 1.异常处理通常是防止未知错误产生所采取的处理措施.异常处理的好处是不用再绞尽脑汁去考虑各种错误,这为处理某一类错误提供了一个很有效的方法,使编程效率大大提高. 2.自定义抛出异常的好处,避免 ...

  7. python自定义全局异常_flask中主动抛出异常及统一异常处理代码示例

    本文主要介绍的是flask中主动抛出异常及统一异常处理的相关内容,具体如下. 在开发时,后台出现异常 ,但不想把异常显示给用户或者要统一处理异常时,可以使用abort主动抛出异常,再捕获异常返回美化后 ...

  8. zuulfilter添加例外_SpringCloud之Zuul 自定义filter

    实现过滤器很简单,只需要继承ZuulFilter,并实现ZuulFilter中的抽象方法. filterType():定义过滤器的类型,它有4种类型,分别是pre.post.routing和error ...

  9. Android自定义抛出异常

    前言 在android开发过程中,我们经常遇到异常的问题,崩溃抛出异常的时候,是非常令人烦闷的.但是异常有一个好处,使得app能在编译的时候给我们提供一些bug信息,有时可能比较模糊,有时可能很精准, ...

最新文章

  1. ALSM_EXCEL_TO_INTERNAL_TABLE
  2. C++_向函数传递对象
  3. 数位屏如何去光标_iPad还是数位板屏?我该选哪个?
  4. php curl viewstate,php curl – 发布asp.net viewstate值
  5. shell脚本备份mysql数据库(for循环)
  6. 《剑指offer》跳台阶
  7. 用JSmooth制作java jar文件的可运行exe文件教程【图文】
  8. 计算正方形面积和周长_寒假作业:长方形、正方形周长面积应用题,附答案
  9. redis安装+启动和连接+让redis在后台运行
  10. SAP License:SAP的2021关键词:协作
  11. 进程栈大小 与 线程栈大小-转
  12. 安卓脚本用什么写_什么是抖音脚本?脚本有什么用?
  13. java 数字转换字母大写_大写字母或小写字母转换为数字
  14. USB over Network通过本地网络或 Internet 共享的远程 USB 设备
  15. Android Design - 设计风格
  16. 两种 HTTP 请求方法
  17. Android 解析软件包时出现问题 -- Error staging apk from content URI
  18. JAVA学习中好网站
  19. 对比度易读性阈值研究_对比度研究:字体大小,对比度和可访问性
  20. 站长号词库:今日热门长尾关键词挖掘 20221129

热门文章

  1. VS2012使用svn
  2. happybase对hbase数据库的基本操作
  3. Flalsh Lighting Network(闪电网络)
  4. 计算机专业实习目的与意义,计算机专业实习目的及意义
  5. 怎样使用GetAsyncKeyState()
  6. 浅谈微信小程序对于创业者,意味着什么?
  7. Comparator、compare、compareTo
  8. uml画时序图操作步骤
  9. 白光干涉仪如何获得高度信息丨科普篇
  10. 程序员转行能做什么?