Java:ModelMapper不编译包含集合List的嵌套对象
Java: ModelMapper does not compile nested objects that contain collection List
我正在使用 ModelMapper v0.7.7
我的 classes 如下所示:
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...
}
我的 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);
当然这意味着 data 是由包 info.p1 中的第一个 class 创建的对象。
当我执行此源代码时,只会填充这些 "String" 变量(someValue1 和 someValue2),但变量 "itemOne" 将为空,即使我传递了所有属性都已填充的完整对象。
指示: 这两个 classes 都是通过带有 org.apache.cxf -> wsdl2java 包的 maven 生成的,所以它们都包含特殊的 "javax.xml"注释。
编辑 1:
Class ChildClass两个包中都存在一个。当 ModelMapper 尝试转换它时,它会识别出两个 classes 中的这个变量由于包不同而具有完全不同的类型,因此 ModelMapper 不会映射这个变量。
字符串变量 (someValue1, someValue2) 是一样的,但是字符串类型在两个 classes 中是相同的,并且这种类型存在于同一个包中,然后 ModelMapper 将映射它们。
当然,我可以添加一些手动步骤来解决这个简单的示例,但在实际情况中,我有更复杂的对象,其中包含许多嵌套对象。
编辑2:
我注意到的问题,我在提问时确实知道,是我的 ChildClassOne 中的集合列表。 ModelMapper 不能映射包含任何类型集合的任何对象。在我的 classes 列表中如下所示:
public ChildClassOne {
protected List<ChildAnyClass> children;
...getter method...
Notice: ...there is no setter method for the list....
}
如果嵌套对象中没有集合,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;
}
}
};
现在只需要使用以下源代码将您的转换器添加到 ModelMapper 中:
modelMapper.addConverter(converter);
如果你有一个或两个嵌套集合,这是一个很好的解决方案,但如果你有多个嵌套集合,那么你必须为每个嵌套集合编写转换器。
如果有人知道如何使用多个嵌套集合解决此问题,请与我们分享。
我正在使用 ModelMapper v0.7.7 我的 classes 如下所示:
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...
}
我的 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);
当然这意味着 data 是由包 info.p1 中的第一个 class 创建的对象。
当我执行此源代码时,只会填充这些 "String" 变量(someValue1 和 someValue2),但变量 "itemOne" 将为空,即使我传递了所有属性都已填充的完整对象。
指示: 这两个 classes 都是通过带有 org.apache.cxf -> wsdl2java 包的 maven 生成的,所以它们都包含特殊的 "javax.xml"注释。
编辑 1: Class ChildClass两个包中都存在一个。当 ModelMapper 尝试转换它时,它会识别出两个 classes 中的这个变量由于包不同而具有完全不同的类型,因此 ModelMapper 不会映射这个变量。
字符串变量 (someValue1, someValue2) 是一样的,但是字符串类型在两个 classes 中是相同的,并且这种类型存在于同一个包中,然后 ModelMapper 将映射它们。
当然,我可以添加一些手动步骤来解决这个简单的示例,但在实际情况中,我有更复杂的对象,其中包含许多嵌套对象。
编辑2: 我注意到的问题,我在提问时确实知道,是我的 ChildClassOne 中的集合列表。 ModelMapper 不能映射包含任何类型集合的任何对象。在我的 classes 列表中如下所示:
public ChildClassOne {
protected List<ChildAnyClass> children;
...getter method...
Notice: ...there is no setter method for the list....
}
如果嵌套对象中没有集合,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;
}
}
};
现在只需要使用以下源代码将您的转换器添加到 ModelMapper 中:
modelMapper.addConverter(converter);
如果你有一个或两个嵌套集合,这是一个很好的解决方案,但如果你有多个嵌套集合,那么你必须为每个嵌套集合编写转换器。
如果有人知道如何使用多个嵌套集合解决此问题,请与我们分享。