我有这两节课:
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
的列表...
有什么想法吗?
答案 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从一个类映射到另一个类,但是您还需要从ConfigurationParameterForm
到Parameter
的映射>