Springboot hibernate validator 校验省去重复校验代码
Documentation - Hibernate Validator 官方地址
Springboot 自带的有
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
poml没有Springboot web依赖单独引用
<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator</artifactId>
<version>6.1.5.Final</version>
</dependency>
常见的注解
Bean Validation 中内置的 constraint
@Null 被注释的元素必须为 null
@NotNull 被注释的元素必须不为 null
@AssertTrue 被注释的元素必须为 true
@AssertFalse 被注释的元素必须为 false
@Min(value) 被注释的元素必须是一个数字,其值必须大于等于指定的最小值
@Max(value) 被注释的元素必须是一个数字,其值必须小于等于指定的最大值
@DecimalMin(value) 被注释的元素必须是一个数字,其值必须大于等于指定的最小值
@DecimalMax(value) 被注释的元素必须是一个数字,其值必须小于等于指定的最大值
@Size(max=, min=) 被注释的元素的大小必须在指定的范围内
@Digits (integer, fraction) 被注释的元素必须是一个数字,其值必须在可接受的范围内
@Past 被注释的元素必须是一个过去的日期
@Future 被注释的元素必须是一个将来的日期
@Pattern(regex=,flag=) 被注释的元素必须符合指定的正则表达式
Hibernate Validator 附加的 constraint
@NotBlank(message =) 验证字符串非null,且长度必须大于0
@Email 被注释的元素必须是电子邮箱地址
@Length(min=,max=) 被注释的字符串的大小必须在指定的范围内
@NotEmpty 被注释的字符串的必须非空
@Range(min=,max=,message=) 被注释的元素必须在合适的范围内
post 请求 实体属性 @NotNull(message = "文章标题不能为空") 接口上加@Valid
@Data
public class SecArticle {
/**
* 文章id
*/
private Long artId;
/**
* 文章标题
*/
@NotNull(message = "文章标题不能为空")
@Size(min = 2, max = 50, message = "文章标题都在[2,50]字之间",groups = {UpdateGroup.class})
private String artTitle;
/**
* 文章专栏
*/
@Size(min = 2, max = 20, message = "文章专栏在[2,20]字之间",groups = {ValidGroupAdd.class})
private String artColumn;
}
分组校验
/**
* 上传文档数据管理
*/
@RestController
@RequestMapping("/sec/plaint")
public class SecPlaintController extends BaseController {
@Autowired
private SecPlaintService SecPlaintService;
@PostMapping
public AjaxResult add(@RequestBody @Validated({UpdateGroup.class, ValidGroupAdd.class} SecArticle secPlaint) {
return AjaxResult.success(SecPlaintService.add(secPlaint));
}
}
get请求 Controller类上加@Validated 接口上加@NotNull(message = "id不能为空")
/**
*
*/
@RestController
@RequestMapping("/sec/article")
@Validated
public class SecArticleController extends BaseController {
@Autowired
private SecArticleService secArticleService;
@GetMapping("/info")
public AjaxResult info(@NotNull(message = "id不能为空") Long id) {
return AjaxResult.success(secArticleService.info(id));
}
@DeleteMapping
public AjaxResult delete(@NotNull(message = "id不能为空") Long id) {
return AjaxResult.success(secArticleService.delete(id));
}
}
自定义注解
@Target({ElementType.METHOD, ElementType.FIELD}) //注解的目标范围 方法,字段上
@Retention(RetentionPolicy.RUNTIME) //运行时
@Constraint(validatedBy = NullSizeImpl.class) //校验时执行的自定义类
public @interface NullSize {
int min();//自己定义的属性
int max();//自己定义的属性
String message() default "检查数据录入长度";
Class<?>[] groups() default {}; //必须实现这三个方法
Class<? extends Payload>[] payload() default {};
}
实现注解校验 implements ConstraintValidator<NullSize, String>
public class NullSizeImpl implements ConstraintValidator<NullSize, String> {
private String checkStr = "";
private int min = 0;
private int max = 0;
public void initialize(NullSize constraintAnnotation) {
this.checkStr = constraintAnnotation.message();
this.min = constraintAnnotation.min();
this.max = constraintAnnotation.max();
}
public boolean isValid(String s, ConstraintValidatorContext constraintValidatorContext) {
if (s == null || s == "") {
return true;
} else {
int length = s.length();
if (length <= max && length >= min) {
return true;
} else {
return false;
}
}
}
}
使用自定义注解
@Data
public class SecArticle {
/**
* 文章链接
*/
@NullSize(min = 2, max = 128, message = "请检查文章链接数据长度!限制长度为[2-128]之间!")
private String artLinkUrl;
/**
* 文章作者
*/
@NullSize(min = 2, max = 20, message = "请检查文章作者数据长度!限制长度为[2-20]之间!")
private String artAuthor;
}