没有@EnableWebMvc,NoHandlerFoundException的自定义异常处理程序不起作用

时间:2018-03-08 06:49:30

标签: java spring-boot

我想将404响应的html错误页面覆盖为JSON响应。当我使用@ControllerAdvice而没有@EnableWebMvc时,它无效。

@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配置。

3 个答案:

答案 0 :(得分: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会尝试查找静态内容。

答案 1 :(得分:1)

这种情况正在发生,因为使用@EnableWebMvc禁用MVC自动配置并要求您提供您想要的内容。看看这个link
您可以使用其他方法自定义配置,例如@Configuration 请参阅Boot的 WebMvcAutoConfiguration 以查找默认设置,并复制所需的部分。

此链接也可能对您有所帮助 - &gt; LINK

  

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

stackoverflow上的这个答案显示了如何执行此操作..请检查此LINK3

答案 2 :(得分:0)

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

application.properties

现在spring.mvc.throw-exception-if-no-handler-found=true spring.mvc.static-path-pattern=/swagger* NoHandlerFoundException都可以正常工作。