我正在尝试使用mapstruct如下转换对象
来源
MainObject
{
String key;
List<ChildObject> children;
}
ChildObject{
String childVar1;
String childVar2;
}
目标
List<TargetObj> targetObjects;
TargetObj{
String key;
String var1;
String var2;
}
我需要准备一个TargetObj实例的列表,其中的键是从MainObject的键映射而来的,而从ChildObject的映射是var1和var2。 我试图使用mapstruct文档中提到的ObjectFactory和Decorator。但是找不到解决方案。两种情况下,我都收到一个错误,指出无法从非迭代参数返回可迭代对象。
答案 0 :(得分:1)
您可以像这样使用Java8解决它,
List<TargetObj> targets = Stream.of(mainObject)
.flatMap(mo -> mo.getChildren().stream()
.map(c -> new TargetObj(mo.getKey(), c.getChildVar1(), c.getChildVar2())))
.collect(Collectors.toList());
答案 1 :(得分:0)
您可以尝试将@BeforeMapping
或@AfterMapping
与@Context
结合使用。
您的映射器可能如下所示:
@Mapper
public interface MyMapper {
default List<TargetObj> map(MainObject source) {
if (source == null) {
return Collections.emptyList(); // or null or whatever you prefer
}
return map(source.getChildren(), new CustomContext(source));
}
List<TargetObject> map(List<ChildObject> children, @Context CustomContext context);
@Mapping(target = "key", ignore = true) // key is mapped in the context
TargetObject map(ChildObject child, @Context CustomContext context);
}
自定义上下文如下所示:
public class CustomContext {
protected final MainObject mainObject;
public CustomContext(MainObject mainObject) {
this.mainObject = mainObject;
}
@AfterMapping // of @BeforeMapping
public void afterChild(@MappingTarget ChildObject child) {
child.setKey(mainObject.getKey());
// More complex mappings if needed
}
}
目标是通过使用MapStruct将生成的其他方法,将您的MainObject
到List<TargetObj>
进行手动映射