1、背景
今天做项目需要验证字段的完整性,如果字段不全,则需要重新保存。
2、方案
(1)获取每个字段值进行判断
最开始想到的就是从实体中get每个字段,进行空判断。但是考虑到字段太多,代码重复繁琐,遂废弃。
(2)反射
利用反射获取到实体中每个字段,但是实体中有不需要验证的字段,遂废弃。
// 验证方法
public boolean validateEntity(Object obj) {
for (Field field : obj.getClass().getDeclaredFields()) {
field.setAccessible(true);
try {
if (field.get(obj) == null) {
return false;
}
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
return true;
}
public static void main(String[] args) {
UserEntity entity = new UserEntity();
// set fields of entity
boolean isValid = validateEntity(entity);
if (!isValid) {
System.out.println("Entity is not valid. Some fields are null.");
} else {
System.out.println("Entity is valid. All fields have values.");
}
}
(3)使用Java Bean Validation API来验证实体类中的每个字段是否都有值
- 在实体中添加@NotNull注解
- 创建验证器
- 验证实体类
完整代码
import javax.validation.constraints.NotNull;
public class User
@NotNull
private String name;
}
import javax.validation.ConstraintViolation;
import javax.validation.Validation;
import javax.validation.Validator;
import javax.validation.ValidatorFactory;
public static void main(String[] args) {
User user = getById(id);
ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
Validator validator = factory.getValidator();
Set<ConstraintViolation<User>> violations = validator.validate(user);
if (violations.isEmpty()) {
// entity is valid
} else {
// entity is invalid
for (ConstraintViolation<MyEntity> violation : violations) {
System.out.println(violation.getMessage());
}
}
}
注意点
1.注意导包javax.validation
2.如果获取的实体数据本身已经包含了所有必填字段的值,那么在使用验证器验证实体数据时,violations的size应该是0,因为实体数据已经满足了所有注解的要求。