前提:

GlobalExceptionHandler.java类中的@ControllerAdvice注解只处理经过Controller的不经过Controller的不进行处理
SpringBoot 默认提供了一个全局的 handler 来处理所有的 HTTP 错误, 并把它映射为 /error。当发生一个 HTTP 错误, 例如 404 错误时, SpringBoot 内部的机制会将页面重定向到 /error 中。

springboot1.xspringboot2.x中,都可以直接使用@ControllerAdvice即可

对于404的请求:
springboot1.5.10中,当存在请求没有controller匹配请求后404,同时会直接重定向/error,这个时候我们可以直接判断request中的uri是否包含/error,如果有抛出异常,再有@ControllerAdvice处理即可。

对于springboot2.0问题来了,当404时,不仅会请求/error,原始请求也会来一次!!!。这时候如果有拦截器,则会拦截两次,比如请求/api/test,会拦截一次,404后,重定向到/api/error,会再拦截一次

这时候不能直接简单的拦截/error来,这时候需要关闭工程中的资源文件建立映射


spring.resources.add-mappings=false

也可以

#出现错误时, 直接抛出异常
spring.mvc.throw-exception-if-no-handler-found=true
#关闭工程中的资源文件建立映射
spring.resources.add-mappings=false

这时候,就会抛出异常,再在@ControllerAdvice中捕获NoHandlerFoundException异常即可

参考:
springboot2.0

https://blog.csdn.net/qq_42511800/article/details/85113235

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