2023年11月29日发(作者:)

SpringBoot】统⼀返回对象和统⼀异常处理

为什么要统⼀异常

Java异常分为uncheckedchecked,对于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 allErrors = dingResult().getAllErrors();

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 failed(String code, String message, HttpStatus httpStatus) {

RestResult result = new RestResult();