如何通过在Spring MVC中返回自定义错误页面来全局处理404异常?

时间:2015-04-17 03:30:30

标签: spring spring-mvc exception-handling

我需要返回HTTP 404的自定义错误页面,但代码不起作用。我已经阅读了堆栈流123和不同的online + articles,但我的情况与那些不同,或者至少我无法想象出了问题。

HTTP Status 404 -

type Status report

message

description The requested resource is not available.

例如,建议在web.xml中使用动作名称来处理异常,它可能有用,但我认为这不是一个很好的方法。

我使用了以下组合:

1)

@Controller   //for class
@ResponseStatus(value = HttpStatus.NOT_FOUND) //for method

2)
 @Controller   //for class
 @ResponseStatus(value = HttpStatus.NOT_FOUND) //for method
 @ExceptionHandler(ResourceNotFoundException.class) //for method

3)

@ControllerAdvice //for class
@ResponseStatus(value = HttpStatus.NOT_FOUND) //for method

3)

@ControllerAdvice //for class
@ResponseStatus(HttpStatus.NOT_FOUND) //for method

4)
 @ControllerAdvice   //for class
 @ResponseStatus(value = HttpStatus.NOT_FOUND) //for method
 @ExceptionHandler(ResourceNotFoundException.class) //for method

代码

@ControllerAdvice
public class GlobalExceptionHandler {
    @ResponseStatus(value = HttpStatus.NOT_FOUND)
    public String handleBadRequest(Exception exception) {
          return "error404";
    }
}

3 个答案:

答案 0 :(得分:2)

如果没有找到处理请求的处理程序,

DispatcherServlet默认情况下不会抛出异常。所以你需要明确地激活它,如下所示:

在web.xml中:

<servlet>
    <servlet-name>mvc-dispatcher</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>throwExceptionIfNoHandlerFound</param-name>
        <param-value>true</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

如果您使用基于注释的配置:

dispatcherServlet.setThrowExceptionIfNoHandlerFound(true);

在控制器建议类中:

@ExceptionHandler
@ResponseStatus(HttpStatus.NOT_FOUND)
public String handleExceptiond(NoHandlerFoundException ex) {
    return "errorPage";
}

答案 1 :(得分:1)

您可以在班级使用@ResponseStatus注释。至少它对我有用。

@Controller
@ResponseStatus(value=HttpStatus.NOT_FOUND)
public class GlobalExceptionHandler {
  ....  
}

答案 2 :(得分:0)

您可以在 web.xml 中添加以下内容,以便在404上显示错误页面。它将在WEB-INF文件夹中的views文件夹中显示 404.jsp 页面

 <error-page>
    <error-code>404</error-code>
    <location>/WEB-INF/views/404.jsp</location>
 </error-page>