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

Java Bean 验证

Spring Framework 提供了对 Java Bean 验证 API 的支持。spring-doc.cadn.net.cn

Bean 验证概述

Bean Validation 提供了一种通用的验证方法,通过 constraint declaration 和 元数据。要使用它,您可以使用 声明性验证约束,然后由运行时强制执行。有 built-in constraints,您还可以定义自己的自定义 constraints。spring-doc.cadn.net.cn

请考虑以下示例,它显示了一个简单的PersonFormmodel 具有两个属性: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 的 API 创建。请参阅 Hibernate Validator 文档 特定约束。了解如何将 Bean 验证提供程序设置为 Spring Bean,请继续阅读。spring-doc.cadn.net.cn

配置 Bean 验证提供程序

Spring 提供了对 Bean 验证 API 的全面支持,包括 Bean Validation 提供程序作为 Spring Bean。这样,您就可以在邮件中注入jakarta.validation.ValidatorFactoryjakarta.validation.ValidatorWhere 验证 在您的应用程序中需要。spring-doc.cadn.net.cn

您可以使用LocalValidatorFactoryBean将默认 Validator 配置为 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 验证以通过以下方式初始化 使用其默认的引导机制。Bean Validation 提供程序,例如 Hibernate Validator 应存在于 Classpath 中,并被自动检测。spring-doc.cadn.net.cn

注入验证器

LocalValidatorFactoryBean同时实现jakarta.validation.ValidatorFactoryjakarta.validation.Validator以及 Spring 的org.springframework.validation.Validator. 您可以将对这些接口中任一接口的引用注入到需要调用 验证逻辑。spring-doc.cadn.net.cn

您可以注入对jakarta.validation.Validator如果您更喜欢使用 Bean 验证 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如果您的 bean 需要 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)

配置自定义约束

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

要将声明与实现关联,每个@Constraint注解 引用相应的ConstraintValidatorimplementation 类。在运行时,ConstraintValidatorFactory实例化引用的实现,当 约束注释。spring-doc.cadn.net.cn

默认情况下,LocalValidatorFactoryBean配置SpringConstraintValidatorFactory使用 Spring 创建ConstraintValidator实例。这样,您的自定义ConstraintValidators像任何其他 Spring bean 一样从依赖注入中受益。spring-doc.cadn.net.cn

以下示例显示了自定义@Constraint声明后跟关联的ConstraintValidator使用 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 {

	// ...
}

如前面的示例所示,ConstraintValidatorimplementation 可以有其依赖项@Autowired就像任何其他 Spring bean 一样。spring-doc.cadn.net.cn

Spring 驱动的方法验证

您可以集成 Bean Validation 1.1 支持的方法验证功能(并且,作为 自定义扩展(也是由 Hibernate Validator 4.3 提供的)通过MethodValidationPostProcessorbean 定义: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 的@Validated注解,也可以选择声明验证 要使用的组。看MethodValidationPostProcessor,了解 Hibernate Validator 和 Bean Validation 1.1 提供程序的设置详细信息。spring-doc.cadn.net.cn

方法验证依赖于 AOP 代理 目标类,可以是接口上方法的 JDK 动态代理或 CGLIB 代理。 使用代理存在某些限制,其中一些限制在 了解 AOP 代理 中进行了介绍。此外,请记住 始终在代理类上使用方法和访问器;直接字段访问将不起作用。spring-doc.cadn.net.cn

其他配置选项

默认的LocalValidatorFactoryBean配置足以满足大多数 例。各种 Bean 验证有许多配置选项 构造,从消息插值到遍历解析。请参阅LocalValidatorFactoryBeanjavadoc 了解有关这些选项的更多信息。spring-doc.cadn.net.cn

配置DataBinder

您可以配置DataBinder实例具有Validator.配置完成后,您可以 调用Validator通过调用binder.validate().任何验证Errors是 自动添加到 Binder 的BindingResult.spring-doc.cadn.net.cn

以下示例演示如何使用DataBinder以编程方式调用 validation 绑定到目标对象后的逻辑: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具有多个Validator实例dataBinder.addValidatorsdataBinder.replaceValidators.这在以下情况下很有用 将全局配置的 bean 验证与 Spring 相结合Validator配置 本地的 DataBinder 实例。参见 Spring MVC 验证配置spring-doc.cadn.net.cn

Spring MVC 3 验证

参见 Spring MVC 一章中的 验证spring-doc.cadn.net.cn