JSR303 和ControllerAdviec + ExceptionHandler 实现全局异常处理
全局异常处理器类:
@RestControllerAdvice(basePackages="com.atguigu.gulimall.product.controller")
public class GulimallExceptionControllerAdvice {
@ExceptionHandler(value = MethodArgumentNotValidException.class)
public R handleVaildException(MethodArgumentNotValidException e){
log.error("数据校验错误:{},异常类型:{}",e.getMessage(),e.getClass());
BindingResult bindingResult = e.getBindingResult();
Map<String, String> errorResMap = new HashMap<>(2);
bindingResult.getFieldErrors().forEach((item)->{
errorResMap.put(item.getField(),item.getDefaultMessage());
});
return R.error(BizCodeEnume.VAILD_EXCEPTION.getCode(),BizCodeEnume.VAILD_EXCEPTION.getMsg()).put("Error",errorResMap);
}
@ExceptionHandler(value = Throwable.class)
public R handleVaildException(Throwable throwable){
return R.error(BizCodeEnume.UNKNOW_EXCEPTION.getCode(),BizCodeEnume.UNKNOW_EXCEPTION.getMsg());
}
异常枚举类
public enum BizCodeEnume {
UNKNOW_EXCEPTION(10000,"系统未知异常"),
VAILD_EXCEPTION(10001,"参数格式校验异常");
private int code;
private String msg;
BizCodeEnume(int code,String msg){
this.code =code;
this.msg = msg;
}
public int getCode() {
return code;
}
public String getMsg() {
return msg;
}
}
校验使用 @Valid 规范提供 没有分组校验功能 或者@Valided spring提供 可以实现分组校验 配合分组接口
如
@NotNull(message ="品牌id不能为空",gorup="com.atguigu.valid.AddGroup.class")
@TableId
private Long brandId;
public interface AddGroup{
}