这两天研究validation的用法,先入为主地认为validation可以对数据类型的setter方法进行限制,在使用后发现validation的功能其实比较有限,一般只在以下情况才会起作用,其他情况下只能亲自使用工厂类生成的validator进行验证。
以下两种情况下被标记的数据会检测数据是否符合要求,不符合时会抛出异常:
- Pojo 上加检查规则, Controller 视图函数Pojo形参前加上 @Validated 来触发检查动作.
- 在 bean 类(Service 类,Repository类均可) 上加 @Validated注解, 在bean类的方法的形参前增加检查规则, 然后在controller方法中, 通过调用该bean方法将触发检查动作.
另外:
- 尽管数据类的成员变量上有注解,但如果不在以上两种情况下操作数据类型的成员变量是不会触发检查动作的
- 产生的validator不能检查直接被注解的变量,只能检查包含被注解变量的类的实例,比如:
@Max(10) int a=20;
/**
*ValidateUtil封装了创建validator并进行检测的行为,
*如果有错误会抛出异常
**/
ValidateUtil.beanValidate(a);
这样写是不会抛出异常的。
顺便贴一下ValidateUtil的代码(其他地方复制的):
package com.example.demo.util;
import org.apache.commons.collections.CollectionUtils;
import javax.validation.ConstraintViolation;
import javax.validation.Validation;
import javax.validation.Validator;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
public class ValidateUtil {
private static Validator validator = Validation.buildDefaultValidatorFactory()
.getValidator();
public static void beanValidate(Object obj) throws Exception {
Map<String, String> validatedMsg = new HashMap<>();
Set<ConstraintViolation<Object>> constraintViolations = validator.validate(obj);
for (ConstraintViolation<Object> c : constraintViolations) {
validatedMsg.put(c.getPropertyPath().toString(), c.getMessage());
}
if (CollectionUtils.isNotEmpty(constraintViolations)) {
throw new Exception(validatedMsg.toString());
}
}
}