springmvc的数据校验的配置和使用

来源:互联网 发布:天谕凌体型捏脸数据 编辑:程序博客网 时间:2024/05/21 06:36

参考链接:
SpringMVC数据验证——第七章 注解式控制器的数据验证、类型转换及格式化——跟着开涛学SpringMVC

SpringMVC学习系列(6) 之 数据验证

SpringMVC使用@Valid注解进行数据验证

数据验证框架 Apache BVal 简介(更新)

====================================================

1.maven管理引入springmvc注解数据校验所需jar包:

<dependency>        <groupId>javax.validation</groupId>         <artifactId>validation-api</artifactId>         <version>1.1.0.Final</version>  </dependency>  <dependency>      <groupId>org.hibernate</groupId>      <artifactId>hibernate-validator</artifactId>      <version>5.1.0.Final</version></dependency>

2.配置springmvc的全局数据校验:
springmvc全局数据校验的配置方式:
注意:本质其实就是将校验器绑定到处理器适配器上;

全局配置方式1:通过标签annotation-driven将校验器自动注入到适配器中;

<!-- 即使不添加validator="validator",只要引入了hibernate的校验插件,仍然能够,自动将默认的校验器注入到适配器中 --><mvc:annotation-driven validator="validator">

全局配置方式2(自学):手动将校验器注入到适配器中

<!-- 处理器适配器,执行拦截器和后端控制器,并配置相应的数据转换类和数据校验类 -->    <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">        <!-- 数据校验 -->        <property name="webBindingInitializer" ref="webBindingInitializer"></property>    </bean>    <!-- 全局数据校验 -->    <!-- 数据验证 Validator bean -->      <bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">          <!-- 校验器,使用hibernate校验器 -->        <property name="providerClass" value="org.hibernate.validator.HibernateValidator"/>       <!--  指定校验使用的资源文件,在文件中配置校验错误信息,如果不指定则默认使用classpath下面的ValidationMessages.properties文件 -->        <property name="validationMessageSource" ref="messageSource"/>    </bean>    <bean id="webBindingInitializer" class="org.springframework.web.bind.support.ConfigurableWebBindingInitializer">           <property name="validator" ref="validator"/>      </bean>

3.自定义局部校验:
(1)自定义数据校验类:

package validation;  import org.springframework.util.StringUtils;import org.springframework.validation.Errors;import org.springframework.validation.ValidationUtils;import org.springframework.validation.Validator;import edu.hrbeu.platform.modeling.pojo.TestOrder;  /**  * Created by wb-zhangkenan on 2016/9/2.  */  public class TestValidtor implements Validator{      /**      * 判断支持的JavaBean类型      * @param aClass      * @return      */      @Override      public boolean supports(Class<?> aClass) {          return TestOrder.class.equals(aClass);      }      /**      * 实现Validator中的validate接口      * @param obj      * @param errors      */      @Override      public void validate(Object obj, Errors errors) {          //把校验信息注册到Error的实现类里          ValidationUtils.rejectIfEmpty(errors,"id",null,"id不能为空!");          TestOrder testOrder = (TestOrder) obj;          if(StringUtils.isEmpty(testOrder.getName())){              errors.rejectValue("name",null,"家庭地址不能为空!!!!");          }      }  }  

(2)测试controller:

package edu.hrbeu.platform.modeling.businessCollaboration.controller;import java.util.List;import javax.validation.Valid;import org.springframework.stereotype.Controller;import org.springframework.validation.BindingResult;import org.springframework.validation.ObjectError;import org.springframework.web.bind.WebDataBinder;import org.springframework.web.bind.annotation.InitBinder;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.ResponseBody;import edu.hrbeu.platform.modeling.pojo.TestOrder;import validation.TestValidtor;@Controller@RequestMapping("/testValidation")public class TestValidationController {    //绑定PersonalValidator      @InitBinder    public void initBinder(WebDataBinder webDataBinder){          webDataBinder.addValidators(new TestValidtor());      }    @RequestMapping("testPojo")    @ResponseBody    public List<ObjectError> testPojo(@Valid TestOrder testOrder, BindingResult bindingResult) {        List<ObjectError> allErrors = bindingResult.getAllErrors();        return allErrors;    }}

(3)对应的实体类:

package edu.hrbeu.platform.modeling.pojo;import javax.validation.constraints.NotNull;import org.hibernate.validator.constraints.NotEmpty;public class TestOrder {    @NotNull(message="不能为null....")    private Integer id;    @NotEmpty(message="不能为空串....")    private String name;    public Integer getId() {        return id;    }    public void setId(Integer id) {        this.id = id;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    @Override    public String toString() {        return "TestOrder [id=" + id + ", name=" + name + "]";    }}

总结:如果全局校验配置不成功,可能是映射器和适配器配置错误,可能配置了多个映射器和适配器,而springmvc执行时由上到下使用映射器和适配器,然而我们把校验器注入到了下面某个适配器中,导致无法执行校验器;

原创粉丝点击