如何让BeanUtils忽略空值

14

使用Commons BeanUtils,我想知道如何要求任何转换器(比如DateConverter)忽略空值并将null作为默认值。以一个公共类为例:

使用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的值为null)。文档告诉我可以要求转换器完成此操作。可以有人指点我如何最好地做到这一点吗?
我不想获得转换器并使isUseDefault()成为true,因为那样我必须为所有日期、枚举和许多其他转换器这样做!

你的链接已经失效,请提供正确的链接。 - VedantK
5个回答

45

看起来似乎有一种方法可以告诉ConvertUtils在遇到空值时不抛出异常,方法是调用:

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

请注意,在运行copyProperties方法之前,请先运行此行代码以进行澄清。 - Ismail Yavuz

10

4
我遇到了这个问题,我的commons-beanutils版本是1.9.2。 - Marc
我之前使用的是1.9.2版本,为了我的项目我将其降级到了1.9.0版本。但问题并没有得到解决。 - Georgios Syngouroglou

2

1
我最近遇到了这个问题,只需将我的变量转换为字符串以避免此错误,并在需要时将其转换回日期。虽然不是最优雅的解决方案,但为了简单起见并避免出现此类问题,这是一个可行的解决方案。另一个注意事项是,BeanUtils会在我的类加载之前触发其方法,因此我选择了这个解决方案,而不是使用自定义类加载器来解决更复杂的问题。
顺便说一下,在1.8.0版本之前,BeanUtils本身会忽略这些空值。
请参见此链接:当字段为具有空值的java.util.Date时未指定“日期”的值,以获取详细说明。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接