【问题标题】:How to globally handle 404 exception by returning a customized error page in Spring MVC?如何通过在 Spring MVC 中返回自定义错误页面来全局处理 404 异常?
【发布时间】:2015-06-23 17:54:52
【问题描述】:

我需要返回自定义的 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";
    }
}

【问题讨论】:

    标签: spring spring-mvc exception-handling


    【解决方案1】:

    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";
    }
    

    【讨论】:

    • 谢谢,我正在使用注释我应该在哪里有那行?
    • @Jack 是否在 web.XML 中配置了 DispatcherServlet?
    • 是的,它是在 web.xml 中配置的
    • 那你只需要进行我在回答中提到的XML更改即可。
    【解决方案2】:

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

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

    【讨论】:

    • 谢谢,但问题是我应该为每种类型的 httpstatus 设置单独的类。
    • 抱歉,不确定该问题
    【解决方案3】:

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

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

    【讨论】:

    • 谢谢,但是这个页面不能自定义,我需要向后端发送一个请求,根据每个请求发送一个自定义的错误页面。
    猜你喜欢
    • 2014-01-30
    • 1970-01-01
    • 2014-04-05
    • 2016-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-19
    • 2018-02-03
    相关资源
    最近更新 更多