Skip to content

Validator

1. 简介

在 Spring 中,Validator 是一个用于验证数据的接口,它定义了一个 validate 方法,用于验证给定的对象是否符合特定的规则。Validator 接口位于 org.springframework.validation 包中。

2. 使用方式

1. 通过Spring Validator接口

java
public class UserValidator implements Validator {

    @Override
    public boolean supports(Class<?> clazz) {
        return User.class.equals(clazz);
    }

    @Override
    public void validate(Object target, Errors errors) {
        User user = (User) target;

        if (user.getName() == null || user.getName().isEmpty()) {
            errors.rejectValue("name", "required", "Name is required");
        }

        if (user.getEmail() == null || !user.getEmail().contains("@")) {
            errors.rejectValue("email", "invalid", "Email is invalid");
        }
    }
}
public class UserValidator implements Validator {

    @Override
    public boolean supports(Class<?> clazz) {
        return User.class.equals(clazz);
    }

    @Override
    public void validate(Object target, Errors errors) {
        User user = (User) target;

        if (user.getName() == null || user.getName().isEmpty()) {
            errors.rejectValue("name", "required", "Name is required");
        }

        if (user.getEmail() == null || !user.getEmail().contains("@")) {
            errors.rejectValue("email", "invalid", "Email is invalid");
        }
    }
}

测试

java
public class Main {
    public static void main(String[] args) {
        User user = new User();
        user.setName("John");
        user.setEmail("john@example.com");

        UserValidator validator = new UserValidator();
        Errors errors = new BeanPropertyBindingResult(user, "user");

        ValidationUtils.invokeValidator(validator, user, errors);

        if (errors.hasErrors()) {
            System.out.println("Validation failed");
            errors.getAllErrors().forEach(error -> {
                System.out.println(error.getDefaultMessage());
            });
        } else {
            System.out.println("Validation succeeded");
        }
    }
}
public class Main {
    public static void main(String[] args) {
        User user = new User();
        user.setName("John");
        user.setEmail("john@example.com");

        UserValidator validator = new UserValidator();
        Errors errors = new BeanPropertyBindingResult(user, "user");

        ValidationUtils.invokeValidator(validator, user, errors);

        if (errors.hasErrors()) {
            System.out.println("Validation failed");
            errors.getAllErrors().forEach(error -> {
                System.out.println(error.getDefaultMessage());
            });
        } else {
            System.out.println("Validation succeeded");
        }
    }
}

2. 通过注解

java
public class User {
    @NotNull(message = "Name is required")
    private String name;

    @Email(message = "Email is invalid")
    private String email;

    // getters and setters
}
public class User {
    @NotNull(message = "Name is required")
    private String name;

    @Email(message = "Email is invalid")
    private String email;

    // getters and setters
}

spring配置类

java
@Configuration
public class AppConfig {

    @Bean
    public LocalValidatorFactoryBean validator() {
        return new LocalValidatorFactoryBean();
    }
}
@Configuration
public class AppConfig {

    @Bean
    public LocalValidatorFactoryBean validator() {
        return new LocalValidatorFactoryBean();
    }
}

测试

java
public class Main {
    public static void main(String[] args) {
        User user = new User();
        user.setName("John");
        user.setEmail("john@example.com");

        ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
        Validator validator = context.getBean(Validator.class);

        Set<ConstraintViolation<User>> violations = validator.validate(user);

        if (!violations.isEmpty()) {
            System.out.println("Validation failed");
            violations.forEach(violation -> {
                System.out.println(violation.getMessage());
            });
        } else {
            System.out.println("Validation succeeded");
        }
    }
}
public class Main {
    public static void main(String[] args) {
        User user = new User();
        user.setName("John");
        user.setEmail("john@example.com");

        ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
        Validator validator = context.getBean(Validator.class);

        Set<ConstraintViolation<User>> violations = validator.validate(user);

        if (!violations.isEmpty()) {
            System.out.println("Validation failed");
            violations.forEach(violation -> {
                System.out.println(violation.getMessage());
            });
        } else {
            System.out.println("Validation succeeded");
        }
    }
}

基于方法 @Validated

java
@Service
@Validated
public class MethodService {

    
    public String testMethodValidation(@NonNull @Valid User user) {
        return user.toString();
    }
}
@Service
@Validated
public class MethodService {

    
    public String testMethodValidation(@NonNull @Valid User user) {
        return user.toString();
    }
}

测试

