• 解决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/**
  • 相关阅读:
    Prometheus之Dockerfile编写、镜像构建、容器启动
    十五、数据库高并发处理方式
    十四、.NET CORE3.1 使用EFCORE(Microsoft.EntityFrameworkCore) 创建数据表
    云筹优化APS发布超强的可视化排产甘特图【+视频演示】
    如何解决xrdp远程连接UOS后黑屏的问题
    在linux下获取硬盘序列号
    linux下休眠/待机命令
    inotifywait的安装及基本使用
    Shell 脚本获取当前目录下全部文件夹名
    【转】第 4 章 Netperf 网络测试
  • 原文地址:https://www.cnblogs.com/wang-yaz/p/13225830.html
Copyright © 2020-2023  润新知