使用反射来对对象里的 属性进行验证
//初始化检查器。
static ValidatorFactory validatorFactory = Validation.byProvider(HibernateValidator.class)
.configure()
.failFast(true)
.buildValidatorFactory();
static Validator validator = validatorFactory.getValidator();
public static void validate(Object object) {
List<LinkedHashMap<String, Object>> result = new ArrayList<>();
serviceValid(object, result);
if (ObjectUtil.isNotEmpty(result)) {
throw new WDTException(JSON.toJSONString(result));
}
}
private static void serviceValid(Object object, List<LinkedHashMap<String, Object>> result) {
try {
LinkedHashMap<String, Object> msg = new LinkedHashMap<>();
//检查object
Set<ConstraintViolation<Object>> set = validator.validate(object);
List<String> list = new ArrayList<>();
//循环set,获取检查结果
for (ConstraintViolation<Object> voset : set) {
list.add("key:" + voset.getPropertyPath() + ", err msg:" + voset.getMessage() + ";");
}
Class classInfo = object.getClass();
if (ObjectUtil.isNotEmpty(list)) {
msg.put("className", classInfo.getName());
msg.put("errMsg", JSON.toJSONString(list));
result.add(msg);
}
Field[] fields = classInfo.getDeclaredFields();//Object是已经被赋值的对象实例
for (Field field : fields) {
Type genericFieldType = field.getGenericType();
Valid valid = field.getAnnotation(Valid.class);
//如果存在这个注解
if (ObjectUtil.isNotEmpty(valid)) {
//如果是List
if (genericFieldType instanceof ParameterizedType) {
//打开私有访问
field.setAccessible(true);
//获取属性值
Object value = field.get(object);
if (ObjectUtil.isEmpty(value)) {
LinkedHashMap<String, Object> msg1 = new LinkedHashMap<>();
msg1.put("className", field.getName());
msg1.put("errMsg", "不能为空!");
result.add(msg1);
continue;
}
Collection cloneable = (Collection) value;
//拿到List的值
for (Object obj : cloneable) {
serviceValid(obj, result);
}
} else {//获取属性值
//打开私有访问
field.setAccessible(true);
Object value = field.get(object);
serviceValid(value, result);
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
}