解决springboot配置@ControllerAdvice不能捕获NoHandlerFoundException问题

使用springboot开发一个RESTful API服务,配置了@ControllerAdvice,其它类型异常都能正常捕获,就是不能捕获NoHandlerFoundException,

安装以往使用springmvc的经验,需要设置DispatcherServlet.throwExceptionIfNoHandlerFound,NoHandlerFoundException就会被DispatcherSevlet抛出,并被@ControllerAdvice捕获处理。想来springboot中自然也是可以的。
网上一搜发现,只需设置spring.mvc.throw-exception-if-no-handler-found=true即可。设置后依然无效!
再次搜索,还需要设置spring.resources.add-mappings=false,问题解决!
很奇怪,为什么禁用了资源映射后,问题就解决了呢?
研究DispatcherServlet源码发现,NoHandlerFoundException异常能否被抛出,关键在如下代码:

1 mappedHandler = getHandler(processedRequest);
2 if (mappedHandler == null || mappedHandler.getHandler() == null) {
3     noHandlerFound(processedRequest, response);
4     return;
5 }

 

只有第一句代码找不到对应该请求的处理器时,才会进入下面的noHandler方法去抛出NoHandlerFoundException异常。
通过测试发现,springboot的WebMvcAutoConfiguration会默认配置如下资源映射:

/映射到/static(或/public、/resources、/META-INF/resources) /webjars/ 映射到classpath:/META-INF/resources/webjars/ /**/favicon.ico映射favicon.ico文件.

这下就明白了,即使你的地址错误,仍然会匹配到/**这个静态资源映射地址,就不会进入noHandlerFound方法,自然不会抛出NoHandlerFoundException了。
所以,我们需要的就是改掉默认的静态资源映射访问路径就可以了。
配置如下属性,NoHandlerFoundException异常就能被@ControllerAdvice捕获了

1 spring.mvc.throw-exception-if-no-handler-found=true
2 spring.mvc.static-path-pattern=/statics/**

 

posted @   低调的小白  阅读(5145)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
历史上的今天:
2018-07-02 curl java 模拟http请求
2018-07-02 Redis 个人理解总结
点击右上角即可分享
微信分享提示