BasicErrorController可以作为自定义ErrorController的基类,如果你想添加对新context type的处理(默认处理text/html),这会很有帮助。你只需要继承BasicErrorController,添加一个public方法,并注解带有produces属性的,然后创建该新类型的bean。

    你也可以定义一个@ControllerAdvice去自定义某个特殊controller或exception类型的JSON文档:

    在以上示例中,如果跟FooController相同package的某个controller抛出YourException,一个CustomerErrorType类型的POJO的json展示将代替ErrorAttributes展示。

    自定义错误页面

    例如,映射404到一个静态HTML文件,你的目录结构可能如下:

    1. src/
    2. +- main/
    3. +- java/
    4. +- resources/
    5. +- public/
    6. +- error/
    7. | +- 404.html

    使用FreeMarker模板映射所有5xx错误,你需要如下的目录结构:

    对于更复杂的映射,你可以添加实现ErrorViewResolver接口的beans:

    1. public class MyErrorViewResolver implements ErrorViewResolver {
    2. @Override
    3. public ModelAndView resolveErrorView(HttpServletRequest request,
    4. HttpStatus status, Map<String, Object> model) {
    5. // Use the request or status to optionally return a ModelAndView
    6. return ...
    7. }
    8. }

    你也可以使用Spring MVC特性,比如和@ControllerAdviceErrorController将处理所有未处理的异常。

    对于不使用Spring MVC的应用,你可以通过接口直接注册ErrorPages。该抽象直接工作于底层内嵌servlet容器,即使你没有Spring MVC的DispatcherServlet,它们仍旧可以工作。

    注.如果你注册一个ErrorPage,该页面需要被一个Filter处理(在一些非Spring web框架中很常见,比如Jersey,Wicket),那么该Filter需要明确注册为一个ERROR分发器(dispatcher),例如:

    1. @Bean
    2. public FilterRegistrationBean myFilter() {
    3. FilterRegistrationBean registration = new FilterRegistrationBean();
    4. registration.setFilter(new MyFilter());
    5. ...
    6. registration.setDispatcherTypes(EnumSet.allOf(DispatcherType.class));
    7. return registration;

    (默认的FilterRegistrationBean不包含ERROR dispatcher类型)。

    WebSphere应用服务器的错误处理