一 简单实现
1.依赖(用到分组校验时添加)
<!-- https://mvnrepository.com/artifact/org.hibernate.validator/hibernate-validator -->
<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator</artifactId>
<version>6.0.16.Final</version>
</dependency>
2.给entity加注解
/**
* 品牌id
*/
@TableId
@Null(message = "新增不能指定id",groups = {AddGroup.class})
@NotNull(message = "更新需要指定id",groups = {UpdateGroup.class})
private Long brandId;
/**
* 品牌名
*/
@NotBlank(message = "不能為空",groups = {AddGroup.class,UpdateGroup.class})
private String name;
/**
* 品牌logo地址
*/
@NotEmpty(groups = {AddGroup.class})
@URL(message = "logo必须是一个合法的url地址",groups = {AddGroup.class,UpdateGroup.class})
private String logo;
/**
* 介绍
*/
private String descript;
/**
* 显示状态[0-不显示;1-显示]
*/
@ListValue(value = {0,1},groups = {AddGroup.class})
private Integer showStatus;
/**
* 检索首字母
*/
@NotEmpty(groups = {AddGroup.class})
@Pattern(regexp = "^[a-zA-Z]$",message = "检索首字母只要一个大写字母")
private String firstLetter;
/**
* 排序
*/
@NotNull(groups = {AddGroup.class})
@Min(value = 0,message = "排序必须大于0")
private Integer sort;
3.告诉spring这个数据需要校验@Valid
@RequestMapping("/save")
public R save(@Valid @RequestBody BrandEntity brand , BindingResult result){
if (result.hasErrors()){
HashMap<String, String> map = new HashMap<>();
result.getFieldErrors().forEach((item)->{
String msg = item.getDefaultMessage();
String field = item.getField();
map.put(field,msg);
});
return R.error(404,"数据校验失败").put("data",map);
}else{
brandService.save(brand);
}
return R.ok();
}
二 分组校验
1 . 创建分组接口,不需要写如何代码,只做标识
2. 给entity添加groups分组校验
例如:当要添加商品时,不需要提交brandId 所以用@Null注解, groups 数组里写了Addgroups.class
@Validated标注里写了Addgroups.class ,就是说当请求到 '/save'时,需要验证标注了AddGroup组的注解 对应 @Null
当更新商品时,@Validated 要验证Update组,对应注解@NotNull
/**
* 品牌id
*/
@TableId
@Null(message = "新增不能指定id",groups = {AddGroup.class})
@NotNull(message = "更新需要指定id",groups = {UpdateGroup.class})
private Long brandId;
@RequestMapping("/save")
public R save(@Validated(AddGroup.class) @RequestBody BrandEntity brand , BindingResult result){
if (result.hasErrors()){
HashMap<String, String> map = new HashMap<>();
result.getFieldErrors().forEach((item)->{
String msg = item.getDefaultMessage();
String field = item.getField();
map.put(field,msg);
});
return R.error(404,"数据校验失败").put("data",map);
}else{
brandService.save(brand);
}
return R.ok();
}
/**
* 修改
*/
@RequestMapping("/update")
public R update(@Validated(UpdateGroup.class) @RequestBody BrandEntity brand){
brandService.updateById(brand);
return R.ok();
}
三 自定义注解
自定义ListValue注解
/**
* 显示状态[0-不显示;1-显示]
*/
@ListValue(value = {0,1},groups = {AddGroup.class})
private Integer showStatus;
1. 定义一个注解 和 校验器类 ListValueConstrainValidator
源码:ConstraintValidator接口第一个指定注解,第二个指定要校验的类型
public interface ConstraintValidator<A extends Annotation, T> {
default void initialize(A constraintAnnotation) {
}
boolean isValid(T var1, ConstraintValidatorContext var2);
}
所以我们在自定义校验器中实现ConstraintValidator并给定注解和要校验的类型
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import java.util.HashSet;
import java.util.Set;
public class ListValueConstrainValidator implements ConstraintValidator<ListValue,Integer> {
private Set<Integer> set = new HashSet<>();
@Override
public void initialize(ListValue constraintAnnotation) {
int[] value = constraintAnnotation.value();
for (int val : value) {
set.add(val);
}
}
/**
* @param integer 需要验证的值
*/
@Override
public boolean isValid(Integer integer, ConstraintValidatorContext constraintValidatorContext) {
return set.contains(integer);
}
}
这里的validatedBy是使用哪个校验器,我们自定义的
import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.*;
@Documented
@Constraint(
validatedBy = {ListValueConstrainValidator.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.atguigu.common.valid.ListValue.message}";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
int[] value() default {};
}
String message() default "{com.atguigu.common.valid.ListValue.message}";这里指一个变量
在resource下建一个ValidationMessages.properties
com.atguigu.common.valid.ListValue.message=必须提交指定值