定制错误处理界面&数据

文章介绍了如何在SpringBoot中定制错误页面和错误的JSON数据。通过创建自定义异常和异常处理器,可以返回特定的错误信息。当结合使用/error请求和自定义ErrorAttributes时,可以实现对浏览器和客户端的自适应响应。
摘要由CSDN通过智能技术生成

定制错误处理界面&数据

1、定制错误页面(浏览器请求返回错误页面)

  • templates文件夹下新建error文件夹(使用模板引擎)

  • 新建4XX.html和5XX.html文件

  • 页面能获取到的信息:

    timestamp:时间戳

    status:状态码

    error:错误提示

    exception:异常对象

    message:异常消息

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

    <h1>status:[[${status}]]</h1>			//显示错误状态码
    <h2>timestamp:[[${timestamp}]]</h2>		//显示错误时间戳
    <h2>error:[[${error}]]</h2>
    

2、定制错误的json数据

2.1、自定义异常处理&返回定制json数据

SpringBoot2.0版本以上配置自定义异常需要在配置文件中配置:server.error.include-exception=true

2.1.1、通过异常机制定制错误返回数据(客户端、浏览器全部返回json数据,不会自适应)

新建自定义xx异常

public class UserNotExistException extends RuntimeException {
	public UserNotExistException() {
        super("用户不存在");
    }
}

新建自定义异常处理器

//@ControllerAdvice: 要成为异常处理器需要添加此注解
public class MyExceptionHadnler {
    @ResponseBody
    //@ExceptionHandler(xx.class)表明需要处理的xx异常
    @ExceptionHandler(UserNotExistException.class)
    //参数Exception e 获取到异常处理信息
    public  Map<String,Object> handleException(Exception e){
        Map<String,Object> map = new HashMap<>();
        map.put("massage",e.getMessage());
        map.put("自定义异常信息","====**====");
        return map;
    }
}

访问效果(没有自适应效果)

浏览器:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-m96CSk6r-1690591955220)(C:\Users\10149\AppData\Roaming\Typora\typora-user-images\image-20200324112455320.png)]

客户端:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3CjPzemR-1690591955221)(C:\Users\10149\AppData\Roaming\Typora\typora-user-images\image-20200324112427984.png)]

2.1.2、通过转发到"/error"请求(能自适应浏览器和客户端)

不默认返回json数据而是转发到"/error"请求

SpringBoot默认对/error请求进行自适应(详情见《SpringBoot错误处理机制原理》)

新建自定义xx异常:

public class UserNotExistException extends RuntimeException {
	public UserNotExistException() {
        super("用户不存在");
    }
}

新建自定义异常处理器:

@ControllerAdvice
public class MyExceptionHadnler {
    @ExceptionHandler(UserNotExistException.class)
    public String handleException(Exception e, HttpServletRequest request) {
        Map<String, Object> map = new HashMap<>();
        /*
        *Integer statusCode = (Integer) request
        *.getAttribute(javax.servlet.error.status_code)
        **/
        //需要传入错误的状态码
        request.setAttribute("javax.servlet.error.status_code",500);
        map.put("code", "====**====");
        map.put("massage", "SSSS");

        //将自定义错误信息数据放在请求域中
        request.setAttribute("ext",map);
        //转发到/error请求
        return "forward:/error";
    }
}

将我们定制的数据携带出去:自定义ErrorAttributes

新建MyErrorAttributes(获取错误属性)类

//给容器中加入我们自己定义的错误属性
@Component
public class MyErrorAttributes extends DefaultErrorAttributes { 
    @Override
    public Map<String, Object> getErrorAttributes(WebRequest webRequest, boolean includeStackTrace) {
        Map<String, Object> map = super.getErrorAttributes(webRequest, includeStackTrace);
        //添加自定义错误信息
        map.put("Mr_W", "111");

        /*
        * 接收上面我们自定义异常处理器携带的数据
        * 0:代表从请求域中获取数据,1:代表从session域中获取数据
        * */
        Map<String,Object> ext = (Map<String, Object>) webRequest.getAttribute("ext", 0);
        map.put("ext",ext);
        //返回的map就是页面和json能获取的所有字段
        return map;
    }
}

前端获使用thymeleaf取数据

<h1>status:[[${status}]]</h1>
<h2>timestamp:[[${timestamp}]]</h2>
<h2>exception:[[${exception}]]</h2>
<h2>message:[[${message}]]</h2>
<h2>ext:[[${ext.code}]]</h2>
<h2>ext:[[${ext.massage}]]</h2>

访问效果:

浏览器

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GHloOZxq-1690591955221)(C:\Users\10149\AppData\Roaming\Typora\typora-user-images\image-20200324130341569.png)]

客户端

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mEZwZyuV-1690591955222)(C:\Users\10149\AppData\Roaming\Typora\typora-user-images\image-20200324130419192.png)]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值