当前位置: 首页 > 知识库问答 >
问题:

如何从同一源类映射扩展DTO

长孙嘉
2023-03-14

当我试图创建一个包含方法的映射器以从同一个源映射到两个类型时,我会得到一个不明确的映射方法错误,即使方法签名(至少返回类型)是不同的。我是不是走错路了?我不能为使用相同源代码的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).

共有1个答案

屈浩波
2023-03-14

嗯,这是一个简单的修复,它确实是一个丢失的配置问题。缺少的是@iterableMapping注释。

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

正确的映射器代码

@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);
}
 类似资料:
  • 关于MapStruct的问题。我有这样的情况,我从基实体扩展类,但不知道如何映射它。这是我的箱子。 BaseEntity: 基础: 没有显示错误,在映射器实现(生成的代码)中没有该ID的映射:

  • Hi这似乎适用于添加额外的方法,但不适用于在现有方法上添加新的注释。假设我们有以下课程:

  • 我有一个特点和扩展它的对象。 我想创建这个对象的列表并映射到上面: 以及实现Poly函数的不同尝试: 编译器告诉我: 错误:(45,43)找不到参数映射器的隐式值:无形状。ops。hlist。映射器[com.test.EncodePoly.type,com.test.A.type::com.test.B.type::com.test.C.type::shapeless.HNil]val结果:Lis

  • 因此,当我将对象转换为JSON字符串时: dob以以下方式写入JSON字符串: “dob”:{“年份”:1964,“月份”:“二月”,“纪年”:{“日历类型”:“ISO8601”,“ID”:“ISO”},“月份值”:2,“DayofMonth”:13,“DayofWeek”:“星期四”,“Era”:“CE”,“DayofYear”:44,“LeapYear”:true 所以,我不知道我是如何做到这

  • 问题内容: 我有两个字符串: 我通过反思上课 我想要aClass扩展b,例如: 如何实现呢? 如何获得okClass? 谢谢! 问题答案: 除了使用仅通过接口工作的JDK动态代理外,您还可以使用CGLIB或javassist在运行时扩展类。

  • 问题内容: 有这样的事情: 抽象类: 和扩展器: 我想要的是扩展,因为如果不处理它,然后尝试在中处理它。例如add- 但同时让类处理默认值,例如。 这是完全错误的方法吗? 到目前为止,我所做的就是添加一个接口。通常: 在课堂上: 在课堂上: 这看起来像是可用的设计吗? 并且,主要问题: 有没有什么好办法扩展该类,以便可以使用与in 中相同的切换方法?我想知道的是,有没有一个更好的设计,第二个是是否