我将接受具有某些值的 csv 文件。这些值将根据对象的属性进行验证
例子:
如果有一个包含姓名、电子邮件、电话号码等的人员类。
public class Person{
private String name;
private String email;
private String status;
set();
get();
}
并且 csv 文件具有“名称”、“电子邮件”,我想编写一个验证逻辑,它将根据对象属性检查 csv 的内容。
使用反射,您可以看到类中有哪些字段:
Field[] fields = Person.class.getDeclaredFields();
for(Field curField:fields)
{
System.out.println(curField.getName());
}
然后,您可以从 csv 中获取字段名称并比较其值。
我通常使用这个解决方案。它是一个谓词,所以它是可重用的。取决于您使用哪个谓词,您可以将它与 guava 或 Apache Commons Collections 一起使用。
public class BeanPropertyPredicate<T, V> implements Predicate<T> {
// Logger
private static final Logger log = LoggerFactory.getLogger(BeanPropertyPredicate.class);
public enum Comparison {EQUAL, NOT_EQUAL}
private final String propertyName;
private final Collection<V> values;
private final Comparison comparison;
public BeanPropertyPredicate(String propertyName, Collection<V> values, Comparison comparison) {
this.propertyName = propertyName;
this.values = values;
this.comparison = comparison;
}
@Override
public boolean apply(@Nullable T input) {
try {
PropertyDescriptor propertyDescriptor = PropertyUtils.getPropertyDescriptor(input, propertyName);
Object value = propertyDescriptor.getReadMethod().invoke(input);
switch (comparison) {
case EQUAL:
if(!values.contains(value)) {
return false;
}
break;
case NOT_EQUAL:
if(values.contains(value)) {
return false;
}
break;
}
} catch (Exception e) {
log.error("Failed to access property {}", propertyName, e);
}
return true;
}
}