SpringFramework核心技术三:Spring的验证机制

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的验证机制就讲到这么多啦。

猜你喜欢

转载自blog.csdn.net/wd2014610/article/details/80812495
今日推荐