我们在使用 SpringMVC 处理前台请求的时候,对于传输过来的数据我们可以通过对象的方式来接收,为了保证数据的合法性,我们往往需要对数据进行合法性校验(尽管前台已经进行了 js 验证),简单类型的数据,我们一般 if (str == null || str.length().trim() == 0) return ...
,但是如果是对象,校验就相对复杂一些,不仅要进行非 null 判断,还要对里面的属性逐一的进行判断,很麻烦,所以可以使用 Hibernate 提供的校验器来简化校验操作。
步骤:
一、导入所需的 jar 包
maven 项目的话直接添加如下 dependency 节点即可:
<!-- 引入hibernate的校验器实现 -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>5.1.1.Final</version>
</dependency>
二、在 SpringMVC 配置文件中注册校验器
在 springmvc.xml 中注册 hibernate 的校验器,并在原来的 mvc 注解驱动中设置 validator 属性:
<!--开启mvc注解驱动 -->
<mvc:annotation-driven validator="validator" />
<!-- 注册hibernate的校验器 -->
<bean id = "validator" class = "org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
<property name="providerClass" value ="org.hibernate.validator.HibernateValidator"></property>
</bean>
三、在所需校验的对象所对应的实体类属性上加上相应的校验注解
一些常用的校验规则:
- @NotNull 对象不为空
- @AssertTrue Boolean 对象是否为 true
- @AssertFalse 验证 Boolean 对象是否为 false
- @Size(min =, max =) 长度是否在给定的范围
- @Min(value=) 验证 Number 对象是否大等于指定的值
- @Max(value=) 验证 Number 对象是否小等于指定的值
- @Pattern 验证 String 对象是否符合正则表达式的规则
- @Past @Future验证 Date 和 Calendar 时间对象是否在当前时间之前/之后
- @Email 是否是正确的邮箱地址
比如说我要校验 Admin(管理员)对象:
package com.qjl.pems.entity;
import java.util.Date;
import javax.validation.constraints.Past;
import org.hibernate.validator.constraints.NotEmpty;
/**
* 类名称:管理员实体类
* 全限定性类名: com.qjl.pems.entity.Admin
* @author 曲健磊
* @date 2018年8月12日下午2:03:04
* @version V1.0
*/
public class Admin {
private Integer id;
@NotEmpty(message="真实姓名不能为空")
private String realName;
@NotEmpty(message="登录名称不能为空")
private String loginName;
private String password;
@NotEmpty(message="出生日期不能为空")
@Past(message="当前输入的出生日期不可信")
private Date birthday;
@NotEmpty(message="性别不能为空")
private String sex;
...
}
四、在 SpringMVC 的 handler 方法中需要进行校验的对象前加上 @Validated 注解,并在校验对象后加上一个 BindingResult 对象接收校验信息
对应的控制器方法:
/**
* 处理添加管理员的请求
* @param admin 前台发送的管理员信息
* @return 添加成功与否的提示信息
*/
@RequestMapping("/insertAdmin")
public @ResponseBody Map<String, Object> insertAdmin(@Validated Admin admin, BindingResult bindingResult) {
Map<String, Object> resultMap = new HashMap<String, Object>();
// 如果校验时有不符合校验规则的情况出现,springMVC会将错误信息放在BindingResult对象的错误提示信息里面
if (bindingResult.hasErrors()) {
List<ObjectError> errors = bindingResult.getAllErrors();
for (ObjectError error : errors) {
System.out.println(error.getDefaultMessage());
}
resultMap.put("errors", errors);
return resultMap;
}
...
return resultMap;
}
-
在需要校验的对象前加
@Validated
注解。 -
在该对象后加一个参数:BindingResut 来接收校验信息。
-
调用 BindingResult 对象的 hasErrors 方法判断前台传过来的参数是否符合校验规则,有一个不符合规则,hasErrors 方法就会返回 true。
-
然后调用 getAllErrors() 方法获取 ObjectError 的 list 列表。
-
遍历集合,调用每个对象的 getDefaultMessage() 方法,获取相应的错误提示信息(在实体类上配置的)
-
获取到校验信息后再返回给前台或做一些其他的处理即可。