环境:Springboot2.6.12
Spring Validation是一种轻量级的数据验证框架,主要用于对Java对象进行校验。它为数据验证提供了统一的接口和基本的校验功能,解决了数据校验这一常见问题,让开发人员能够方便地对数据进行验证,从而保证数据的有效性和安全性。
Spring Validation提供了一套注解,用于对Java对象进行校验,支持嵌套校验和分组校验,支持国际化和自定义注解和校验器,可以满足各种复杂的校验需求。它的主要特点包括:
Bean Validation 为Java应用程序提供了一种通过约束声明和元数据进行验证的通用方法。要使用它,只需要对POJO属性进行注释,然后由运行时强制执行这些约束。有内置的约束,你也可以定义自己的自定义约束。如下所示:
public class Person { @NotNull @Size(max=64) private String name; @Min(0) private int age;}
Bean验证验证器然后根据声明的约束验证此类的实例。有关API的一般信息,请参见Bean验证。有关特定约束,请参阅Hibernate验证程序文档。
Spring提供了对Bean验证API的全面支持,包括将Bean验证提供者作为Spring Bean。这使你可以在应用程序中需要验证的任何位置注入javax.validation.ValidatorFactory或javax.validation.Validator。
你可以使用LocalValidatorFactoryBean将默认验证器配置为Spring Bean,如下例所示:
import org.springframework.validation.beanvalidation.LocalValidatorFactoryBean;@Configurationpublic class AppConfig { @Bean public LocalValidatorFactoryBean validator() { return new LocalValidatorFactoryBean(); }}
上面的示例中的基本配置使用默认引导机制触发bean验证进行初始化。Bean验证提供程序(如Hibernate验证程序)应该出现在类路径中,并被自动检测到。
@Servicepublic class PersonService { // inject javaee validator object @Resource private Validator validator ; // inject spring validator object @Resource private org.springframework.validation.Validator valid ;}
接着上面的配置,我们只需要做验证动作即可。
@Servicepublic class PersonService { @Resource private Validator validator ; @Resource private org.springframework.validation.Validator valid ; public void validator(Person person) { Set<ConstraintViolation<Person>> res = validator.validate(person) ; res.forEach(cv -> { System.out.println(cv.getMessage()) ; }); System.out.println("----------------------") ; BindingResult errors = new MapBindingResult(new HashMap<String, Object>(), "person") ; valid.validate(person, errors) ; if (errors.hasErrors()) { errors.getAllErrors().forEach(oe -> { System.out.println(oe.getDefaultMessage()) ; }); } }}
@SpringBootTestclass SpringBootValidationApplicationTests { @Resource private PersonService ps ; @Test public void testValidator() { Person person = new Person() ; person.setAge(-1); ps.validator(person) ; }}
最小不能小于0不能为null----------------------最小不能小于0不能为null
每个Bean验证约束由两部分组成:
要将声明与实现关联,每个@Constraint注释都会引用相应的ConstraintValidator实现类。在运行时,当域模型中遇到约束注释时,ConstraintValidatorFactory将实例化引用的实现。下面的示例实现一个前缀匹配的验证逻辑:
自定义注解
@Target({ElementType.METHOD, ElementType.FIELD})@Retention(RetentionPolicy.RUNTIME)@Constraint(validatedBy = PrefixConstraintValidator.class)public @interface PrefixConstraint { String value() default "" ; // 这里的{validator.prefix.error}就是资源文件中定义的错误信息 String message() default "{validator.prefix.error}"; Class<?>[] groups() default { }; Class<? extends Payload>[] payload() default { };}
以上的注解属性都是必须的。
注意message属性是我们将发生错误后错误信息定义在配置文件中,而该文件的basename必须是ValidationMessages,如果你需要国际化支持,那么就这样命名:ValidationMessages_zh_CN.properties。
public class PrefixConstraintValidator implements ConstraintValidator<PrefixConstraint, CharSequence> { @Resource private DataService ds ; private String prefix ; @Override public boolean isValid(CharSequence value, ConstraintValidatorContext context) { ds.ak() ; if ( value == null ) { return false ; } return ((String) value).startsWith(prefix) ; } @Override public void initialize(PrefixConstraint pc) { prefix = pc.value() ; }}
验证器必须实现ConstraintValidator接口,该接口是泛型接口,第一个参数是该验证器要用于在那个注解,第二个参数是该注解应用在什么数据类型上。注意:在自定义验证器中我们是可以随意地注入其它Bean对象,是不是很强大?
你可以通过MethodValidationPostProcessor Bean定义将Bean validation 1.1(以及Hibernate Validator 4.3的自定义扩展)支持的方法验证功能集成到Spring上下文中:
@Beanpublic MethodValidationPostProcessor validationPostProcessor() { return new MethodValidationPostProcessor();}@Service@Validatedpublic class PersonService { @NotNull(message = "返回值不能为空") public Person findPerson(@NotEmpty(message = "ID 不能为空") String id) { return null ; }}
注意:类上必须有@Validated注解;因为上面的BeanPostProcessor中定义的Advisor(DefaultPointcutAdvisor)使用的切入的Pointcut在类级别上过滤条件是必须有@Validated注解,而方法则是拦截所有的方法。
这里是抛出的异常javax.validation.ConstraintViolationException,所有我们需要一个全局的异常拦截器来对异常做处理。
默认的LocalValidatoryFactoryBean配置对于大多数情况都足够了。对于各种Bean验证构造,有许多配置选项,从消息插值到遍历解析。有关这些选项的更多信息,请参阅LocalValidatorFactoryBean Javadoc。
https://docs.spring.io/spring-framework/docs/5.3.11/javadoc-api/org/springframework/validation/beanvalidation/LocalValidatorFactoryBean.html
本文链接:http://www.28at.com/showinfo-26-17391-0.htmlAPI接口参数验证的必备神器,让你的代码更高效!
声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com
上一篇: 了不起的Base64
下一篇: 使用漏桶算法实现一秒钟50个限流