Spring参考手册 3 校验,数据绑定和类型转换

96
liycode
2017.03.12 17:45* 字数 943

翻译自Spring官方文档 4.1.2版本

相关文章:

一、简介

Spring Framework 4.0支持Bean Validation 1.0 (JSR-303) 和 Bean Validation 1.1 (JSR-349),也适配Spring的Validator接口。

关于把校验作为业务逻辑现在有许多不同的观点,Spring为校验(和数据绑定)提供了一种设计既不赞成也不反对那些观点。明确的校验不应该被绑在web层,应该是在容易发现的位置尽可能的插入任何可用的校验器。考虑以上的观点,Spring想了一个Validator接口,可以普遍或者特定使用在应用程序的每个层面。

数据绑定会将用户输入动态的绑定到一个域模型(或者任何你用来处理用户输入的对象)。Spring提供了DataBinder来准确的执行数据绑定。ValidatorDataBinder一起组成了validation包,它主要是用在MVC framework,但是并不局限于MVC。

二、Spring校验

Spring 3引进了许多增强到它的校验支持。首先JSR-303 Bean Validation API现在是完全支持的。Spring的DataBinder现在可以校验数据的同时绑定它们。Spring MVC支持声明式校验@Controller输入。

2.1 JSR-303 Bean Validation API概览

JSR-303是为Java平台制定的约束声明和元数据标准化规范。你可以在域模型(实体类)的属性上使用注解式声明校验约束条件。你也可以定义自己的约束条件。

为了方便解释,我看来看一个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 Validation website

2.2 配置Bean Validation Provider

Spring完全支持Bean Validation API。包括方便的将JSR-303/JSR-349 Bean Validation provider作为一个Spring bean来使用。这允许你可以在任何时间将javax.validation.ValidatorFactory或者javax.validation.Validator注入到应用程序需要被验证的地方。

使用LocalValidatorFactoryBean来配置一个默认的校验器作为一个Spring bean:

<bean id="validator"
    class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean"/>

LocalValidatorFactoryBean同时实现了javax.validation.ValidatorFactoryjavax.validation.Validatororg.springframework.validation.Validator。你可以注入它们其中任何一个引用到需要执行校验逻辑的bean。

下面这个例子注入了一个javax.validation.Validator的引用:

import javax.validation.Validator;

@Service
public class MyService {

    @Autowired
    private Validator validator;

2.3 Spring MVC 3 Validation

从Spring 3开始,Spring MVC可以自动校验@Controller的输入。

2.3.1 触发@Controller输入校验

为了触发校验,只需简单的在输入参数前添加@Valid注解:

@Controller
public class MyController {

    @RequestMapping("/foo", method=RequestMethod.POST)
    public void processFoo(@Valid Foo foo) { /* ... */ }

Spring MVC在数据绑定结束后会使用一个合适的校验器来进行校验。

注意:@Valid注解是JSR-303 Bean Validation API的一部分,并不是Spring特有的结构。

你可以配置一个自定义的校验器或者使用JSR-303/JSR-349的校验器。

下面的例子使用自定义校验器:

@Controller
public class MyController {

    @InitBinder
    protected void initBinder(WebDataBinder binder) {
        binder.setValidator(new FooValidator());
    }

    @RequestMapping("/foo", method=RequestMethod.POST)
    public void processFoo(@Valid Foo foo,BindingResult bindingResult) { ... }

}

还可以配置一个全局的自定义校验器:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/mvc
        http://www.springframework.org/schema/mvc/spring-mvc.xsd">

    <mvc:annotation-driven validator="globalValidator"/>

</beans>

怎么实现自己的校验器可以看这里

第二种方式是使用JSR-303/JSR-349的校验器,例如:Hibernate Validator。将他添加到你的classpath,Spring MVC会自动发现。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/mvc
        http://www.springframework.org/schema/mvc/spring-mvc.xsd">

    <!-- JSR-303/JSR-349 support will be detected on classpath and enabled automatically -->
    <mvc:annotation-driven/>

</beans>

验证的错误可以通过BindingResultgetFieldError()来获取字段的错误。

后续会补充下JSR-303的一些注解。

Spring参考手册翻译
Web note ad 1