interceptor 和异常全局处理 Advice Advice中没有捕获异常
问题场景:
我有两个项目,都有全局拦截器 interceptor 和异常全局处理 Advice。且在Advice中处理的错误返回http status code 为200,只是接口msg字段输出异常message。
发现:
其中一个项目访问一个不存在的链接 http status 为 500 (下面称为A500项目),另一个访问一个不存在的链接 http status 为 200项目为 (下面称为B200项目)。
其中调试得知:
A500项目无论是否存在这个RequestMapping都会走过滤器 interceptor;过滤器某些验证没有通过抛出了自定义异常,而 Advice 无法捕获异常直接跳转到了 /error 页面走的Springboot默认错误处理逻辑。
A200项目访问RequestMapping不存在的链接会直接抛出异常class org.springframework.web.servlet.NoHandlerFoundException没有找到对应接口或者mapping。
期望结果:
我期望A500也是不走过滤器或者走也可以,但是 http status 不要为 500,因为我们项目没有走 http code 而是接口的返回 no 字段来判断。
解决:
经过比对两个项目不同,发现 A200 项目的 application.yml 文件中 static-path-pattern 如下:
spring:
mvc:
static-path-pattern: /static/** # 自定义映射目录
而 A500 中却没有 static-path-pattern 加上之后达到效果。
猜测:在Spring Boot中,默认情况下,静态资源请求是不会经过拦截器(Interceptor
)链的,他会不会当做了静态资源去访问了呢?这还是要注意千万不要和静态资源冲突或者同名。