2014-03-30 35 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

相关问题