@ControllerAdvice 与 ResourceHandler 冲突:Spring 4

@ControllerAdvice conflict with ResourceHandler : Spring 4

我是运行一个Spring 4 web mvc项目:

问题: 我的 404 异常处理程序的 controlleradvice 不工作。但是,如果我在 WebConfig class 中注释 "addResourceHandlers" 方法,它将起作用。 (我无法删除它,因为它解析了我的静态资源)_

这是我的网络配置:

@EnableWebMvc
@Configuration
public class WebConfig extends WebMvcConfigurerAdapter {

    /*
     * Resource handler for static resources
     */
    @Override
    public void addResourceHandlers(final ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/**").addResourceLocations("classpath:/static/");
    }
}

这是我的 404 异常处理程序:

@ControllerAdvice
public class ExceptionController {

    @ExceptionHandler(NoHandlerFoundException.class)
    public String handle404(Exception e)   {
        return "error/404";
    }
}

如果您的网络应用程序正在使用 web.xml,这非常简单 - 只需添加以下内容(假设使用 InternalResourceViewResolver,前缀指向您的 WEB- INF查看文件夹和后缀.jsp)。您也可以有多个其他错误代码的错误页面元素。

<error-page>
    <error-code>404</error-code>
    <location>/error</location>
</error-page>

如果你不使用 web.xml 那就有点复杂了。

如果你想捕获 NoHandlerFound 异常,你首先必须告诉 Spring 通过 setting a flag in the DispatcherServlet directly 抛出它。

为此,在您正在扩展的 class 中 AbstractAnnotationConfigDispatcherServletInitializer 覆盖 onStartup 方法以公开 DispatcherServlet 定义并手动添加所需的标志:

@Override
public void onStartup(ServletContext servletContext) throws ServletException {

    //...
    WebApplicationContext context = getContext();
    DispatcherServlet dispatcherServlet = new DispatcherServlet(context);
    //we did all this to set the below flag
    dispatcherServlet.setThrowExceptionIfNoHandlerFound(true);
    ServletRegistration.Dynamic dispatcher = servletContext.addServlet("DispatcherServlet",dispatcherServlet );
    //..
}

那么 ExceptionController 中的现有代码应该可以工作并拦截异常