美文网首页我爱编程
Spring参考手册 3 校验,数据绑定和类型转换

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

作者: liycode | 来源:发表于2017-03-12 17:45 被阅读177次

    翻译自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参考手册 3 校验,数据绑定和类型转换

        本文链接:https://www.haomeiwen.com/subject/chqxnttx.html