2014-03-30 64 views
2

BeanUtils不適用於鏈式設置器

class tester 
{ 
    @Test 
    public void testBeanUtils() throws InvocationTargetException, IllegalAccessException, NoSuchMethodException 
    { 
     Stranger stranger = new Stranger(); 
     BeanUtils.setProperty(stranger,"name","wener"); 
     BeanUtils.setProperty(stranger,"xname","xwener"); 
     BeanUtils.setProperty(stranger,"yname","ywener"); 

     System.out.println(stranger); 
    } 
    @Data// lombok annotation generate all setter and getter 
    public static class Stranger 
    { 
     @Accessors(chain = true)// generate chained setter 
     String name; 
     String xname; 
     String yname; 

     public Stranger setYname(String yname)// no lombok, still not work 
     { 
      this.yname = yname; 
      return this; 
     } 
    } 
} 

我的輸出:

TestValues.Stranger(name=null, xname=xwener, yname=null) 

這有什麼錯呢?連鎖二傳是一件好事。 有什麼建議嗎?

編輯

回到這個問題再試一次,我就沒法刪除Accessors chain。 現在我用commons-lang3來實現。

// force access = true is required 
Field field = FieldUtils.getField(bean.getClass(), attrName, true); 
field.set(bean,value); 

對於那些誰得到了同樣的問題。

回答

3

這很簡單:BeanUtils是比較奇怪,所以是Introspector它使用:

雖然BeanUtils.setProperty宣佈一些例外,它似乎silently ignore的財產不存在進行設置。最終的罪魁禍首是Introspector,其中簡直就是二傳手的無效。

我會打電話給它打破設計,但YMMV。這是一個古老的類,流暢的界面在那些黑暗的時代還沒有發明。使用Accessors(chain=false)禁用鏈接。


更重要的是:Use the source。得到它並得到一個調試器(它已經在您的IDE中)自己找到它(仍然可以自由地詢問它是否無效,只是嘗試一點點)。

+0

也許BeanHelper可以在這裏使用。它似乎使用Fluent界面INstrospector。 https://apache.googlesource.com/commons-configuration/+/b5ef1eb1a7dd34a06cf68dae4bfcada9e1121818/src/main/java/org/apache/commons/configuration/beanutils/BeanHelper.java –

+0

坦克,已經禁用鏈,等待[BeanUtils2] (http://commons.apache.org/sandbox/commons-beanutils2/) – wener

相關問題