目录
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