对于最新稳定版本,请使用Spring Framework 7.0.1spring-doc.cadn.net.cn

Java 豆验证

Spring 框架支持Java Bean Validation API。spring-doc.cadn.net.cn

豆验证概述

Bean 验证通过约束声明和 提供了一种通用的验证方法 用于Java应用程序的元数据。使用时,你需要注释域模型属性 声明式验证约束,随后由运行时强制执行。有 内置约束,你也可以自定义自定义约束。spring-doc.cadn.net.cn

考虑以下例子,展示了一个简单的人形具有两个性质的模型:spring-doc.cadn.net.cn

public class PersonForm {
	private String name;
	private int age;
}
class PersonForm(
		private val name: String,
		private val age: Int
)

Bean 验证允许你声明约束,如下示例所示:spring-doc.cadn.net.cn

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 验证验证器根据声明的 验证该类实例 约束。有关一般信息,请参见豆验证 API。参见休眠验证器文档 具体的约束。了解如何将豆验证提供商设置为Spring 豆豆,继续读。spring-doc.cadn.net.cn

配置 Bean 验证提供商

Spring 对 Bean 验证 API 提供全面支持 Beans验证提供者作为春季豆。这样你就可以注入一个jakarta.validation.ValidatorFactoryjakarta.validation.Validator无论在哪里验证 这是你申请中必需的。spring-doc.cadn.net.cn

你可以使用LocalValidatorFactoryBean将默认验证器配置为 Spring Bean,正如以下例子所示:spring-doc.cadn.net.cn

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 验证器,预期存在于类路径中,并自动被检测。spring-doc.cadn.net.cn

注入验证器

LocalValidatorFactoryBean实现了这两种jakarta.validation.ValidatorFactoryjakarta.validation.Validator以及斯普林的org.springframework.validation.Validator. 你可以在需要调用的豆子中注入这些接口中的任意一个引用 验证逻辑。spring-doc.cadn.net.cn

你可以注入一个引用jakarta.validation.Validator如果你更喜欢和豆子合作 验证API直接使用,如下示例所示:spring-doc.cadn.net.cn

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,如下示例所示:spring-doc.cadn.net.cn

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)

自定义约束配置

每个豆验证约束由两部分组成:spring-doc.cadn.net.cn

要将声明与实现关联,每个@Constraint注解 引用对应的约束验证器实现类。运行时,a约束验证器工厂当 约束注释会在你的领域模型中遇到。spring-doc.cadn.net.cn

默认情况下,LocalValidatorFactoryBean配置 aSpringConstraintValidatorFactory利用Spring创造约束验证器实例。这让你可以自定义约束验证器像其他春季豆一样,从依赖注入中受益。spring-doc.cadn.net.cn

以下示例展示了一种自定义@Constraint声明后接着一个相关约束验证器使用 Spring 进行依赖注入的实现:spring-doc.cadn.net.cn

@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
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-doc.cadn.net.cn

Spring驱动方法验证

你可以集成 Bean Validation 1.1 支持的方法验证功能(以及 一个自定义扩展,同样由Hibernate Validator 4.3实现)通过方法验证后处理器豆子定义:spring-doc.cadn.net.cn

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提供者的设置细节。spring-doc.cadn.net.cn

方法验证依赖于围绕 目标类,要么是接口上方法的JDK动态代理,要么是CGLIB代理。 使用代理存在某些限制,其中一些在《理解AOP代理》中有详细描述。此外,请记住 始终在代理类上使用方法和访问;直接的现场通道无法使用。spring-doc.cadn.net.cn

附加配置选项

默认LocalValidatorFactoryBean配置对大多数人来说已足够 例。各种豆验证有多种配置选项 构造,从消息插值到遍历解析。参见LocalValidatorFactoryBean关于这些选项的更多信息,请参考Javadoc。spring-doc.cadn.net.cn

配置DataBinder

你可以配置一个DataBinder实例验证器.配置好后,你可以 调用验证器通过呼叫binder.validate().任何验证错误是 自动添加到活页夹绑定结果.spring-doc.cadn.net.cn

以下示例展示了如何使用DataBinder程序化调用验证 绑定目标对象后的逻辑:spring-doc.cadn.net.cn

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.addValidatorsdataBinder.replaceValidators.这在 将全局配置的豆验证与 Spring 结合起来验证器配置 在本地的DataBinder实例上。参见 Spring MVC 验证配置spring-doc.cadn.net.cn

春季MVC 3验证

详见春季MVC章节中的验证spring-doc.cadn.net.cn