本地验证需要jar包
<dependency> <groupId>javax.validation</groupId> <artifactId>validation-api</artifactId> <version>2.0.1.Final</version> </dependency> <!-- https://mvnrepository.com/artifact/org.hibernate.validator/hibernate-validator --> <dependency> <groupId>org.hibernate.validator</groupId> <artifactId>hibernate-validator</artifactId> <version>6.2.0.Final</version> </dependency> <!-- https://mvnrepository.com/artifact/javax.el/javax.el-api --> <dependency> <groupId>javax.el</groupId> <artifactId>javax.el-api</artifactId> <version>3.0.0</version> </dependency> <dependency> <groupId>org.glassfish.web</groupId> <artifactId>javax.el</artifactId> <version>2.2.6</version> </dependency>
自定义:
应用场景:
在开发过程中,与前端对接枚举等需要限制,避免不必要沟通
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD, ElementType.PARAMETER})
@Constraint(validatedBy = FlagValidatorClass.class)
public @interface FlagValidator {
String[] value() default {};
String message() default "flag is not found";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
public class FlagValidatorClass implements ConstraintValidator<FlagValidator, String> {
private String[] values;
@Override
public void initialize(FlagValidator flagValidator) {
this.values = flagValidator.value();
}
@Override
public boolean isValid(String value, ConstraintValidatorContext constraintValidatorContext) {
if (value == null) {
//当状态为空时使用默认值
return true;
}
return Arrays.stream(values).anyMatch(s -> s.equals(String.valueOf(value)));
}
}
自定义分组
public interface Add {
}
public interface Update {
}
本地验证:
/**
* @author dai
* @date 2022/10/11
*/
public class App {
public static void main(String[] args) {
ValidatorFactory validatorFactory = Validation.byProvider(HibernateValidator.class)
.configure()
.failFast(true)
.buildValidatorFactory();
Validator validator = validatorFactory.getValidator();
TestValid testNotValid = new TestValid();
testNotValid.setName("test");
testNotValid.setType("3");
Set<ConstraintViolation<TestValid>> validate = validator.validate(testNotValid);
System.out.println(validate);
//[ConstraintViolationImpl{interpolatedMessage='类型找不到', propertyPath=type, rootBeanClass=class validator.TestValid, messageTemplate='类型找不到'}]
TestValid testValid = new TestValid();
testValid.setName("test");
testValid.setType("2");
Set<ConstraintViolation<TestValid>> validate0 = validator.validate(testValid);
System.out.println(validate0);
//[]
TestValid testGroupAdd = new TestValid();
Set<ConstraintViolation<TestValid>> validate1 = validator.validate(testGroupAdd, Add.class);
System.out.println(validate1);
//[ConstraintViolationImpl{interpolatedMessage='name不能为空', propertyPath=name, rootBeanClass=class validator.TestValid, messageTemplate='name不能为空'}]
TestValid testGroupUpdate = new TestValid();
Set<ConstraintViolation<TestValid>> validate2 = validator.validate(testGroupUpdate, Update.class);
System.out.println(validate2);
//[ConstraintViolationImpl{interpolatedMessage='id不能为空', propertyPath=id, rootBeanClass=class validator.TestValid, messageTemplate='id不能为空'}]
}
}
/**
* @author dai
* @date 2022/10/11
*/
@Getter
@Setter
public class TestValid {
@NotNull(message = "id不能为空", groups = Update.class)
private Long id;
@NotBlank(message = "name不能为空", groups = {Add.class, Update.class})
private String name;
@FlagValidator(value = {"0", "1", "2"}, message = "类型找不到")
private String type;
}