2010-04-08 124 views
12

使用Commons beanUtils我想知道如何要求任何转换器说DateConverter忽略空值并使用null作为默认值。例如,考虑一个公共类,如何让BeanUtils忽略空值

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

和我convertertest为,

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具有空值)。多克告诉我,我可以要求converter这样做。有人能指出我做这件事的最佳方式吗?

我不想弄到转换器和isUseDefault()是真的,因为那么我必须为所有日期,枚举和许多其他转换器!

+0

http://commons.apache.org/proper/commons-beanutils/v1.8.3/apidocs/org/apache/commons/beanutils/转换器/ DateConverter.html您的链接已损坏 – VedX 2017-05-19 08:19:52

回答

33

显然那样子,有一种方法来告诉ConvertUtils不扔这是通过调用

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

为了澄清,您应该在运行copyProperties方法之前运行此行。 – 2017-05-03 16:00:07

1

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

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

看到这个链接: No value specified for 'Date' when the field is a java.util.Date with a null value了解详细的解释。

10

最好的解决办法是升级到最新的BeanUtils 1.9.0,因为这个问题是固定的,你可以在这里看到https://issues.apache.org/jira/browse/BEANUTILS-454

+4

对于我而言,这个问题正在发生,而我在1.9.0版本的commons-beanutils中。 – Marc 2015-05-12 14:45:28

+0

我正在使用1.9.2版本,并将其降级到1.9.0,以供我的项目使用。这个问题没有解决。 – 2016-05-23 21:54:56

+1

太棒了!它解决了我的问题。 – 2017-07-01 17:32:35

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