gpt4 book ai didi

java - 如何映射来自同一源类的扩展 DTO

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:12:29 25 4
gpt4 key购买 nike

我已经开始使用 Mapstruct 将 JPA 实体映射到 DTO。对于基本实体,这很有效。

我的问题:一些实体有延迟加载的集合,包含额外的细节,我不想总是想要获取和映射。作为解决方案,我添加了一个包含始终映射的所有字段的基本父类(super class),以及一个包含集合的子类。它们都代表相同的实体,因此它们使用相同的源类。

当我尝试创建一个 Mapper,其中包含从同一源映射到两种类型的方法时,我收到一个映射方法不明确的错误,即使方法签名(至少返回类型)不同。我会以错误的方式解决这个问题吗?我不能使用相同来源的 DTO 使用子类吗?

编辑:以防万一,我正在使用 mapstruct-jdk8:1.1.0.Final

编辑 2:下面的例子只是我脑海中的一个例子。当我实际使用代码时,它起作用了。事实证明,我的问题出在示例中未包含的内容上。似乎是在我添加映射票证集合的方法时发生错误。这可能意味着问题不(直接?)与继承相关。我可能缺少一些配置,但我不确定要查找什么。

简单的例子:

工单实体

public class Ticket {
private long id;
private String title;
private Set<Comment> comments;

// Getters and setters
}

票证 DTO

public class TicketDTO {
private long id;
private String title;

// Getters and setters
}

带有注释 DTO 的票证

public class TicketWithCommentsDTO extends TicketDTO {
private List<CommentDTO> comments;


// Getters and setters
}

工单映射器界面

@Mapper(uses= { CommentMapper.class })
public interface TicketMapper {
TicketDTO mapToTicketDTO(Ticket ticket);

List<TicketDTO> mapToTicketDTOList(Collection<Ticket> tickets); // Adding this method or the last method causes the error

TicketWithCommentsDTO mapToTicketWithCommentsDTO(Ticket ticket);

List<TicketWithCommentsDTO> MapToTicketWithCommentDTOList(Collection<Ticket> tickets);
}

评论映射器界面

@Mapper
public interface CommentMapper {
CommentDTO toCommentDTO(Comment comment);

List<CommentDTO> toCommentDTOList(Collection<Comment> comments);
}

抛出的错误:

 Ambiguous mapping methods found for mapping collection element to 
dto.TicketDTO: dto.TicketDTO mapToTicketDTO(model.Ticket ticket),
dto.TicketWithCommentsDTO mapToTicketWithCommentsDTO(model.Ticket ticket).

最佳答案

好吧,这原来是一个简单的修复,它确实是一个缺少配置的问题。缺少的是 @IterableMapping 注释。

一旦我将 elementTargetType 设置为正确的类型,一切都会按预期进行。

正确的Mapper代码

@Mapper(uses = { CommentMapper.class })
public interface TicketMapper {
TicketDTO mapToTicketDTO(Ticket ticket);

@IterableMapping(elementTargetType = TicketDTO.class)
List<TicketDTO> mapToTicketDTOList(Collection<Ticket> tickets);

TicketWithCommentsDTO mapToTicketWithCommentsDTO(Ticket ticket);

@IterableMapping(elementTargetType = TicketWithCommentsDTO.class)
List<TicketWithCommentsDTO> mapToTicketWithCommentDTOList(Collection<Ticket> tickets);
}

关于java - 如何映射来自同一源类的扩展 DTO,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41979833/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com