Spring MVC提供了参数验证机制,一方面可以支持JSR-303注解验证,在默认的情况下Spring Boot会引入Hibernate Validator机制来支持JSR-303验证规范;另一方面,因为业务复杂,所以也支持自定义验证规则。
1.JSR-303验证
1.非空判断
@NotNull(message = "id不能为空")
private Long id;
2.时间判断
@Future(message = "需要一个将来日期")
//@Past(message = "需要一个过去日期")
@NotNull
private Date date;
3.范围判断
@NotNull
@DecimalMin(value = "0.1", message = "最小值0.1元")
@DecimalMax(value = "10000.00", message = "最大值10000元")
private Double value;
@NotNull
@Min(value = "1", message = "最小值为1")
@Max(value = "10", message = "最大致为10")
private Integer age;
@Range(min = 1, max = 99, message = "范围为1至88")
private Long range;
4.邮箱验证
@Email(message = "邮箱格式错误")
private String email;
5.长度验证
@Size(min = 20, max = 30, message = "字符串长度要求20到30质检")
private String size;
2.参数验证机制
为了更加灵活的提供验证机制,Spring还提供了自己的验证机制。在参数转换时,可以看到在Spring MVC中在WebDataBinder机制进行管理,在默认情况下Spring会自动地根据上下文通过注册了的转换器转换出参数所需的参数。在WebDataBinder中除了可以注册转换器外,还允许注册验证器(Validator)。
在Spring容器中,它允许使用注解@InitBinder,这个注解的作用允许在进入控制器方法钱修改WebDataBinder机制。Spring MVC验证接口
package org.springframework.validation;
public interface Validator {
/** 判定当前验证器是否支持该Class类型的验证 */
boolean supports(Class> clazz);
/** 如果supports返回true,则这个方法执行验证结果 */
void validate(Object target, Errors errors);
}
这是Spring所定义的验证接口,他定义了两个方法,其中supports方法参数为需要验证的POJO类型,如果该方法返回true,则spring会使用当前验证器的validate方法区验证POJO。而validate方法包含需要的target对象和错误对象errors,其中target是参数绑定后的POJO,这样便可以通过这个参数对象进行业务逻辑的自定义验证。如果发现错误,则可以保存到errors对象中,然后返回给控制器。
public class UserValidator implements Validator {
@Override
public boolean supports(Class> clazz) {
return clazz.equals(User.class);
}
@Override
public void validate(Object taget, Errors errors) {
// 对象为空
if (taget == null) {
// 直接在报错参数处报错, 这样就不能进入控制器了
errors.rejectValue("", "用户不能为空");
}
// 强制转换
User user = (User) target;
// 用户名非空串
if (StringUtils.isBlank(user.getUserName())) {
errors.rejectValue("userName", null, "用户名不能为空");
}
}
}
有了这个验证器,Spring还不会自动启动它,因为还没有绑定WebDataBinder机制。在Spring MVC中提供了一个注解@InitBinder,他的作用是在执行控制器方法前,处理器会先执行被@InitBinder标注的方法。这时可以将WebDataBinder对象作为参数传递到方法中,通过这层关系得到WebDataBinder对象,这个对象有一个setValidator方法,他可以绑定自定义的验证器,这样就可以在获取参数后,通过自定义验证器去验证参数。绑定验证器代码清单如下:
@RestController
@RequestMapping("/user")
public class UserController {
@InitBinder
public void initBinder(WebDataBinder binder) {
// 绑定验证器
binder.setValidator(new UserValidator());
}
}