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*
现在NoHandlerFoundException
和swagger-ui
都可以正常工作。
【讨论】:
非常感谢这个答案。关于这个主题的许多其他问题都建议使用“静态位置”或完全启用资源映射,但只有“静态路径模式”允许 Swagger 工作而不影响异常处理。 这个答案非常感谢,因为我使用 swagger,它使我们能够在不影响 swagger-ui 的情况下自定义和处理无处理程序异常。以上是关于NoHandlerFoundException 的自定义异常处理程序在没有 @EnableWebMvc 的情况下不起作用的主要内容,如果未能解决你的问题,请参考以下文章