如何让BeanUtils忽略空值

时间:2010-04-08 15:27:27

标签: java apache-commons-beanutils

使用Commons beanUtils我想知道如何询问任何转换器说Dateconverter忽略空值并使用null作为默认值。作为一个例子,考虑一个公共类,

public class X {
    private Date date1;
    private String string1;
    //add public getters and setters
}

和我的convertertest as,

public class Apache {

    @Test
    public void testSimple() throws Exception {
        X x1 = new X(), x2 = new X();
        x1.setString1("X");
        x1.setDate1(null);
        org.apache.commons.beanutils.BeanUtils.copyProperties(x2, x1);
        //throws ConversionException
        System.out.println(x2.getString1());
        System.out.println(x2.getDate1());
    }
}

上面会抛出一个NPE,因为日期恰好为null。对于我来说,这看起来是一个非常原始的场景,应该默认处理(例如,我希望x2对date1有空值)。 doco告诉我,我可以要求converter这样做。有人能指出我这样做的最佳方式吗?

我不想得到转换器和isUseDefault()是真的,因为那时我必须为所有Date,Enum和许多其他转换器做到这一点!

5 个答案:

答案 0 :(得分:38)

显然看起来,有一种方法可以告诉ConvertUtils不会在null值上抛出异常,这可以通过调用来实现

BeanUtilsBean.getInstance().getConvertUtils().register(false, false, 0);

答案 1 :(得分:10)

最好的解决方案是更新到BeanUtils 1.9.0,因为这个问题已修复,你可以在这里看到https://issues.apache.org/jira/browse/BEANUTILS-454

答案 2 :(得分:2)

也许有点晚了,但看起来你可以注册一个DateConverter https://issues.apache.org/jira/browse/BEANUTILS-387

答案 3 :(得分:1)

我最近遇到了这个问题,只是将我的变量转换为字符串以避免此错误,并在需要时将其转换回日期。不是最优雅的解决方案,但为了简单起见并避免这样的问题,它是一个可行的解决方案。另一个警告是BeanUtils会在我的类加载之前触发它的方法,所以我选择了这个而不是使用自定义类加载器的问题的更复杂的解决方案。

顺便说一句,在verion 1.8.0之前,BeanUtils本身会忽略这些空值。

查看此链接: No value specified for 'Date' when the field is a java.util.Date with a null value有详细解释。

答案 4 :(得分:0)

我有点惊讶于在bean中设置null值这样一个简单的例子:

BeanUtils.setProperty(pojo, "date", null);

导致崩溃行为,如上所述。

对于它的价值,这是我的解决方法:

import org.apache.commons.beanutils.BeanMap;

BeanMap beanMap = new BeanMap(pojo);
Method writeMethod = beanMap.getWriteMethod("date");
writeMethod.invoke(pojo, null);