一尘不染

Spring ControllerAdvice中未处理404异常

spring-boot

我有一个简单的Spring MVC应用程序,其中我想使用处理所有未映射的url @ControllerAdvice。这是控制器:

@ControllerAdvice
public class ExceptionHandlerController {
    @ResponseStatus(HttpStatus.NOT_FOUND)
    @ExceptionHandler(NoHandlerFoundException.class)
    public String handle404() {
        return "exceptions/404page";
    }
}

尽管如此,每次都会获得Whitelabel错误页面。

我尝试使用RuntimeException.classHttpStatus.BAD_REQUEST并扩展了类NoHandlerFoundException但没有用。

有什么建议么?


阅读 776

收藏
2020-05-30

共1个答案

一尘不染

要使其工作,您需要throwExceptionIfNoHandlerFound在DispecherServlet 上设置属性。您可以执行以下操作:

spring.mvc.throwExceptionIfNoHandlerFound=true

application.properties文件中,否则请求将始终转发到默认servlet,并且将引发NoHandlerFoundException。

问题是,即使使用此配置,它也不起作用。从文档中:

请注意,如果使用org.springframework.web.servlet.resource.DefaultServletHttpRequestHandler,则请求将始终转发到默认servlet,并且在这种情况下永远不会引发NoHandlerFoundException。

由于默认情况下Spring
Boot使用,因此org.springframework.web.servlet.resource.DefaultServletHttpRequestHandler您必须使用自己的方法覆盖它WebMvcConfigurer

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@EnableWebMvc
@Configuration
public class WebConfig implements WebMvcConfigurer {
    @Override
    public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
        // Do nothing instead of configurer.enable();
    }
}

当然,上述情况在您的情况下可能会更复杂。

2020-05-30