|
对于最新稳定版本,请使用Spring Framework 7.0.1! |
Java 豆验证
Spring 框架支持Java Bean Validation API。
豆验证概述
Bean 验证通过约束声明和 提供了一种通用的验证方法 用于Java应用程序的元数据。使用时,你需要注释域模型属性 声明式验证约束,随后由运行时强制执行。有 内置约束,你也可以自定义自定义约束。
考虑以下例子,展示了一个简单的人形具有两个性质的模型:
-
Java
-
Kotlin
public class PersonForm {
private String name;
private int age;
}
class PersonForm(
private val name: String,
private val age: Int
)
Bean 验证允许你声明约束,如下示例所示:
-
Java
-
Kotlin
public class PersonForm {
@NotNull
@Size(max=64)
private String name;
@Min(0)
private int age;
}
class PersonForm(
@get:NotNull @get:Size(max=64)
private val name: String,
@get:Min(0)
private val age: Int
)
配置 Bean 验证提供商
Spring 对 Bean 验证 API 提供全面支持
Beans验证提供者作为春季豆。这样你就可以注入一个jakarta.validation.ValidatorFactory或jakarta.validation.Validator无论在哪里验证
这是你申请中必需的。
你可以使用LocalValidatorFactoryBean将默认验证器配置为 Spring
Bean,正如以下例子所示:
-
Java
-
XML
import org.springframework.validation.beanvalidation.LocalValidatorFactoryBean;
@Configuration
public class AppConfig {
@Bean
public LocalValidatorFactoryBean validator() {
return new LocalValidatorFactoryBean();
}
}
<bean id="validator"
class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean"/>
前述示例中的基本配置触发豆验证以初始化为 使用其默认的引导机制。一个 Bean 验证提供商,比如 Hibernate 验证器,预期存在于类路径中,并自动被检测。
注入验证器
LocalValidatorFactoryBean实现了这两种jakarta.validation.ValidatorFactory和jakarta.validation.Validator以及斯普林的org.springframework.validation.Validator.
你可以在需要调用的豆子中注入这些接口中的任意一个引用
验证逻辑。
你可以注入一个引用jakarta.validation.Validator如果你更喜欢和豆子合作
验证API直接使用,如下示例所示:
-
Java
-
Kotlin
import jakarta.validation.Validator;
@Service
public class MyService {
@Autowired
private Validator validator;
}
import jakarta.validation.Validator;
@Service
class MyService(@Autowired private val validator: Validator)
你可以注入一个引用org.springframework.validation.Validator如果你的豆子
需要 Spring Validation API,如下示例所示:
-
Java
-
Kotlin
import org.springframework.validation.Validator;
@Service
public class MyService {
@Autowired
private Validator validator;
}
import org.springframework.validation.Validator
@Service
class MyService(@Autowired private val validator: Validator)
自定义约束配置
每个豆验证约束由两部分组成:
-
一个
@Constraint声明约束及其可配置属性的注释。 -
一个实现
jakarta.validation.ConstraintValidator实现 约束的行为。
要将声明与实现关联,每个@Constraint注解
引用对应的约束验证器实现类。运行时,a约束验证器工厂当
约束注释会在你的领域模型中遇到。
默认情况下,LocalValidatorFactoryBean配置 aSpringConstraintValidatorFactory利用Spring创造约束验证器实例。这让你可以自定义约束验证器像其他春季豆一样,从依赖注入中受益。
以下示例展示了一种自定义@Constraint声明后接着一个相关约束验证器使用 Spring 进行依赖注入的实现:
-
Java
-
Kotlin
@Target({ElementType.METHOD, ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy=MyConstraintValidator.class)
public @interface MyConstraint {
}
@Target(AnnotationTarget.FUNCTION, AnnotationTarget.FIELD)
@Retention(AnnotationRetention.RUNTIME)
@Constraint(validatedBy = MyConstraintValidator::class)
annotation class MyConstraint
-
Java
-
Kotlin
import jakarta.validation.ConstraintValidator;
public class MyConstraintValidator implements ConstraintValidator {
@Autowired;
private Foo aDependency;
// ...
}
import jakarta.validation.ConstraintValidator
class MyConstraintValidator(private val aDependency: Foo) : ConstraintValidator {
// ...
}
如前例所示,a约束验证器实现可以有其依赖关系@Autowired就像其他春季豆一样。
Spring驱动方法验证
你可以集成 Bean Validation 1.1 支持的方法验证功能(以及
一个自定义扩展,同样由Hibernate Validator 4.3实现)通过方法验证后处理器豆子定义:
-
Java
-
XML
import org.springframework.validation.beanvalidation.MethodValidationPostProcessor;
@Configuration
public class AppConfig {
@Bean
public MethodValidationPostProcessor validationPostProcessor() {
return new MethodValidationPostProcessor();
}
}
<bean class="org.springframework.validation.beanvalidation.MethodValidationPostProcessor"/>
要符合 Spring 驱动方法验证的资格,所有目标类都需要被注释
与Spring's合作@Validated注释,也可以选择声明验证
使用组。看方法验证后处理器用于Hibernate Validator和Bean Validation 1.1提供者的设置细节。
附加配置选项
默认LocalValidatorFactoryBean配置对大多数人来说已足够
例。各种豆验证有多种配置选项
构造,从消息插值到遍历解析。参见LocalValidatorFactoryBean关于这些选项的更多信息,请参考Javadoc。
配置DataBinder
你可以配置一个DataBinder实例验证器.配置好后,你可以
调用验证器通过呼叫binder.validate().任何验证错误是
自动添加到活页夹绑定结果.
以下示例展示了如何使用DataBinder程序化调用验证
绑定目标对象后的逻辑:
-
Java
-
Kotlin
Foo target = new Foo();
DataBinder binder = new DataBinder(target);
binder.setValidator(new FooValidator());
// bind to the target object
binder.bind(propertyValues);
// validate the target object
binder.validate();
// get BindingResult that includes any validation errors
BindingResult results = binder.getBindingResult();
val target = Foo()
val binder = DataBinder(target)
binder.validator = FooValidator()
// bind to the target object
binder.bind(propertyValues)
// validate the target object
binder.validate()
// get BindingResult that includes any validation errors
val results = binder.bindingResult
你也可以配置一个DataBinder多重验证器实例通过dataBinder.addValidators和dataBinder.replaceValidators.这在
将全局配置的豆验证与 Spring 结合起来验证器配置
在本地的DataBinder实例上。参见 Spring MVC 验证配置。
春季MVC 3验证
详见春季MVC章节中的验证。