BeanUtils不适用于链设置器

wen*_*ner 8 java reflection chaining lombok apache-commons-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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我的输出:

TestValues.Stranger(name=null, xname=xwener, yname=null)
Run Code Online (Sandbox Code Playgroud)

这有什么问题?连锁二传手是一件好事.有什么建议?

编辑

再次回到这个问题.这次我无法删除Accessors chain.现在,我commons-lang3用来实现.

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

对于那些遇到同样问题的人.

小智 12

您可以使用FluentPropertyBeanIntrospector实现:

"BeanIntrospector接口的一个实现,它可以检测在流畅的API场景中使用的属性的写入方法."

https://commons.apache.org/proper/commons-beanutils/apidocs/org/apache/commons/beanutils/FluentPropertyBeanIntrospector.html

PropertyUtils.addBeanIntrospector(new FluentPropertyBeanIntrospector());
BeanUtils.setProperty( this.o, "property", "value" );
Run Code Online (Sandbox Code Playgroud)

  • 这应该是解决方案。它实际上解决了问题。 (3认同)

maa*_*nus 7

很简单:BeanUtils很奇怪,所以Introspector它使用:

尽管BeanUtils.setProperty声明了一些异常,但它似乎默默地忽略了要设置的属性的不存在。最终的罪魁祸首就是Introspector仅仅需要二传手的虚无。

我称其为设计破坏,但YMMV。这是一个古老的类,在那个黑暗的时代还没有发明流畅的界面。使用Accessors(chain=false)以禁用链接。


更重要的是:使用来源。获取它并获取调试器(它已经在您的IDE中)可以自己找到它(仍然可以询问它是否不起作用,请再努力一点)。