其中包含系统中可能出现的异常信息。根据系统的情况,为异常编号,例如12开头的是采购服务的异常、10是通用异常等。
public enum BizCodeEnum {
NON_PURCHASE_REQUEST(12001,"采购需求为空"),
NON_PURCHASE_ORDER(12002,"采购单非法"),
PRODUCT_UP_EXCEPTION(11000,"商品上架异常"),
VALIDATE_EXCEPTION(10001,"数据校验错误"),
UNKNOWN_EXCEPTION(10000,"未知异常");
private int code;
private String message;
BizCodeEnum(int code, String message) {
this.code = code;
this.message = message;
}
public int getCode() {
return code;
}
public String getMessage() {
return message;
}
}
其中包含一个成员变量 BizCodeEnum bizCodeEnum
@Data
public class CustomException extends RuntimeException {
private static final long serialVersionUID = 1L;
private BizCodeEnum bizCodeEnum;
public CustomException(BizCodeEnum bizCodeEnum) {
this.bizCodeEnum = bizCodeEnum;
}
}
每个系统中一般都会有这样一个类,在该类中添加一个方法,参数为接受一个上面定义的 BizCodeEnum codeEnum
。目的是将错误信息封装到返回类中。
//本例是人人开源项目中的全局返回类R
public class R extends HashMap<String, Object> {
private static final long serialVersionUID = 1L;
public R() {
put("code", 0);
put("msg", "success");
}
public static R error(BizCodeEnum codeEnum) {
R r = new R();
r.put("code", codeEnum.getCode());
r.put("msg", codeEnum.getMessage());
return r;
}
//其他的省略
}
@RestControllerAdvice
@Slf4j
public class GulimallExceptionControllerAdvice {
@ExceptionHandler(CustomException.class)//专门处理上面的自定义异常
public R handleCustomException(CustomException customException){
log.error(customException.getBizCodeEnum().getMessage(),customException);
return R.error(customException.getBizCodeEnum());
}
}
当某个代码片段中可能出现某个错误时,只需要在 BizCodeEnum
中定义好异常code和错误信息,在可能出现的异常的代码片段中new一个 CustomException
异常,并传入一个 BizCodeEnum
,throw抛出去,客户端即可正确看到异常信息,日志中也会打印该异常信息。
if(xxx){
throw new CustumeException(BizCodeEnum.NON_PURCHASE_ORDER);
}
对于已知异常也可以在 ControllerAdvice
中直接处理,例如 JSR303
字段校验异常处理,只需要在 ControllerAdvice
添加如下代码:
@ExceptionHandler(MethodArgumentNotValidException.class)
public R handleValidException(MethodArgumentNotValidException e){
log.error(BizCodeEnum.VALIDATE_EXCEPTION.getMessage(),e);
BindingResult bindingResult = e.getBindingResult();
Map<String, String> errorFieldMap = new HashMap<>();
bindingResult.getFieldErrors().forEach(fieldError -> {
String field = fieldError.getField();
String defaultMessage = fieldError.getDefaultMessage();
errorFieldMap.put(field,defaultMessage);
});
return R.error(BizCodeEnum.VALIDATE_EXCEPTION).put("data",errorFieldMap);
}