13

使用 Commons beanUtils 我想知道如何让任何转换器说 Dateconverter 忽略空值并使用 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 告诉我,我可以要求转换器执行此操作。有人可以指出我这样做的最佳方法吗?

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

4

5 回答 5

45

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

BeanUtilsBean.getInstance().getConvertUtils().register(false, false, 0);
于 2010-04-08T16:09:24.290 回答
10

最好的解决方案是更新到 BeanUtils 1.9.0,因为您可以在此处查看此问题https://issues.apache.org/jira/browse/BEANUTILS-454

于 2014-05-18T15:02:28.973 回答
2

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

于 2012-04-27T16:07:13.860 回答
1

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

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

有关详细说明,请参阅此链接: 当字段是带有空值的 java.util.Date 时,没有为“日期”指定值

于 2014-02-24T15:53:31.667 回答
0

我有点惊讶于在 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);
于 2015-05-12T14:44:22.233 回答