Spring验证
Spring 3引入了对其验证支持的几项增强。首先,现在完全支持JSR-303 Bean验证API。其次,当以编程方式使用时,Spring的DataBinder现在可以验证对象并绑定到它们。第三,Spring MVC现在支持声明性验证@Controller输入。
一、JSR-303 Bean验证API概述
SR-303标准化Java平台的验证约束声明和元数据。使用此API,您可以使用声明性验证约束对域模型属性进行注释,并且运行时会强制执行它们。有许多可以利用的内置约束条件。您也可以定义您自己的自定义约束。
为了说明,请考虑一个简单的具有两个属性的PersonForm模型:
public class PersonForm {
private String name;
private int age;
}
JSR-303允许你定义对这些属性的声明性验证约束:
public class PersonForm {
@NotNull
@Size(max=64)
private String name;
@Min(0)
private int age;
}
当这个类的一个实例被JSR-303验证器验证时,这些约束将被执行。
有关JSR-303 / JSR-349的一般信息,请参阅Bean验证网站。有关默认参考实现的特定功能的信息,请参阅Hibernate Validator文档。要学习如何将Bean Validation提供者设置为Spring bean,请继续阅读。
二、配置一个Bean验证提供程序
Spring提供对Bean验证API的全面支持。这包括对作为Spring bean引导JSR-303 / JSR-349 Bean验证提供程序的方便支持。这允许一个javax.validation.ValidatorFactory或javax.validation.Validator任何需要在你的应用程序验证被注入。
使用该LocalValidatorFactoryBean配置默认的Validator作为Spring bean:
<bean id="validator"
class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean"/>
上面的基本配置将触发Bean Validation使用其默认引导机制进行初始化。JSR-303 / JSR-349提供程序(如Hibernate验证程序)预计会出现在类路径中,并会自动检测到。
1.注入一个验证器
LocalValidatorFactoryBean同时实现了javax.validation.ValidatorFactory和 javax.validation.Validator,以及Spring的 org.springframework.validation.Validator。您可以将这些接口的引用注入到需要调用验证逻辑的bean中。
javax.validation.Validator如果您更愿意直接使用Bean验证API ,则注入一个引用:
import javax.validation.Validator;
@Service
public class MyService {
@Autowired
private Validator validator
org.springframework.validation.Validator
如果您的bean需要Spring验证API ,则注入一个引用:
import org.springframework.validation.Validator;
@Service
public class MyService {
@Autowired
private Validator validator;
}
2.配置自定义约束
每个Bean验证约束由两部分组成。首先,@Constraint声明约束及其可配置属性的注释。其次,实现javax.validation.ConstraintValidator约束行为的接口的实现。为了将一个声明和一个实现关联起来,每个@Constraint注解引用一个对应的ValidationConstraint实现类。在运行时,ConstraintValidatorFactory当您的域模型中遇到约束注释时, 实例化所引用的实现。
默认情况下,LocalValidatorFactoryBean配置一个SpringConstraintValidatorFactory 使用Spring来创建ConstraintValidator实例。这允许您的自定义ConstraintValidators像任何其他Spring bean一样受益于依赖注入。
下面显示的是一个自定义@Constraint声明的示例,后面跟着一个ConstraintValidator使用Spring进行依赖注入的相关 实现:
@Target({ElementType.METHOD, ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy=MyConstraintValidator.class)
public @interface MyConstraint {
}
import javax.validation.ConstraintValidator;
public class MyConstraintValidator implements ConstraintValidator {
@Autowired;
private Foo aDependency;
...
}
如你所见,一个ConstraintValidator实现可能像其他Spring bean一样拥有@Autowired的依赖关系。
3.Spring驱动的方法验证
Bean Validation 1.1支持的方法验证功能以及Hibernate Validator 4.3的自定义扩展可以通过MethodValidationPostProcessorbean定义集成到Spring上下文中。
<bean class="org.springframework.validation.beanvalidation.MethodValidationPostProcessor"/>
为了符合Spring驱动的方法验证条件,所有的目标类都需要使用Spring的@Validated注释进行注释,可选择声明要使用的验证组。MethodValidationPostProcessor使用Hibernate Validator和Bean Validation 1.1提供程序查看javadocs的设置细节。
4.其他配置选项
在LocalValidatorFactoryBean大多数情况下,默认配置应该足够了。从消息插值到遍历解析,各种Bean验证结构都有许多配置选项。有关LocalValidatorFactoryBean这些选项的更多信息,请参阅 javadocs。
三、配置DataBinder
自Spring 3以来,可以使用Validator配置DataBinder实例。配置完成后,可以通过调用来调用Validator binder.validate()。任何验证错误都会自动添加到活页夹的BindingResult。
以编程方式使用DataBinder时,可以在绑定到目标对象后使用它来调用验证逻辑:
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();
DataBinder也可以Validator通过dataBinder.addValidators和配置多个实例 dataBinder.replaceValidators。将全局配置的Bean验证与Validator本地在DataBinder实例上配置的Spring相结合时,这非常有用。参见[validation-mvc-configurations]。
好啦,Spring的验证机制就讲到这么多啦。