数据校验(Validation)
通过Validator接口
引入相关依赖
<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator</artifactId>
<version>7.0.5.Final</version>
</dependency>
<dependency>
<groupId>org.glassfish</groupId>
<artifactId>jakarta.el</artifactId>
<version>4.0.1</version>
</dependency>
实体类
@Data
public class Person{
private String name;
private String age;
}
数据校验器类
public class PersonValidator implements Validator{
//指定需要校验的类型
@Override
public boolean supports(Class<?> clazz) {
return Person.class.equals(clazz);
}
//校验规则
@Override
public void validate(Object target, Errors errors) {
//name不能为空
ValidationUtils.rejectIfEmpty(errors,"name",errorCode:"name.empty","name is null")
//<0age<100
Person p = (Person)target;
if(p.getAge()<0){
//参数依次为,需要校验的属性,错误码,提示信息
errors.rejectValue("age","age.value.error","age<0")
}else if(p.getAge()>100){
errors.rejectValue("age","age.value.error.old","age>100")
}
}
}
测试类
@Test
public void test(){
//创建person对象
Person person = new Person();
person.setName("li");
person.setAge(-1);
//创建person对应databinder
DataBinder binder = new DataBinder(person);
//设置校验器
binder.setValidator(new PersonValidator());
//调用方法执行校验
binder.validate();
//输出校验结果
BindingResult result = binder.getBindingResult();
System.out.println(result.getAllErrors());
}
通过Validation注解
配置类,配置LocalValidatorFactoryBean
@Configuration
@ComponentScan("com.atli")
public class ValidationConfig{
@Bean
public LocalValidatorFactoryBean validator(){
return new LocalValidatorFactoryBean();
}
}
实体类
/**
* 常用注解
* @NotNull:不为空
* @NotEmpty:用于字符串,字符串不为空,长度不为0
* @NotBlank:用于字符串,字符串不为空,trim()后不为空串
* @DecimalMax(value):不大于指定值的数字
* @DecimalMin(value):不小于指定值的数字
* @Max(value):不大于指定值数字
* @Min(value):不小于指定值数字
* @Pattern(value):符合指定正则表达式
* @Size(max,min):字符长度在min到max之间
* @Email:为email格式
*/
@Component
@Data
public class User{
@NotNull
private String name;
@Min(0)
@Max(100)
private int age;
public User(String name, int age){
this.name=name;
this.age=age;
}
}
校验器
//原生的校验器写法
@Service
public class JavaValidation{
@Autowired
private Validator validator;
public boolean validatorByUser(User user){
Set<ConstraintViolation<User>> validate=validator.validate(user);
return validate.isEmpty();
}
}
//spring的校验器写法
@Service
public class SpringValidation{
@Autowired
private Validator validator;
public boolean validatorByUser(User user){
BindException bindException = new BindException(user,user.getName());
validator.validate(user,bindException);
return bindException.hasErrors();
}
}
测试类
//测试原生校验器
@Test
public void testJavaValidation(){
ApplicationContext context = new AnnotationConfigApplicationContext(ValidationConfig.class);
JavaValidation javaValidation = context.getBean(JavaValidation.class);
User user = new User("li",-1);
boolean message = javaValidation.validatorByUser(user);
System.out.println(message);
}
//测试spring校验器
@Test
public void testJavaValidation(){
ApplicationContext context = new AnnotationConfigApplicationContext(ValidationConfig.class);
SpringValidation springValidation = context.getBean(SpringValidation.class);
User user = new User("li",-1);
boolean message = springValidation.validatorByUser(user);
System.out.println(message);
}
基于方法实现校验
配置类
@Configuration
@ComponentScan("com.atli")
public class ValidationConfig{
@Bean
public MethodValidationPostProcessor validationPostProcessor(){
return new MethodValidationPostProcessor();
}
}
实体类
@Data
public class User{
@NotNull
private String name;
@Min(0)
@Max(100)
private int age;
public User(String name, int age){
this.name=name;
this.age=age;
}
}
校验器
@Service
@Validated
public class UserService{
public String testMethod(@NotNull @Valid User user){
return user.toString();
}
}
测试类
@Test
public void testJavaValidation(){
ApplicationContext context = new AnnotationConfigApplicationContext(ValidationConfig.class);
UserService service = context.getBean(UserServicen.class);
User user = new User("li",-1);
service.testMethod(user);
}
自定义校验
自定义校验其实是通过自定义注解的方式来扩展已有的校验功能以下用校验没有空格为例
自定义注解(可以直接在已有注解中改)
@Target({ElementType.METHOD,ElementType.FIELD,ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Constraint(validatedBy={CannotBlankValidation.class})
public @interface CannotBlank{
//默认错误提示信息
String message() default "cannot blank"
Class<?>[] groups() default{};
Class<? extends Payload>[] payload() default{};
@Target({ElementType.METHOD,ElementType.FIELD,ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface List{
NotNull[] value();
}
}
注解解析器
public class CannotBlankValidation implements ConstraintValidator<CannotBlank,String>{
@Override
public boolean isValid(String value, ConstraintValidatorContext context){
if(value != null && value.contains(" ")){
return false;
}
}
}