Spring boot定制错误json数据

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/nangeali/article/details/82597958

定制错误json数据

客户端访问
如果,程序出错了
返回的json数据,需要定制的

定制错误页面
在模板文件夹、或者静态资源文件夹下
放置一个error文件夹,里面存放错误状态码对应的页面

这些页面,就是错误页面
在错误页面,可以获取相关的错误信息

自定义异常

UserNotExistException
为了使异常抛出,继承运行时异常
写一个无参的构造器,调用super,传递一个message

package com.atguigu.springboot.exception;

public class UserNotExistException extends RuntimeException {

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

Controller

根据指定用户,抛出自定义的异常

@ResponseBody
@RequestMapping("/hello")
public  String hello(@RequestParam("user") String user){
    if(user.equals("aaa")){
        throw new UserNotExistException();
    }
    return "Hello World";
}

定义错误页面

<main role="main" class="col-md-9 ml-sm-auto col-lg-10 pt-3 px-4">
    <h1>status:[[${status}]]</h1>
    <h2>timestamp:[[${timestamp}]]</h2>
    <h2>exception:[[${exception}]]</h2>
    <h2>message:[[${message}]]</h2>
</main>

浏览器访问
这里写图片描述

自定义异常处理器

MyExceptionHandler
专门用来处理异常,需要添加@ControllerAdvice注解

处理什么异常,需要添加@ExceptionHandler注解
参数,直接写Exception,表示处理所有异常

@ControllerAdvice
public class MyExceptionHandler {

    //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;
    }

}

客户端访问
返回自定义,错误json数据
这里写图片描述
访问页面
也是返回自定义,错误json数据

缺点

没有自适应效果
浏览器,客户端返回的都是json数据

ErrorMvcAutoConfiguration

错误自动配置
这里写图片描述
BasicErrorController
处理/error请求

/error请求是自定义的
浏览器,返回页面
客户端,返回json数据
这里写图片描述

MyExceptionHandler

修改自定义异常处理器
转发到/error请求

@ControllerAdvice
public class MyExceptionHandler {

    //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;
//    }

    @ExceptionHandler(UserNotExistException.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
        return "forward:/error";
    }
}

注意

需要传入,异常的错误状态码
不传的话,默认状态码为200
跳转到默认页面

存在问题
定制的错误数据,无法携带出去

猜你喜欢

转载自blog.csdn.net/nangeali/article/details/82597958