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(); }}
效果: