2010-04-08 68 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);