_039_SpringBoot_定制错误响应

1  定制错误的页面

     (1) 有模板引擎的情况下:error/状态码。

【将错误页面命名为 :错误状态码.html 放在模板引擎文件夹里面的error文件夹下】,发生此状态码的错误就会来到 对应的页面;
我们可以使用4xx和5xx作为错误页面的文件名来匹配这种类型的所有错误,精确优先(优先寻找精确的状态码.html);
页面能获取的信息:

      timestamp:时间戳;
      status:状态码;
      error:错误提示;
      exception:异常对象;
      message:异常消息;
      errors:JSR303数据校验的错误都在这里;

       (2)没有模板引擎(或者模板引擎找不到这个错误页面):在静态资源文件夹下找。

       (3)在以上两种情况下都没有找到错误页面,就默认跳转到SpringBoot默认的错误提示页面。

2  定制json数据

(1)自定义异常处理&返回定制json数据

@ControllerAdvice
public class MyExceptionHandler {
    @ResponseBody
    @ExceptionHandler(UserNotExistException.class)
    public Map handleException(Exception e){
        Map map = new HashMap<>();
        map.put("code","user.notexist");
        map.put("message",e.getMessage());
        return map;
    }
}
//没有自适应效果...

(2)转发到/error进行自适应响应效果处理

@ExceptionHandler(UserNotExistException.class)
    public String handleException(Exception e, HttpServletRequest request){
        Map map = new HashMap<>();
        //传入我们自己的错误状态码  4xx 5xx,否则就不会进入定制错误页面的解析流程
        /**
         * Integer statusCode = (Integer) request
         .getAttribute("javax.servlet.error.status_code");
         */
        request.setAttribute("javax.servlet.error.status_code",500);
        map.put("code","user.notexist");
        map.put("message",e.getMessage());
        //转发到/error
        return "forward:/error";
    }

(3)将我们的定制数据携带出去

            出现错误以后,会来到/error请求,会被BasicErrorController处理,响应出去可以获取的数据是由
getErrorAttributes得到的(是AbstractErrorController(ErrorController)规定的方法)。
             a   完全来编写一个ErrorController的实现类【或者是编写AbstractErrorController的子类】,放在容器中;
             b  页面上能用的数据,或者是json返回能用的数据都是通过errorAttributes.getErrorAttributes得到;

            采用b方法,容器中DefaultErrorAttributes.getErrorAttributes(),默认进行数据处理的。
            自定义ErrorAttributes,如下:

//给容器中加入我们自己定义的ErrorAttributes
@Component
public class MyErrorAttributes extends DefaultErrorAttributes {
    @Override
    public Map getErrorAttributes(RequestAttributes requestAttributes,
boolean includeStackTrace) {
        Map map = super.getErrorAttributes(requestAttributes,
includeStackTrace);
        map.put("company","atguigu");
        return map;
    }
}

最终的效果:响应是自适应的,可以通过定制ErrorAttributes改变需要返回的内容,

_039_SpringBoot_定制错误响应_第1张图片

你可能感兴趣的:(_008_SpirngBoot)