- 再看上述map的status值(也就是response的返回码),在DefaultErrorAttributes是如何生成的:
-
先看异常对象是不是ResponseStatusException类型
-
如果是ResponseStatusException类型,就调用异常对象的getStatus方法作为返回值
-
如果不是ResponseStatusException类型,再看异常类有没有ResponseStatus注解,
-
如果有,就取注解的code属性作为返回值
-
如果异常对象既不是ResponseStatusException类型,也没有ResponseStatus注解,就返回500
- 最后看map的message字段(也就是response body的message字段),在DefaultErrorAttributes是如何生成的:
-
异常对象是不是BindingResult类型
-
如果不是BindingResult类型,就看是不是ResponseStatusException类型
-
如果是,就用getReason作为返回值
-
如果也不是ResponseStatusException类型,就看异常类有没有ResponseStatus注解,如果有就取该注解的reason属性作为返回值
-
如果通过注解取得的reason也无效,就返回异常的getMessage字段
- 上述内容就是本篇精华,但是并未包含分析过程,如果您对Spring Cloud源码感兴趣,请允许欣宸陪伴您来一次短暂的源码阅读之旅
Spring Cloud Gateway错误处理源码
- 首先要看的是配置类ErrorWebFluxAutoConfiguration.java,这里面向spring注册了两个实例,每个都非常重要,咱们先关注第一个,也就是说ErrorWebExceptionHandler的实现类是DefaultErrorWebExceptionHandler:
- 处理异常时,会通过FluxOnErrorResume调用到这个Err