注 BasicErrorController
可以作为自定义ErrorController
的基类,如果你想添加对新context type的处理(默认处理text/html
),这会很有帮助。你只需要继承BasicErrorController
,添加一个public方法,并注解带有produces
属性的,然后创建该新类型的bean。
你也可以定义一个@ControllerAdvice
去自定义某个特殊controller或exception类型的JSON文档:
在以上示例中,如果跟FooController
相同package的某个controller抛出YourException
,一个CustomerErrorType
类型的POJO的json展示将代替ErrorAttributes
展示。
自定义错误页面
例如,映射404
到一个静态HTML文件,你的目录结构可能如下:
src/
+- main/
+- java/
+- resources/
+- public/
+- error/
| +- 404.html
使用FreeMarker模板映射所有5xx
错误,你需要如下的目录结构:
对于更复杂的映射,你可以添加实现ErrorViewResolver
接口的beans:
public class MyErrorViewResolver implements ErrorViewResolver {
@Override
public ModelAndView resolveErrorView(HttpServletRequest request,
HttpStatus status, Map<String, Object> model) {
// Use the request or status to optionally return a ModelAndView
return ...
}
}
你也可以使用Spring MVC特性,比如和@ControllerAdvice,ErrorController
将处理所有未处理的异常。
对于不使用Spring MVC的应用,你可以通过接口直接注册ErrorPages
。该抽象直接工作于底层内嵌servlet容器,即使你没有Spring MVC的DispatcherServlet
,它们仍旧可以工作。
注.如果你注册一个ErrorPage
,该页面需要被一个Filter
处理(在一些非Spring web框架中很常见,比如Jersey,Wicket),那么该Filter
需要明确注册为一个ERROR
分发器(dispatcher),例如:
@Bean
public FilterRegistrationBean myFilter() {
FilterRegistrationBean registration = new FilterRegistrationBean();
registration.setFilter(new MyFilter());
...
registration.setDispatcherTypes(EnumSet.allOf(DispatcherType.class));
return registration;
(默认的FilterRegistrationBean
不包含ERROR
dispatcher类型)。
WebSphere应用服务器的错误处理