开启校验
- 添加依赖:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-validation</artifactId> <version>2.6.6</version> </dependency>
- 在实体类的字段上添加注解
如:
@NotEmpty
@NotBlank
@URL(message = "logo必须是一个合法的url地址")
自定义校验格式就用@Pattern
@Pattern(regexp = "/^[a-zA-Z]$/", message = "检索首字母必须是一个字母")
@Min(value = 0, message = "排序必须大于等于0")
- 在接收参数的方法的形参上加上@Valid注解
但如果出现以下问题:
比如相同的Entity, 插入的时候这个字段必须为空, 修改的时候就不能为空, 就很难办了. 例如修改商品时候商品的id.
解决办法:
分组校验:
先自定义两个空接口, 一个是表示增加的接口AddGroup, 一个表示修改的接口UpdateGroup
把@Valid换成@Validated({xxxGroup.class})
然后在Entity中每个使用校验的地方后面加个groups = {xxxGroup.class}
如果不写默认不参加校验
自定义校验
- 编写自定义校验注解, 这里message从配置的ValidationMessages.properties中取得
配置: com.haozhancc.common.valid.ListValue.message=必须提交指定的值@Documented @Constraint( validatedBy = { ListValueConstraintValidator.class } ) @Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.PARAMETER, ElementType.TYPE_USE}) @Retention(RetentionPolicy.RUNTIME) public @interface ListValue { String message() default "{com.haozhancc.common.valid.ListValue.message}"; Class<?>[] groups() default {}; Class<? extends Payload>[] payload() default {}; int[] vals() default { }; }
- 编写自定义校验器
@Slf4j @RestControllerAdvice(basePackages = "com.haozhancc.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> errorMap = new HashMap<>(); bindingResult.getFieldErrors().forEach((fieldError -> { errorMap.put(fieldError.getField(), fieldError.getDefaultMessage()); })); return R.error(BizCodeEnume.VAILD_EXCEPTION.getCode(), BizCodeEnume.VAILD_EXCEPTION.getMsg()).put("data", errorMap); } @ExceptionHandler(value = Throwable.class) public R handleException(Throwable throwable) { log.error("错误: ", throwable); return R.error(BizCodeEnume.UNKNOW_EXCEPTION.getCode(), BizCodeEnume.UNKNOW_EXCEPTION.getMsg()); } }
- 绑定自定义校验器和自定义注解之间的关联, 就用
@Constraint( validatedBy = { ListValueConstraintValidator.class } )