SpringBoot实现统一Json格式返回、全局异常和自定义处理

导读:本篇文章讲解 SpringBoot实现统一Json格式返回、全局异常和自定义处理,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

1、统一Json返回

不管系统是正常返回,还是错误返回,为了保证前端能够对返回数据进行统一的处理,实现统一Json返回是很有必要的。

1.1 编写统一响应类

public class ResponseObject {

    /**
     * 信息
     */
    private String msg;

    /**
     * 响应码
     */
    private int code;

    /**
     * 数据
     */
    private Object data;

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

    public int getCode() {
        return code;
    }

    public void setCode(int code) {
        this.code = code;
    }

    public Object getData() {
        return data;
    }

    public void setData(Object data) {
        this.data = data;
    }

    // 返回数据
    public static ResponseObject success(Object object) {
        ResponseObject responseObject = new ResponseObject();
        responseObject.setData(object);
        responseObject.setCode(200);
        responseObject.setMsg("操作成功");
        return responseObject;
    }

    // 返回信息
    public static ResponseObject success(String msg) {
        ResponseObject responseObject = new ResponseObject();
        responseObject.setData(true);
        responseObject.setCode(200);
        responseObject.setMsg(msg);
        return responseObject;
    }
    // 直接返回
    public static ResponseObject success() {
        ResponseObject responseObject = new ResponseObject();
        responseObject.setData(true);
        responseObject.setCode(200);
        responseObject.setMsg("操作成功");
        return responseObject;
    }

    // 自定义返回数据和信息
    public static ResponseObject success(Object object, String msg) {
        ResponseObject responseObject = new ResponseObject();
        responseObject.setData(object);
        responseObject.setCode(200);
        responseObject.setMsg(msg);
        return responseObject;
    }

    // 自定义返回数据和内容
    public static ResponseObject fail(Object data, String msg) {
        ResponseObject responseObject = new ResponseObject();
        responseObject.setData(data);
        responseObject.setCode(500);
        responseObject.setMsg(msg);
        return responseObject;
    }

    // 自定义返回信息
    public static ResponseObject fail(String msg) {
        ResponseObject responseObject = new ResponseObject();
        responseObject.setData(false);
        responseObject.setCode(400);
        responseObject.setMsg(msg);
        return responseObject;
    }

    // 直接返回
    public static ResponseObject fail() {
        ResponseObject responseObject = new ResponseObject();
        responseObject.setData(false);
        responseObject.setCode(400);
        responseObject.setMsg("操作失败");
        return responseObject;
    }

    // 自定义返回信息和编码
    public static ResponseObject fail(String msg, int code) {
        ResponseObject responseObject = new ResponseObject();
        responseObject.setData(false);
        responseObject.setCode(code);
        responseObject.setMsg(msg);
        return responseObject;
    }
}

2.2 应用

我们在Controller方法的返回时,写成统一的ResponseObject类,如下:

  • 带数据的返回

    代码:

    @RestController
    @RequestMapping
    public class Controller {
    	/**
        * 带数据的返回
        *
        * @return
        */
       @GetMapping("/true")
       public ResponseObject returnTrue() {
           // 定义返回的数据,比如是一个List
           List<String> list = new ArrayList<>();
           list.add("1");
           list.add("2");
           list.add("3");
           return ResponseObject.success(list);
       }
    }
    

    效果:
    在这里插入图片描述

  • 直接返回操作成功

    代码:

    @RestController
    @RequestMapping
    public class Controller {
    
       /**
        * 直接返回操作成功
        *
        * @return
        */
       @GetMapping("/true2")
       public ResponseObject returnTrue2() {
           // 如果不需要什么数据返回,只是提示`操作成功`,比如:新增数据,则直接使用`success()`即可
           return ResponseObject.success();
       }
    }
    

    效果:
    在这里插入图片描述

2、全局异常处理

当系统出现异常后,返回的信息可读性较差,不管是开发人员还是用户不能很好的知道具体是出现了什么错误,通过全局异常处理结合统一Json返回,使得返回的错误信息的格式是一致。

比如:我们没有定义异常处理,出现错误的打印信息如下,可以看到返回内容极其不友好:
在这里插入图片描述

返回让错误信息的具有更好的可读性,我们需要自定义全局异常。

2.1 异常定义

通过RestControllerAdvice注解定义GlobalException类,如下:

@RestControllerAdvice
@Slf4j
public class GlobalException {
    /**
     * 服务异常
     */
    @ResponseStatus(HttpStatus.OK)
    @ExceptionHandler(Exception.class)
    public ResponseObject handlerException(Exception e) {
		log.error(e.getMessage());
        return ResponseObject.fail("服务器出错!");
    }
}

2.2 异常测试

Controller:

    /**
     * 错误返回演示
     *
     * @return
     */
    @GetMapping("/false")
    public ResponseObject returnFalse() {

        // 模拟出现异常
        int a = 1 / 0;

        return ResponseObject.success();
    }

在定义全局异常处理后,再次调用错误接口可以看到返回比较清晰的错误。
在这里插入图片描述

3、自定义异常处理

自定义异常处理的意义在于,可以由开发者自定义返回的错误消息和错误编码,方便前端人员根据错误编译做一些自定义的处理,比如:如果返回403编码,则调整到登录页面。

3.1 自定义异常类

自定义异常类ServiceException集成RuntimeException,代码如下:

public class ServiceException extends RuntimeException {
    private Integer code;
    private String message;
    
    public ServiceException(int code, String state) {
        this.code = code;
        this.message = state;
    }

    public ServiceException(String state) {
        this.code = 400;
        this.message = state;
    }

    @Override
    public String getMessage() {
        return message;
    }

    public Integer getCode() {
        return code;
    }

    public void setCode(Integer code) {
        this.code = code;
    }
}

3.2 配置GlobalException

将自定义的ServiceException配置到GlobalException中,代码如下:

@RestControllerAdvice
@Slf4j
public class GlobalException {
    /**
     * 服务异常
     */
    @ResponseStatus(HttpStatus.OK)
    @ExceptionHandler(Exception.class)
    public ResponseObject handlerException(Exception e) {
        log.error(e.getMessage());
        return ResponseObject.fail("服务器出错!");
    }


    /**
     * 自定义异常
     *
     * @param e
     * @return
     */
    @ResponseStatus(HttpStatus.OK)
    @ExceptionHandler(ServiceException.class)
    public ResponseObject handleException(ServiceException e) {
        log.error(e.getMessage());
        return ResponseObject.fail(e.getMessage(), e.getCode());
    }
}

过程:

当代码中通过throw抛出自定义异常时,会进入到GlobalException类的@ExceptionHandler注解修饰的handleException()方法中。

3.3 测试

Controller中使用ServiceException抛出自定义异常,如下:

@RestController
@RequestMapping
public class Controller {

    /**
     * 错误返回演示
     *
     * @return
     */
    @GetMapping("/false")
    public ResponseObject returnFalse() {

        // 模拟异常处出现
        String name = null;
        if (name == null) {
            throw new ServiceException("名称不能为空");
        }
        return ResponseObject.success();
    }
}

效果:
在这里插入图片描述

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之家整理,本文链接:https://www.bmabk.com/index.php/post/18081.html

(0)
小半的头像小半

相关推荐

极客之家——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!