springMVC学习(五)校验器Validation
校验器Validation
-
@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;
-
验证时,在controller里面用@Validated表示该实体(参数)需要验证,然后用BindingResult对象接受验证结果,当验证不通过时BindingResult就会接受对应的错误提示信息
分组校验
分组校验其实就是为了我们的校验更加灵活,针对不同的 Controller方法达到个性化验证;比如:修改商品信息,只校验日期不为空。那么此时,我们就可以用到分组校验了,开发步骤:
-
定义分组的接口(接口不定义方法,只作为一个标识)
public interface ValidateGroup1 {
}
-
定于校验规则属于哪一各组( @Size、@NotNull 中添加 groups属性)
-
在Controller方法中定义使用校验分组(@Validated 注解属性value 指明哪个分组,
@Validated(value={ValidateGroup1.class})
)