1、基本校验实现
- springboot2.3.0以上需要手动引入依赖,引入到common中
<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-validation --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-validation</artifactId> <version>2.3.2.RELEASE</version> </dependency>
- 在需要校验的方法上添加
@Valid
注解,并返回提示信息 - 给校验的bean后紧跟着一个BindingResult,就可以获取到校验的结果
@RequestMapping("/save") //@RequiresPermissions("product:brand:save") public R save(@Valid @RequestBody BrandEntity brand, BindingResult result){ if (result.hasErrors()){ Map<String, String> map = new HashMap<>(); //1、获取校验的结果 result.getFieldErrors().forEach((item)->{ //获取到错误提示 String message = item.getDefaultMessage(); //获取到错误属性的名字 String field = item.getField(); map.put(field, message); }); return R.error().put("data", map); }else{ brandService.save(brand); } return R.ok(); }
测试结果:
-
2、统一异常处理
-
为了定义这些错误状态码,我们可以单独定义一个常量类,用来存储这些错误状态码。
在common中新建
BizCodeEnume
用来存储状态码/*** * 错误码和错误信息定义类 * 1. 错误码定义规则为5为数字 * 2. 前两位表示业务场景,最后三位表示错误码。例如:100001。10:通用 001:系统未知异常 * 3. 维护错误码后需要维护错误描述,将他们定义为枚举形式 * 错误码列表: * 10: 通用 * 001:参数格式校验 * 11: 商品 * 12: 订单 * 13: 购物车 * 14: 物流 */ public enum BizCodeEnum { UNKNOW_EXEPTION(10000,"系统未知异常"), VALID_EXCEPTION( 10001,"参数格式校验失败"); private int code; private String msg; BizCodeEnum(int code, String msg) { this.code = code; this.msg = msg; } public int getCode() { return code; } public String getMsg() { return msg; } }
-
在product里面新建类
GulimallExceptionControllerAdvice
,用来集中处理所有异常
@RestControllerAdvice(basePackages = "com.boning.gulimall.product.controller")
public class GulimallExceptionControllerAdvice {
// 处理数据校验异常
@ExceptionHandler(value = MethodArgumentNotValidException.class)
public R handleVaildException(MethodArgumentNotValidException e){
BindingResult bindingResult = e.getBindingResult();
Map<String, String> errorMap = new HashMap<>();
bindingResult.getFieldErrors().forEach((fieldError)->{
errorMap.put(fieldError.getField(), fieldError.getDefaultMessage());
});
return R.error(BizCodeEnume.VALID_EXCEPTION.getCode(),BizCodeEnume.VALID_EXCEPTION.getMsg()).put("data", errorMap);
}
//处理全局异常
@ExceptionHandler(value = Throwable.class)
public R handleException(Throwable throwable){
return R.error(BizCodeEnume.UNKNOW_EXEPTION.getCode(), BizCodeEnume.UNKNOW_EXEPTION.getMsg());
}
}
测试集结果