【问题标题】:How to ask BeanUtils to ignore null values如何让 BeanUtils 忽略空值
【发布时间】:2011-02-05 18:26:40
【问题描述】:

使用 Commons beanUtils 我想知道如何让任何转换器说 Dateconverter 忽略 null 值并使用 null 作为默认值。以公共类为例,

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

和我的转换器测试一样,

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。这在我看来是一个非常原始的场景,应该默认处理(如,我希望 x2 对 date1 具有空值)。 doco 告诉我,我可以要求converter 这样做。有人可以指出我这样做的最佳方法吗?

我不想让 Converter 和 isUseDefault() 为真,因为我必须为所有 Date、Enum 和许多其他转换器做这件事!

【问题讨论】:

标签: java apache-commons-beanutils


【解决方案1】:

我有点惊讶,像在 bean 中设置空值这样简单的情况,像这样:

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);

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 这个问题发生在我身上,我使用的是 commons-beanutils 的 1.9.2 版本。
    • 我使用的是 1.9.2 版本,并将其降级到 1.9.0 用于我的项目。问题没有解决。
    【解决方案3】:

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

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

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

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

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

        【讨论】:

        • 为了澄清,你应该在运行 copyProperties 方法之前运行这一行。
        猜你喜欢
        • 2013-11-13
        • 1970-01-01
        • 2021-12-31
        • 1970-01-01
        • 1970-01-01
        • 2013-02-17
        • 2011-02-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多