背景:为了减少在控制层重复代码的编写,如异常处理的代码块和返回数据的格式(成功返回什么数据和失败该返回什么数据)
出现异常返回的数据
image正常返回的数据
image统一返回数据格式
/**
* 封装服务端响应到客户端的数据
*/
public class JsonResult {
/**
* 响应状态码
*/
private Integer state=1;
/**
* 状态码对应的信息
*/
private String message;
/**
* 响应的数据
* 这里也可以使用泛型 private T data 在类上也加上
*/
private Object data;
public void setState(Integer state) {
this.state = state;
}
public void setMessage(String message) {
this.message = message;
}
public void setData(Object data) {
this.data = data;
}
public JsonResult() {
}
//要么用set方法来封装数据要么用构造方法
public JsonResult(String message) {
this.message=message;
}
public JsonResult(Object data) {
this.data = data;
}
public JsonResult(Throwable e) {
this.state=0;
this.message=e.getMessage();
}
}
统一的异常处理全局异常捕获
用@RestControllerAdvice加@ExceptionHandler注解来实现
@ExceptionHandler也可以直接放在某个controller里面表示处理这个controller中的这个类型的异常,如果全局和某个controller里都实现同一个异常的处理会优先使用controller里面的
创建一个统一处理异常的类
//拦截全局的异常
@RestControllerAdvice
public class GlobalExceptionHandler {
//用来处理日志的
private static final Logger log = LoggerFactory.getLogger(GlobalExceptionHandler.class);
//用来处理该类型的异常
@ExceptionHandler(ArithmeticException.class)
public JsonResult doHandlerArithmeticException(ArithmeticException e) {
e.printStackTrace();
log.info("exception {}",e.getMessage());
return new JsonResult(e);//封装异常结果
}
}
注意:@RestControllerAdvice只能拦截controller层的异常不会拦截Interceptor的异常
优点:把异常统一处理,减少代码的重复编写,提高了可维护性
缺点:只能处理controller层的异常,对于Interceptor层的异常,spring内部的异常无能为力
使用:
@RestController
public class ArithmeticController {
@RequestMapping("do/{n}/{n1}")
public JsonResult handle01(@PathVariable Integer n, @PathVariable Integer n1) {
Integer res = n/n1;
JsonResult jsonResult = new JsonResult(res);
jsonResult.setMessage("正确"+res);
return jsonResult;
}
}
网友评论