Java:ModelMapper不编译包含集合列表的嵌套对象
我正在使用ModelMapper v0.7.7 我的课程如下所示:Java:ModelMapper不编译包含集合列表的嵌套对象,java,spring,maven,modelmapper,javax,Java,Spring,Maven,Modelmapper,Javax,我正在使用ModelMapper v0.7.7 我的课程如下所示: public class ParentClassOne { protected String someValue1; protected String someValue2; protected ChildClassOne itemOne; public ChildClassOne getItemOne() { return itemOne; } publi
public class ParentClassOne {
protected String someValue1;
protected String someValue2;
protected ChildClassOne itemOne;
public ChildClassOne getItemOne() {
return itemOne;
}
public void setItemOne(ChildClassOne itemOne) {
this.itemOne = itemOne;
}
...setter and getter methods for the rest of fields...
}
public class ParentClassOne {
...this class contains the same elements like the first one...
}
public ChildClassOne {
protected List<ChildAnyClass> children;
...getter method...
Notice: ...there is no setter method for the list....
}
我的ModelMapper配置如下所示:
ModelMapper modelMapper = new ModelMapper();
modelMapper.getConfiguration().setMatchingStrategy(MatchingStrategies.STANDARD);
modelMapper.getConfiguration().setMethodAccessLevel(AccessLevel.PUBLIC);
modelMapper.getConfiguration().setFieldAccessLevel(AccessLevel.PROTECTED);
当我想将一个对象转换为另一个对象时,我使用以下源代码:
info.p2.ParentClassOne result = modelMapper.map(data, info.p2.ParentClassOne.class);
modelMapper.addConverter(converter);
当然,这意味着数据是由包info.p1中的第一个类创建的对象
当我执行这个源代码时,只有这些“字符串”变量(someValue1和someValue2)将被填充,但变量“itemOne”将为null,即使我传递了填充了所有属性的完整对象
说明:这两个类都是通过maven和org.apache.cxf->wsdl2java包生成的,因此它们都包含特殊的“javax.xml”注释
Edit1:
两个包中都存在类ChildClassOne。当ModelMapper尝试转换此变量时,它会发现由于包的不同,两个类中的此变量具有完全不同的类型,ModelMapper不会映射此变量
字符串变量(someValue1、someValue2)也是一样,但两个类中的字符串类型相同,并且该类型存在于同一个包中,ModelMapper将映射它们
当然,我可以添加一些手动步骤来解决这个简单的示例,但在实际情况中,我有一个包含许多嵌套对象的更复杂的对象
Edit2:
我注意到的问题是,当我问这些问题时,我确实知道,在我的孩子一班里,收藏清单。ModelMapper无法映射包含任何类型集合的任何对象。在我的课程列表中,如下所示:
public class ParentClassOne {
protected String someValue1;
protected String someValue2;
protected ChildClassOne itemOne;
public ChildClassOne getItemOne() {
return itemOne;
}
public void setItemOne(ChildClassOne itemOne) {
this.itemOne = itemOne;
}
...setter and getter methods for the rest of fields...
}
public class ParentClassOne {
...this class contains the same elements like the first one...
}
public ChildClassOne {
protected List<ChildAnyClass> children;
...getter method...
Notice: ...there is no setter method for the list....
}
publicchildclassone{
受保护儿童名单;
…吸气剂法。。。
注意:…列表没有setter方法。。。。
}
如果嵌套对象中没有集合,ModelMapper将映射所有这些对象,但在我的情况下,我的每个嵌套对象中都有集合。我正在搜索并找到以下可使用的解决方案:
ModelMapper modelMapper = new ModelMapper();
Converter<ObjectOne, ObjectTwo> converter = new Converter<ObjectOne, ObjectTwo>() {
public ObjectTwo convert(MappingContext<ObjectOne, ObjectTwo> context) {
ObjectTwo dest = new ObjectTwo();
if (context.getSource() != null) {
// Converts list from source object into the list of destination object
Type listType = new TypeToken<List<ObjectTwo>>() {}.getType();
List<ObjectTwo> items = modelMapper.map(context.getSource().getList(), listType);
dest.getList().addAll(items);
return dest;
} else {
return dest;
}
}
};
如果有一个或两个嵌套集合,这是一个很好的解决方案,但如果有多个嵌套集合,则必须为每个嵌套集合编写转换器
如果有人知道如何使用多个嵌套集合解决此问题,请与我们共享。这将解决一个问题,即当您有一个嵌套对象包含列表时,但如果您有一个包含列表的对象,则该列表也包含少量嵌套列表,则此方法无法解决此问题。