如何通过在 Spring MVC 中返回自定义错误页面来全局处理 404 异常?
Posted
技术标签:
【中文标题】如何通过在 Spring MVC 中返回自定义错误页面来全局处理 404 异常?【英文标题】:How to globally handle 404 exception by returning a customized error page in Spring MVC? 【发布时间】:2015-06-23 17:54:52 【问题描述】:我需要返回自定义的 HTTP 404 错误页面,但代码不起作用。我已经阅读了堆栈流1、2、3 和不同的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";
【问题讨论】:
【参考方案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>
【讨论】:
谢谢,但是这个页面不能自定义,我需要向后端发送一个请求,根据每个请求发送一个自定义的错误页面。以上是关于如何通过在 Spring MVC 中返回自定义错误页面来全局处理 404 异常?的主要内容,如果未能解决你的问题,请参考以下文章
Spring MVC灵活控制返回json的值(自定义过滤字段)
spring mvc中,RestController如何自定义返回的HTTP状态
Spring MVC for Rest 服务如何在 Jackson 反序列化错误时自定义错误“消息”?
Spring MVC 自定义标签如何使用@Autowired自动装配注解