springMVC学习(五)校验器Validation

校验器Validation

输入验证是Spring处理的最重要Web开发任务之一,SpringMVC使用JSR-303(javaEE6规范的一部分)校验规范, JSR 303 用于对 Java Bean 中的字段的值进行验证,JSR只是一个规范文档,本身用处不大,除非编写了它的实现。用于实现JSR Bean Validation,Hibernate Validator就是它的一个实现,springmvc使用的是Hibernate Validator(和Hibernate的ORM无关),常用JSR 303注解约束:

  • @AssertFalse,验证 Boolean 对象是否为 false(@AssertTrue)

  • @DecimalMax,被标注的值必须不大于约束中指定的最大值. 这个约束的参数是一个通过BigDecimal定义的最大值的字符串表示.小数存在精度(@DecimalMin)

  • @Digits(integer=,fraction=),验证字符串是否是符合指定格式的数字,interger指定整数精度,fraction指定小数精度

  • @Future,验证 Date 和 Calendar 对象是否在当前时间之后 (@Past)

  • @Max,验证 Number 和 String 对象是否小等于指定的值(@Min)

  • @NotNull,验证对象是否不为null, 无法查检长度为0的字符串(@Null)

  • @Pattern,验证 String 对象是否符合正则表达式的规则

  • @Size,验证对象(Array,Collection,Map,String)长度是否在给定的范围之内

开发步骤:

  • 导入jar包

    • hibernate-validator-6.0.16.Final.jar

    • validation-api-2.1.0.Final.jar

    • jboss-logging-3.4.0.Final

  • ValidationMessages.properties配置文件,配置提示信息

items.name.length.error=商品名称的长度为1到30个字符
items.createTime.is.notNull=商品生产日期不能为空
  • springMVC配置文件添加配置

    <!--校验器配置-->
   <!-- 错误信息的校验文件配置 -->
   <bean id="messageSource"
class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
       <!-- 资源文件名 -->
       <property name="basenames">
           <list>
               <value>classpath:ValidationMessages</value>
           </list>
       </property>
       <!-- 资源文件编码格式 -->
       <property name="fileEncodings" value="utf-8" />
       <!-- 对资源文件内容缓存时间,单位秒 -->
       <property name="cacheSeconds" value="120" />
   </bean>

   <!-- 配置校验器 -->
   <bean id="validator"
class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
       <!-- 校验器 -->
       <property name="providerClass" value="org.hibernate.validator.HibernateValidator" />
       <!-- 指定校验使用的资源文件,如果不指定则默认使用classpath下的ValidationMessages.properties -->
       <property name="validationMessageSource" ref="messageSource" />
   </bean>

   <!-- 添加到自定义参数绑定的WebBindingInitializer中 -->
   <bean id="customBinder"
class="org.springframework.web.bind.support.ConfigurableWebBindingInitializer">
       <!-- 配置validator -->
       <property name="validator" ref="validator" />
   </bean>

   <!-- WebBindingInitializer添加到适配器中 -->
   <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
       <!-- 在webBindingInitializer中注入自定义属性编辑器、自定义转换器 -->
       <property name="webBindingInitializer" ref="customBinder"/>
   </bean>
  • 在POJO中定义规则

public class Items {
   private Integer id;
   @Size(min = 1,max = 30,message = "{items.name.length.error}")
   private String name;
   @NotNull(message = "{items.createTime.is.notNull}")
   private Date createTime;
//Getter and Setter
}
  • 验证时,在controller里面用@Validated表示该实体(参数)需要验证,然后用BindingResult对象接受验证结果,当验证不通过时BindingResult就会接受对应的错误提示信息

    @RequestMapping("/valid.action")
   public void valid(@RequestBody @Validated Items items, BindingResult result){
       List<ObjectError> errors=result.getAllErrors();
       for(ObjectError error:errors){
           System.out.println(error.getDefaultMessage());
      }
  }

分组校验

分组校验其实就是为了我们的校验更加灵活,针对不同的 Controller方法达到个性化验证;比如:修改商品信息,只校验日期不为空。那么此时,我们就可以用到分组校验了,开发步骤:

  • 定义分组的接口(接口不定义方法,只作为一个标识)

public interface ValidateGroup1 {
}
  • 定于校验规则属于哪一各组( @Size、@NotNull 中添加 groups属性)

    @NotNull(message = "items.id.is.notNull",groups = {ValidateGroup1.class})
   private Integer id;
  • 在Controller方法中定义使用校验分组(@Validated 注解属性value 指明哪个分组,@Validated(value={ValidateGroup1.class})

    @PostMapping("/valid1.action")
   public void valid1(@RequestBody @Validated(value = {ValidateGroup1.class}) Items items, BindingResult result){
       List<ObjectError> errors=result.getAllErrors();
       for(ObjectError error:errors){
           System.out.println(error.getDefaultMessage());
      }
  }

 

posted @ 2020-12-20 18:09  hjy1995  阅读(278)  评论(0编辑  收藏  举报