我在修改需求时,突然出现了一个问题,我需要优先去存储某条业务数据,否则后面处理会更麻烦,但是存储完要真正做业务时还要走无数的解析,其中有些不符合的可能直接反馈前端,告知这个业务出了哪样的问题,但是这时候就应该把之前存储的某条业务删掉,所以第一步我加了事务,事务加完以后,就考虑怎么反馈异常,如果throw抛出异常,那么返回给前端的信息就不能够抛出,所以搜索信息便有了这篇文章
首先定义下异常类,里面添加要回馈的是什么信息格式
/*
* @Author df
* @Description 自定义异常,可支持:在办理业务需要事务又需要给Pad端反馈提示信息或错误信息
* @Date 14:53 2022/1/14
* @return
**/
public class BusinessException extends RuntimeException {
private Integer code;
private String msg;
public BusinessException(Integer code, String message) {
super(message);
this.code = code;
}
public Integer getCode() {
return code;
}
public void setCode(Integer code) {
this.code = code;
}
}
添加完信息格式后需要考虑,我想要在某些场景下抛出自己定义的异常里能够让事务处理,所以我需要调用BusinessException传输我定义的code码以及msg数据。
SO就需要一个统一处理异常的处理异常类,这个需要在类上面标注@RestControllerAdvice,这个主要是spring提供的用来统一异常处理的。
@ExceptionHandler(value = BusinessException.class)
ExceptionHandler的作用是用来捕获指定的异常。
ResponseEntity<AjaxResult> 这个就可以把自己想要返回的数据格式定义好(AjaxResult),抛出消息后会按照这个(AjaxResult)返回数据格式返回了给前台了。
/*
* @Author df
* @Description 自定义异常处理类,可支持针对不同的异常可以写不同的处理方法
* @Date 14:55 2022/1/14
* @Param
* @return
**/
@RestControllerAdvice
public class RestExceptionHandler {
/**
* 业务异常处理,与AjaxResult.error("二线路高层货架缺少对应网点的尾箱!")此反馈方式一致
*
* @param e
* @return AjaxResult
*/
@ExceptionHandler({BusinessException.class})
public ResponseEntity<AjaxResult> businessExceptionHandler(HttpServletRequest request, BusinessException e) throws BusinessException {
return new ResponseEntity(new AjaxResult(e.getCode(), e.getMessage()), HttpStatus.INTERNAL_SERVER_ERROR);
}
}
使用:
throw new BusinessException(500, "请检查网点编号和网点名称,以及高层货架信息!");
这个就是既能保证事务能够回退处理并且还能够给前端数据的方式,希望可以帮到你!