2023年11月29日发(作者:)
【SpringBoot】统⼀返回对象和统⼀异常处理
为什么要统⼀异常
Java异常分为unchecked和checked,对于unchecked的那些异常⼀般都是代码写的有问题,⽐如你没有处理null对象,直接就⽤这个对象的⽅法或者属性了
(NullPointException),或者是除0(ArithmeticException),或者是数组下标越界了(ArrayIndexOutOfBoundsException),这种的你要是能意识到try或者throw,那肯定不可能写
错了。
但是对于checked,就是java要求我们处理的异常了,⽐如说SQLException , IOException,ClassNotFoundException,如果我们不做统⼀处理,那前端收到的会是⼀坨异常调⽤
栈,⾮常恐怖,⽽且花样繁多,⽐如hibernate-validator的异常栈....
还有就是业务异常,这种的都是⾃定义的异常,⼀般都是基于RuntimeException改的。
所以,为了把这些乱七⼋糟的都统⼀起来,按照与前端约定好的格式返回,统⼀异常⾮常有必要。
为什么要统⼀返回值
不统⼀的话,返回值会五花⼋门,对于前端来说⽆法做⼀些统⼀处理,⽐如说统⼀通过状态为快速判断接⼝调⽤情况,接⼝调⽤失败原因获取每个接⼝都要⾃定义⼀个。
如果统⼀了,则前端可以写⼀个调⽤回调解析⽅法,就能快速获取接⼝调⽤情况了,⼗分便捷。如下代码:
{
"state": false,
"code": "-1",
"data": "数据库中未查询到该学⽣",
"timestamp": 164
}
前端可以通过code直接判断接⼝调⽤情况,通过data获取异常信息,或者是需要查询的数据。
如何实现统⼀异常
Spring为我们提供了⼀个注解:@ControllerAdvice
@ControllerAdvice
@Slf4j
public class GlobalExceptionHandler {
/**
* 处理⾃定义的业务异常
* @param e
* @return
*/
@ExceptionHandler(value = )
@ResponseBody
public ResponseEntity businessExceptionHandler(BusinessException e){
("发⽣业务异常!原因是:{}",sage());
return (sage());
}
}
我们只需要在@ExceptionHandler这⾥写上想拦截处理的异常,就可以了,在该⽅法中,你可以把关于这个异常的信息获取出来⾃由拼接,然后通过统⼀返回格式返回给前端,
⽅便前端处理展⽰。
如Hibernate-validator报的异常⾮常恐怖,中间叠了好⼏层:
Validation failed for argument [0] in public tionTestVo lidation(tionTestVo) with 4 errors: [Field error in obj
这种的就算是返给前端,他们也得解半天,这个情况就可以通过统⼀拦截处理:
/**
* 处理参数校验失败异常
* @param e
* @return
*/
@ExceptionHandler(value = )
@ResponseBody
public ResponseEntity exceptionHandler(MethodArgumentNotValidException e){
// 1.校验
Boolean fieldErrorUnobtainable = (e == null || dingResult() == null
|| y(dingResult().getAllErrors()) || dingResult().getAllErrors().get(0) == null);
if (fieldErrorUnobtainable) {
return sful();
}
// 2.错误信息
StringBuilder sb = new StringBuilder();
List
if(!y(allErrors)){
for (Object fieldError_temp:allErrors) {
FieldError fieldError = (FieldError) fieldError_temp;
String objectName = ectName();
String field = ld();
String defaultMessage = aultMessage();
(objectName).append(".").append(field).append(":").append(defaultMessage).append(";");
}
}
//
public BusinessException(String message) {
super(message);
}
public BusinessException(IExceptionCode code, String[] params) {
super(or());
= code;
= params;
}
public IExceptionCode getExCode() {
return ;
}
public static ResponseEntity
RestResult result = new RestResult();


发布评论