SpringMVC中数据验证
1. 配合hibernate-validator.jar包
hibernate-validator.jar依赖于jboss-logging.jar和validation-api.jar,使用Maven引入即可
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>5.2.4.Final</version>
</dependency>
2. 配置校验器
- 在springmvc核心文件中注册校验器信息
<!-- 校验器 -->
<bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
<property name="providerClass" value="org.hibernate.validator.HibernateValidator" />
<property name="validationMessageSource" ref="validationSource" />
</bean>
<!-- 校验错误信息配置文件 -->
<!-- value中的文件名不写路径-->
<bean id="validationSource"
class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
<property name="basenames">
<list>
<value>classpath:spring/ValidationMessages
</value>
</list>
</property>
<property name="fileEncodings" value="utf-8" />
<property name="cacheSeconds" value="120" />
</bean>
- 注入控制器适配器中
<mvc:annotation-driven validator="validator"></mvc:annotation-driven>
- 自定义错误信息文件,也可以使用org.hibernate.validator包中的自带文件
3. 在pojo中添加校验规则
- 校验规则添加至对应属性前
@NotBlank(message="{user.username.NotNull}")
private String username;
private char sex;
private String identity;
@NotBlank(message="{user.password.NotNull}")
private String password;
- 常用的校验规则
注解名 | 检查规则 |
---|---|
@AssertFalse | 被注解的元素必须为false |
@AssertTrue | 被注解的元素必须为true |
@DecimalMax(value) | 被注解的元素必须为一个数字,其值必须小于等于指定的最小值 |
@DecimalMin(Value) | 被注解的元素必须为一个数字,其值必须大于等于指定的最小值 |
@Digits(integer=, fraction=) | 被注解的元素必须为一个数字,其值必须在可接受的范围内 |
@Future | 被注解的元素必须是日期,检查给定的日期是否比现在晚 |
@Max(value) | 被注解的元素必须为一个数字,其值必须小于等于指定的最小值 |
@Min(value) | 被注解的元素必须为一个数字,其值必须大于等于指定的最小值 |
@NotNull | 被注解的元素必须不为null |
@Null | 被注解的元素必须为null |
@Past(java.util.Date/Calendar) | 被注解的元素必须过去的日期,检查标注对象中的值表示的日期比当前早 |
@Pattern(regex=, flag=) | 被注解的元素必须符合正则表达式,检查该字符串是否能够在match指定的情况下被regex定义的正则表达式匹配 |
@Size(min=, max=) | 被注解的元素必须在制定的范围(数据类型:String, Collection, Map and arrays) |
@Valid | 递归的对关联对象进行校验, 如果关联对象是个集合或者数组, 那么对其中的元素进行递归校验,如果是一个map,则对其中的值部分进行校验 |
@CreditCardNumber | 对信用卡号进行一个大致的验证 |
@Email 被注释的元素必须是电子邮箱地址 | |
@Length(min=, max=) | 被注解的对象必须是字符串的大小必须在制定的范围内 |
@NotBlank | 被注解的对象必须为字符串,不能为空,检查时会将空格忽略 |
@NotEmpty | 被注释的对象必须为空(数据:String,Collection,Map,arrays) |
@Range(min=, max=) | 被注释的元素必须在合适的范围内 (数据:BigDecimal, BigInteger, String, byte, short, int, long and 原始类型的包装类 ) |
@URL(protocol=, host=, port=, regexp=, flags=) | 被注解的对象必须是字符串,检查是否是一个有效的URL,如果提供了protocol,host等,则该URL还需满足提供的条件 |
4. Controllerh获取错误信息
- 通过@Validated注解声明校验,BindingResult获取错误信息
注意被验证变量和BindingResult是一一对应关系
public ModelAndView queryUserByName(@Validated User user,BindingResult bindingResult){
if (bindingResult.hasErrors()) {
List<ObjectError> errorList = bindingResult.getAllErrors();
mv = new ModelAndView();
mv.addObject("errorList", errorList);
mv.setViewName("hello");
return mv;
}