Java:将属性从bean复制到另一个

时间:2018-11-27 12:04:24

标签: java

我有这两节课:

public class ServiceConfiguration {
    private String id;
    private List<Parameter> parameters;
}

public class ConfigurationUpdateForm {

    @NotEmpty private String id;

    @NotEmpty @Valid private Collection<ConfigurationParameterForm> parameters;
}

我需要将所有属性从ConfigurationUpdateForm对象复制到ServiceConfiguration对象:

ServiceConfiguration serviceConfiguration = new ServiceConfiguration();
try {
    BeanUtils.copyProperties(serviceConfiguration, configurationForm);
} catch (IllegalAccessException | InvocationTargetException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}

但是它不能正确复制parameters集合。

copyProperties之后出现了什么问题,destinationbean.parameters包含一个ParameterTypeForm的列表,而不是Parameter的列表...

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

BeanUtils.copyProperties(serviceConfiguration, configurationForm)只会在名称相同的所有情况下将一个类的所有bean属性复制到另一类。

由于两个类都包含parameters属性,因此BeanUtils只会复制该值。

这就是结果中发生的事情,ServiceConfiguration内的参数突然包含ConfigurationParameterForm对象的列表。

这是因为复制仅进行了一层深度,而且还因为在运行时没有什么阻止List包含与声明中指定的对象不同类的对象。

例如:

public class Dog {
    @Override
    public String toString() {
        return "I'm a dog";
    }
}

public class Cat {
    @Override
    public String toString() {
        return "I'm a cat";
    }
}

public static void main(String[] args) {
    List<Dog> dogs = new ArrayList<>();
    dogs.add(new Dog());

    addCat(dogs);

    System.out.println(dogs);
}

public static void addCat(List cats) {
    cats.add(new Cat());
}

运行上面的代码将导致: [I'm a dog, I'm a cat]

一种可能的解决方案是添加您自己的映射方法,该方法将使用getter和setter从一个类映射到另一个类,但是您还需要从ConfigurationParameterFormParameter的映射