码迷,mamicode.com
首页 > 编程语言 > 详细

Spring boot 定制自己的错误

时间:2018-07-15 23:23:36      阅读:315      评论:0      收藏:0      [点我收藏+]

标签:default   def   and   int   编写   分享   obj   src   情况   

1)、如何定制错误的页面;

?   1)、有模板引擎的情况下;error/状态码; 【将错误页面命名为 错误状态码.html 放在模板引擎文件夹里面的 error文件夹下】,发生此状态码的错误就会来到 对应的页面;

? 我们可以使用4xx和5xx作为错误页面的文件名来匹配这种类型的所有错误,精确优先(优先寻找精确的状态码.html);

?   页面能获取的信息;

    ? timestamp:时间戳

?     status:状态码

?     error:错误提示

?     exception:异常对象

?     message:异常消息

?     errors:JSR303数据校验的错误都在这里

? 2)、没有模板引擎(模板引擎找不到这个错误页面),静态资源文件夹下找;

? 3)、以上都没有错误页面,就是默认来到SpringBoot默认的错误提示页面;

 

2)、如何定制错误的json数据;

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

    @ResponseBody
    @ExceptionHandler(UserNotExistException.class)
    public Map<String,Object> handleException(Exception e){
        Map<String,Object> map = new HashMap<>();
        map.put("code","user.notexist");
        map.put("message",e.getMessage());
        return map;
    }

 

 

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

@ControllerAdvice
public class DemoExceptionHandler {

    @ExceptionHandler(DemoException.class)
    public String handleException(Exception e, HttpServletRequest request){
        Map<String,Object> 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","用户出错啦");

        request.setAttribute("ext",map);
        //转发到 /error由我们的BasicError 来处理返回JSON还是页面..
        return "forward:/error";
    }

}

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

出现错误以后,会来到/error请求,会被BasicErrorController处理,响应出去可以获取的数据是由getErrorAttributes得到的(是AbstractErrorController(ErrorController)规定的方法);

? 1、完全来编写一个ErrorController的实现类【或者是编写AbstractErrorController的子类】,放在容器中;

? 2、页面上能用的数据,或者是json返回能用的数据都是通过errorAttributes.getErrorAttributes得到;

? 容器中DefaultErrorAttributes.getErrorAttributes();默认进行数据处理的;

自定义ErrorAttributes
//定义自己的错误消息
@Component
public class MyErrorAttributes extends DefaultErrorAttributes {

    @Override
    public Map<String, Object> getErrorAttributes(RequestAttributes requestAttributes, boolean includeStackTrace) {
        Map<String, Object> map = super.getErrorAttributes(requestAttributes, includeStackTrace);
        map.put("company", "hh");

    //我们的异常处理器携带的数据 requestAttributes为请求域中取数据
    Map<String,Object> ext = (Map<String, Object>) requestAttributes.getAttribute("ext", 0);
    map.put("ext",ext);
    return map; }
}

 

原因: 如下图,我们放入ErrorAttributes 就会加入数据并返回

技术分享图片

 

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

Spring boot 定制自己的错误

标签:default   def   and   int   编写   分享   obj   src   情况   

原文地址:https://www.cnblogs.com/eason-d/p/9315207.html

(1)
(1)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!