1

我想验证一个 Java 类对象以检查成员是否遵守某些规则。除了特定规则外,我还想检查是否有任何字符串成员为空/空。

这样做的好方法是什么(验证字符串成员)?

我的做法是:

if(StringUtils.isNotEmpty(sMember1) && StringUtils.isNotEmpty(sMember2)...)

是否有一种简洁的方法来验证所有字符串成员?

(反射是一种可能性吗?如果是,它会是一个昂贵的操作吗?)

4

4 回答 4

2

您应该使用符合 jsr 303 的验证器。请参阅此讨论是否有可用的 JSR-303(bean 验证)实现?

于 2012-04-24T10:55:40.517 回答
1

正如@krishnakumarp 指出的那样,我还建议使用JSR 303,我不会构建自己的框架,而是使用任何已经可用的东西。但是,如果您想了解如何实现它,那么它实际上非常简单:

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创建一个对象。

于 2012-04-24T11:14:53.833 回答
0

为此有很多框架和库。看看http://oval.sourceforge.net/

于 2012-04-24T10:54:48.530 回答
0

为什么不考虑在使用同一对象的 setter 方法设置成员时检查成员的有效性?在对对象进行任何操作之前检查对象成员的有效性是很好的,但 IMO 最好在设置它们后立即进行验证。如果值不合适,允许操作(在核心类内部)向更高层抛出适当的异常。

注意:如果您不重构旧代码片段,但您正在编写新数据对象,则此方法是可行的。

于 2012-04-24T11:18:11.193 回答