NoHandlerFoundException 的自定义异常处理程序在没有 @EnableWebMvc 的情况下不起作用

Posted

技术标签:

【中文标题】NoHandlerFoundException 的自定义异常处理程序在没有 @EnableWebMvc 的情况下不起作用【英文标题】:Custom exception handler for NoHandlerFoundException is not working without @EnableWebMvc 【发布时间】:2018-08-16 10:44:36 【问题描述】:

我想将 404 响应的 html 错误页面覆盖为 JSON 响应。当我在没有@EnableWebMvc 的情况下使用@ControllerAdvice 时,它不起作用。

@EnableWebMvc   // if i remove this, it is not working
@ControllerAdvice
@Order(Ordered.HIGHEST_PRECEDENCE)
public class GlobalControllerExceptionHandler 

    @ExceptionHandler(NoHandlerFoundException.class)
    public ResponseEntity<ZeusErrorDTO> noHandlerFoundException(
                    HttpServletRequest request, 
                    NoHandlerFoundException exception) 

        ErrorDTO errorDTO = new ErrorDTO();
        return new ResponseEntity<>(errorDTO, HttpStatus.NOT_FOUND);
    
 

是否有不带@EnableWebMvc 的自定义异常处理选项,因为它会覆盖在 application.yml 中声明的 Spring 配置。

【问题讨论】:

【参考方案1】:

发生这种情况是因为,使用 @EnableWebMvc 会禁用 MVC 自动配置并要求您提供您想要的确切内容。看看这个link 您可以使用其他方式自定义配置,例如 @Configuration 请参阅 Boot 的 WebMvcAutoConfiguration 以了解默认设置,然后复制您需要的部分。 此链接也可能对您有所帮助-> LINK

当您想要自定义 bean 时应该怎么做?像往常一样,扩展 WebMvcConfigurerAdapter(使用 @Component 注释新类)并进行自定义。 所以,特定问题的底线:不要在 Spring Boot,只需包含 spring-web 作为 maven/gradle 依赖项和 它将被自动配置。

*** 上的这个答案显示了如何做到这一点.. 检查这个LINK3

【讨论】:

是否有不使用@EnableWebMvc 的选项? 是的。您是否检查了我在答案中添加的最后一个链接。这描述了它。【参考方案2】:

我通过在 application.yml 中添加配置之一轻松解决了问题。

spring.mvc.throw-exception-if-no-handler-found=true
spring.resources.add-mappings=false

spring.mvc.throw-exception-if-no-handler-found=true
spring.mvc.static-path-pattern: /static

如果您不限制 Spring 并且没有处理程序与您的请求匹配,那么 spring 会尝试查找静态内容。

【讨论】:

【参考方案3】:

通常@utkusonmez 的答案可以正常工作,但在我的情况下却不行,因为我使用的是招摇。所以我所做的就是在我的application.properties 文件中添加以下属性

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

现在NoHandlerFoundExceptionswagger-ui 都可以正常工作。

【讨论】:

非常感谢这个答案。关于这个主题的许多其他问题都建议使用“静态位置”或完全启用资源映射,但只有“静态路径模式”允许 Swagger 工作而不影响异常处理。 这个答案非常感谢,因为我使用 swagger,它使我们能够在不影响 swagger-ui 的情况下自定义和处理无处理程序异常。

以上是关于NoHandlerFoundException 的自定义异常处理程序在没有 @EnableWebMvc 的情况下不起作用的主要内容,如果未能解决你的问题,请参考以下文章

关于光的反射和折射的例子?

既是3的倍数又是5的倍数都有哪些

一个三位数既是3的倍数,又是5的倍数。这样的三位数最小是啥

数组的创建,及数组的方法

cnn中的步长的目的和重要性是啥

物质的运动