我想验证Java类对象以检查成员是否遵守某些规则。除了特定的规则,我还想检查是否有任何字符串成员为空/空。
这样做的好方法是什么(验证字符串成员)?
我的方法是:
if(StringUtils.isNotEmpty(sMember1) && StringUtils.isNotEmpty(sMember2)...)
是否有一种简洁的方法来验证所有字符串成员?
(反思是否可能?如果是,那将是一项昂贵的操作吗?)
答案 0 :(得分:2)
您应该使用符合jsr 303标准的验证器。请参阅此讨论Is there an implementation of JSR-303 (bean validation) available?
答案 1 :(得分:1)
我还建议使用JSR 303作为@krishnakumarp指出,我不会构建自己的框架,但使用已经可用的任何东西。但是,如果您想了解如何实施它,那么它实际上非常简单:
public static Collection<ErrorMessage> validate(Object obj) {
Collection<ErrorMessage> errors = new ArrayList<ErrorMessage>();
Field[] fields = obj.getClass().getDeclaredFields();
for (Field field : fields) {
field.setAccessible(true);
if (field.getType().equals(String.class)) {
try {
String value = (String) field.get(obj);
if (isEmpty(value)) {
errors.add(new ErrorMessage(field.getName() + " is empty"));
}
}
catch (Exception e) {
// oops.
e.printStackTrace();
}
}
}
return errors;
}
请注意,在此示例中,存在自定义错误处理,并且对于每个验证错误,都会创建ErrorMessage
对象。
答案 2 :(得分:0)
有很多框架和库。看http://oval.sourceforge.net/
答案 3 :(得分:0)
为什么不考虑使用同一对象的setter方法设置成员的有效性?在对对象成员进行任何操作之前检查对象成员的有效性是很好的,但IMO最好在设置完成后立即进行验证。如果值不合适,请允许操作(在核心类中)向更高层抛出适当的异常。
注意: 如果您不重新考虑旧版片段,但是您正在编写新的数据对象,则此方法是可行的。