当响应的状态码被设置为错误状态码,并且响应体中没有内容时,Servlet容器通常会渲染一个HTML错误页。若需要定制容器默认提供的错误页,你可以在web.xml 中定义一个错误页面<error-page> 元素。在Servlet 3规范出来之前,该错误页元素必须被显式指定映射到一个具体的错误码或一个异常类型。从Servlet 3开始,错误页不再需要映射到其他信息了,这意味着,你指定的位置就是对Servlet容器默认错误页的自定制了。
<error-page>
<location>/error</location>
</error-page>
这里错误页的位置所在可以是一个JSP页面,或者其他的一些URL,只要它指定容器里任意一个@Controller 控制器下的处理器方法:
写回HttpServletResponse 的错误信息和错误状态码可以在控制器中通过请求属性来获取:
@Controller
public class ErrorController {
@RequestMapping(path = "/error", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
@ResponseBody
public Map<String, Object> handle(HttpServletRequest request) {
Map<String, Object> map = new HashMap<String, Object>();
map.put("status", request.getAttribute("javax.servlet.error.status_code"));
map.put("reason", request.getAttribute("javax.servlet.error.message"));
return map;
}
}
或者在JSP中这么使用:
<%@ page contentType="application/json" pageEncoding="UTF-8"%>
{
status:<%=request.getAttribute("javax.servlet.error.status_code") %>,
reason:<%=request.getAttribute("javax.servlet.error.message") %>
}
注意
1、在控制器处理中去掉produces = MediaType.APPLICATION_JSON_UTF8_VALUE 会出现错误
to { [/error]}: There is already 'errorController' bean method
在application.properties 文件中修改server.error.path 的值
如:server.error.path = /errorOther
2、此时404还是会返回默认页面,只需要设置server.error.whitelabel.enable = false 就行了
参考: Spring MVC 4.2.4.RELEASE 中文文档
|