java
public class Main {
    public static void main(String[] args) {
        User user = new User();
        user.setName("John");
        user.setEmail("john@example.com");

        ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
        MethodService methodService = context.getBean(MethodService.class);

        try {
            methodService.testMethodValidation(user);
            System.out.println("Validation succeeded");
        } catch (MethodArgumentNotValidException e) {
            System.out.println("Validation failed");
            e.getBindingResult().getAllErrors().forEach(error -> {
                System.out.println(error.getDefaultMessage());
            });
        }
    }
}
public class Main {
    public static void main(String[] args) {
        User user = new User();
        user.setName("John");
        user.setEmail("john@example.com");

        ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
        MethodService methodService = context.getBean(MethodService.class);

        try {
            methodService.testMethodValidation(user);
            System.out.println("Validation succeeded");
        } catch (MethodArgumentNotValidException e) {
            System.out.println("Validation failed");
            e.getBindingResult().getAllErrors().forEach(error -> {
                System.out.println(error.getDefaultMessage());
            });
        }
    }
}

3. 自定义校验注解

java
@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE })
@Retention(RUNTIME)
@Documented
@Constraint(validatedBy = { NotHaveBlankValidator.class })
public @interface NotHaveBlank {
     String message() default "不能包含空格";

 Class<?>[] groups() default { };

 Class<? extends Payload>[] payload() default { };

 @Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE })
 @Retention(RUNTIME)
 @Documented
 @interface List {

  NotHaveBlank[] value();
 }
}
@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE })
@Retention(RUNTIME)
@Documented
@Constraint(validatedBy = { NotHaveBlankValidator.class })
public @interface NotHaveBlank {
     String message() default "不能包含空格";

 Class<?>[] groups() default { };

 Class<? extends Payload>[] payload() default { };

 @Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE })
 @Retention(RUNTIME)
 @Documented
 @interface List {

  NotHaveBlank[] value();
 }
}

实现注解

java
public class NotHaveBlankValidator implements ConstraintValidator<NotHaveBlank, String> {

    @Override
    public boolean isValid(String value, ConstraintValidatorContext context) {
        if(value != null && value.contains(" ")) {
            // 获取默认的错误提示信息
            String defaultConstraintMessageString = context.getDefaultConstraintMessageTemplate();
            // 禁用默认的错误提示信息
            context.disableDefaultConstraintViolation();
            context.buildConstraintViolationWithTemplate("can not have blank").addConstraintViolation();
            return false;
        }
        return  false;
    }

}
public class NotHaveBlankValidator implements ConstraintValidator<NotHaveBlank, String> {

    @Override
    public boolean isValid(String value, ConstraintValidatorContext context) {
        if(value != null && value.contains(" ")) {
            // 获取默认的错误提示信息
            String defaultConstraintMessageString = context.getDefaultConstraintMessageTemplate();
            // 禁用默认的错误提示信息
            context.disableDefaultConstraintViolation();
            context.buildConstraintViolationWithTemplate("can not have blank").addConstraintViolation();
            return false;
        }
        return  false;
    }

}

测试

java
public class Main {
    public static void main(String[] args) {
        User user = new User();
        user.setName("John");
        user.setEmail("john@example.com");

        ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
        Validator validator = context.getBean(Validator.class);

        Set<ConstraintViolation<User>> violations = validator.validate(user);

        if (!violations.isEmpty()) {
            System.out.println("Validation failed");
            violations.forEach(violation -> {
                System.out.println(violation.getMessage());
            });
        } else {
            System.out.println("Validation succeeded");
        }
    }
}
public class Main {
    public static void main(String[] args) {
        User user = new User();
        user.setName("John");
        user.setEmail("john@example.com");

        ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
        Validator validator = context.getBean(Validator.class);

        Set<ConstraintViolation<User>> violations = validator.validate(user);

        if (!violations.isEmpty()) {
            System.out.println("Validation failed");
            violations.forEach(violation -> {
                System.out.println(violation.getMessage());
            });
        } else {
            System.out.println("Validation succeeded");
        }
    }
}

4. 依赖

xml
<dependency>
            <!-- https://mvnrepository.com/artifact/org.hibernate.validator/hibernate-validator -->
        <dependency>
            <groupId>org.hibernate.validator</groupId>
            <artifactId>hibernate-validator</artifactId>
            <version>8.0.1.Final</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.glassfish/jakarta.el -->
        <dependency>
            <groupId>org.glassfish</groupId>
            <artifactId>jakarta.el</artifactId>
            <version>4.0.2</version>
            <scope>test</scope>
        </dependency>
</dependency>
<dependency>
            <!-- https://mvnrepository.com/artifact/org.hibernate.validator/hibernate-validator -->
        <dependency>
            <groupId>org.hibernate.validator</groupId>
            <artifactId>hibernate-validator</artifactId>
            <version>8.0.1.Final</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.glassfish/jakarta.el -->
        <dependency>
            <groupId>org.glassfish</groupId>
            <artifactId>jakarta.el</artifactId>
            <version>4.0.2</version>
            <scope>test</scope>
        </dependency>
</dependency>