3)、将自己指定的数据携带出去
出现错误以后,会来到/error请求,会被 BasicErrorController 进行处理
响应出去的数据是由 getErrorAttributes 得到的( AbstractErrorController的方法)
protected MapgetErrorAttributes(HttpServletRequest request, boolean includeStackTrace) { WebRequest webRequest = new ServletWebRequest(request); return this.errorAttributes.getErrorAttributes(webRequest, includeStackTrace);}
3.1、完全来编写一个ErrorController的实现类【或者是编写AbstractErrorController的子类】,放在容器中
3.2、页面上能用的数据,或者是json返回能用的数据都是通过errorAttributes.getErrorAttributes得到
容器中DefaultErrorAttributes.getErrorAttributes();默认进行数据处理的;
public abstract class AbstractErrorController implements ErrorController { private final ErrorAttributes errorAttributes;...}
此时自定义的错误代码中的字段并没有显示
//给容器中加入@Componentpublic class MyErrorAttributes extends DefaultErrorAttributes { @Override public MapgetErrorAttributes(WebRequest webRequest, boolean includeStackTrace) { Map map =super.getErrorAttributes(webRequest,includeStackTrace); map.put("user","user..."); return map; }}
错误页面:
自定义异常的字段
@ControllerAdvicepublic class MyException { @ExceptionHandler(UserException.class) public String userExc(Exception e, HttpServletRequest request){ Map
//给容器中加入@Componentpublic class MyErrorAttributes extends DefaultErrorAttributes { //返回的值map就是页面和json能获取的所有字段 @Override public MapgetErrorAttributes(WebRequest webRequest, boolean includeStackTrace) { Map map =super.getErrorAttributes(webRequest,includeStackTrace); map.put("user","user..."); //自己的异常处理器携带的数据 //0 是request中 //1 是session中 Map exc = (Map ) webRequest.getAttribute("exc", 0); map.put("exc",exc); return map; }}
错误的页面:
status:[[${status}]]
timestamp:[[${timestamp}]]
error:[[${error}]]
message:[[${message}]]
user:[[${user}]]
exc.code:[[${exc.code}]]
exc.message:[[${exc.message}]]