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

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

目录

  • 1、统一Json返回
    • 1.1 编写统一响应类
    • 2.2 应用
  • 2、全局异常处理
    • 2.1 异常定义
    • 2.2 异常测试
  • 3、自定义异常处理
    • 3.1 自定义异常类
    • 3.2 配置GlobalException
    • 3.3 测试

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

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

  • 直接返回操作成功

    代码:

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

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

2、全局异常处理

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

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

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

2.1 异常定义

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

@RestControllerAdvice@Slf4jpublic 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@Slf4jpublic 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@RequestMappingpublic class Controller {    /**     * 错误返回演示     *     * @return     */    @GetMapping("/false")    public ResponseObject returnFalse() { // 模拟异常处出现 String name = null; if (name == null) {     throw new ServiceException("名称不能为空"); } return ResponseObject.success();    }}

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