复制来自不同类的列表项时Apache BeanUtils行为冲突

时间:2015-06-19 06:08:38

标签: java apache-commons-beanutils

我正在开发一个将一个类的数据复制到另一个类的应用程序。

我正在尝试测试getter-setter方法是否正常。为了改进test coverage,我正在制作一些类和方法,使用podamfactory来填充给定班级成员中的数据。

然后我使用apache BeanUtils将该对象的数据复制到其他对象。

然后我断言两个对象检查两者是否有相同的数据!

我面临的问题是: 我创建了3个类:

  
      
  1. Starter.java [有运行应用程序的主要方法]
  2.   
  3. ChildClass.java [只有1个成员,即字符串集合及其getter方法和添加方法以在该成员中添加数据]
  4.   
  5. ParentClass.java [在此类ChildClass'实例中已经创建并实例化了相关的getter和setter方法。还有hashcode和equals方法]
  6.   

代码:

public class Starter {

    static final PodamFactory factory = new PodamFactoryImpl();

    public static void main(String[] args) throws Exception {
        System.out.println("Start");
        testClasses(ParentClass.class);
        System.out.println("End");
    }

    public static void testClasses(final Class<?> klass) throws Exception {
        final Object source = factory.manufacturePojo(klass);
        final Object destination = klass.newInstance();
        BeanUtils.copyProperties(destination, source);
        Assert.assertEquals(source, destination);
        Assert.assertNotEquals(source, new Object());
        Assert.assertEquals(source.hashCode(), destination.hashCode());
    }
}

Main方法中,我正在通过ParentClass检查它的getter setter。 testClasses方法执行复制和assertion的主要工作。

当我调试时,我发现在copying properties课后,子类的实例有列表,并且有5个成员。在这两个对象中,List元素中有5个成员。

但是当我在ChildClass中传递Main时,请尝试调试我5 elementsource中的destination } 0 element之后它有copying properties

所以我不理解BeanUtils的这种行为,需要做什么如果我在ChildClass中传递Main时需要同样的工作?

当我通过ParentClass时,它有不同的行为,当我通过ChildClass时,它在Copying properties中有不同的行为。

我创建了GitHub Repository来显示我的代码。您可以访问和检查我的应用程序的代码。

我为gradle创建了简单的dependency management项目。

如果有人了解更多信息,请告诉我。

感谢。

1 个答案:

答案 0 :(得分:0)

BeanUtils遵循Java Bean意义上的属性的严格定义,即每个属性必须具有名称为 get 的getter +字段的名称和名称为 set 的setter + name of name一个领域。您的子类不包含setFields()setter。换句话说,你可以像这样改变它

public class ChildClass {

    private final List<String> fields = new ArrayList<>();

    public List<String> getFields() {
        return this.fields;
    }

    public List<String> setFields(List<String> fields) {
        this.fields = fields;
    }
}

或者

public class ChildClass {

    private final List<String> fields = new ArrayList<>();

    public List<String> getFields() {
        return this.fields;
    }

    public List<String> setFields(List<String> fields) {
        this.fields.clear();
        this.fields.addAll(fields);
    }
}