@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
中的现有代码应该可以工作并拦截异常
我是运行一个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
中的现有代码应该可以工作并拦截异常