MapStruct:对象的映射列表,当对象是从两个对象映射而来的

新手上路,请多包涵

假设我有这样的映射:

 @Mapping(source = "parentId", target = "parent.id")
Child map(ChildDto dto, Parent parent);

现在我需要将 ChildDto 列表映射到 Child 列表,但它们都有相同的父级。我希望做这样的事情:

 List<Child> map(List<ChildDto> dtoList, Parent parent);

但它不起作用。有机会做吗?

原文由 AlexB 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 762
1 个回答

我找到了如何用装饰器实现它,谢谢@Gunnar 这是一个实现:

豆子

public class Child {
    int id;
    String name;
}
public class Parent {
    int id;
    String name;
}
public class ChildDto {
    int id;
    String name;
    int parentId;
    String parentName;
}
// getters/settes ommited

映射器

@Mapper
@DecoratedWith(ChildMapperDecorator.class)
public abstract class ChildMapper {
    public static final ChildMapper INSTANCE = Mappers.getMapper(ChildMapper.class);

    @Mappings({
            @Mapping(target = "parentId", ignore = true),
            @Mapping(target = "parentName", ignore = true)
    })
    @Named("toDto")
    abstract ChildDto map(Child child);

    @Mappings({
            @Mapping(target = "id", ignore = true),
            @Mapping(target = "name", ignore = true),
            @Mapping(target = "parentId", source = "id"),
            @Mapping(target = "parentName", source = "name")
    })
    abstract ChildDto map(@MappingTarget ChildDto dto, Parent parent);

    @IterableMapping(qualifiedByName = "toDto") // won't work without it
    abstract List<ChildDto> map(List<Child> children);

    List<ChildDto> map(List<Child> children, Parent parent) {
        throw new UnsupportedOperationException("Not implemented");
    }
}

装潢师

public abstract class ChildMapperDecorator extends ChildMapper {
    private final ChildMapper delegate;

    protected ChildMapperDecorator(ChildMapper delegate) {
        this.delegate = delegate;
    }

    @Override
    public List<ChildDto> map(List<Child> children, Parent parent) {
        List<ChildDto> dtoList = delegate.map(children);
        for (ChildDto childDto : dtoList) {
            delegate.map(childDto, parent);
        }
        return dtoList;
    }
}

I use abstract class , not interface for mapper, because in case of interface you couldn’t exclude for generation method map(List<Child> children, Parent parent) , and the生成的代码在编译时无效。

原文由 AlexB 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题