- 后端需要对前端传递过来的数据进行校验,使用 JSR实现
常用的注解
- 在controller 的 入参上添加 @Valid注解
@PostMapping("/add")
public R add(@Valid @RequestBody WaresBrandVo brandVo){
brandService.add(brandVo);
return R.ok(null);
}
- 异常返回的数据和约定格式不一致,所以需要统一处理验证异常情况,在模块内创建一个exception包,里面新建一个类,统一异常类型
/**
* 错误码和错误信息定义
* 错误码规定为5位,前两位为业务字段,后3位为具体错误类型
* 10: 通用
* 001: 参数格式校验错误
* 11: 商品
* 12: 订单
* 13: 购物车
* 14: 物流
*/
public enum BizCodeException {
UNKNOW_EXCEPTION(10000,"系统未知异常"),
VALID_EXCEPTION(10001,"参数格式校验失败");
private Integer code;
private String msg;
BizCodeException(Integer code, String msg) {
this.code = code;
this.msg = msg;
}
public Integer getCode() {
return code;
}
public String getMsg() {
return msg;
}
}
@Slf4j
@RestControllerAdvice(basePackages = "com.zc.eshop.wares.controller")
public class ValidExceptionAdvice {
/**
* 校验参数验证异常
* @param e
* @return
*/
@ExceptionHandler(value = MethodArgumentNotValidException.class)
public R handleValidException(MethodArgumentNotValidException e){
log.error("数据校验出错{},异常类型{}",e.getMessage(),e.getClass());
Map<String, String> collect =
e.getBindingResult().getFieldErrors().stream().collect(Collectors.toMap(FieldError::getField, DefaultMessageSourceResolvable::getDefaultMessage));
return R.error(BizCodeException.VALID_EXCEPTION,collect);
}
/**
* 包裹全部异常
* @param e
* @return
*/
@ExceptionHandler(value = Exception.class)
public R handleException(Exception e){
return R.error(BizCodeException.VALID_EXCEPTION,e.getMessage());
}
}
这样,所有 com.zc.eshop.wares.controller 抛出的MethodArgumentNotValidException异常都会被捕获, 然后按照规定格式返回给前端
- JSR303 分组校验功能。 同一个参数,新增的时候不能要id,修改的时候ID必须填写的情况,假设现在就考虑更新和添加品牌两种情况
创建 AddBrand 和 UpdateBrand 两个接口。在原先参数上添加 写了分组之后必须所有的校验上都写上分组情况
public class WaresBrandVo {
/**
* 主键id
*/
@ApiModelProperty(value = "主键id", name = "id")
@Null(groups = {AddBrand.class},message = "添加品牌Id不能填写")
@NotNull(groups = {UpdateBrand.class},message = "更新品牌缺少id字段")
private Integer id;
/**
* 品牌名称
*/
@ApiModelProperty(value = "品牌名称", name = "name")
@NotBlank(groups = {AddBrand.class, UpdateBrand.class})
private String name;
}
- 修改controller 上的注解
@PostMapping("/add")
public R add(@Validated(value = AddBrand.class) @RequestBody WaresBrandVo brandVo){
brandService.add(brandVo);
return R.ok(null);
}
- 自定义校验。 编写自定义校验注解=》编写自定义校验器=》关联注解和校验器