首页 > 解决方案 > ModelMapper 将 List<...> 映射到对象属性

问题描述

我正在努力将 List 映射到 responseDTO.getList()

我的代码:

消息DTO

 @Getter
 @Setter
 public Class MessageDTO() {
   private String message;
   ...
 }

消息DTO

@Getter
@Setter
public Class MessagesDTO() {
  private List<> message;
}

我的转换器

public class MyConverter extends AbstractConverter<List<MessageDTO>, MessagesDTO> {

    @Override
    protected ChatMessagesResponseDTO convert(List<MessageDTO> source) {
      MessagesDTO destination = new MessagesDTO();
      destination.setMessages(source);
      return destination;
    }
}

控制器

...
List<MessageDTO> messages = ... // result of service and succesfull mapping entity to dto
ModelMapper mm = new ModelMapper();
Converter conv = new MyConverter();
mm.addConverter(conv);
MessagesDTO messagesDTO = mm.map(messages, MessagesDTO.class)
return messagesDTO; // always null

任何想法为什么它不起作用?即使使用自定义 TypeMap(s) 和 Converter(s),我也可以在项目的许多其他地方成功使用 modelmapper,但找不到如何将某种类型的列表映射到该类型列表的 DTO 属性的方法。

标签: javaspringmodelmapper

解决方案


这是因为类型擦除。ModelMapper无法识别 a 的泛型类型,List因此不应用您的转换器。我不确定是否可以通过您提供的课程来实现,但如果可以的话,这可能是一项相当复杂的任务。

一种解决方案是声明具有存储运行时类型的类。就像:

@SuppressWarnings("serial")
public static class MessageDTOList extends ArrayList<MessageDTO> {};

并对您的转换器进行必要的更改,以便:

public class MyConverter extends AbstractConverter<MessageDTOList, MessagesDTO> {
    @Override
    protected MessagesDTO convert(MessageDTOList source) {
      MessagesDTO destination = new MessagesDTO();
      destination.setMessages(source);
      return destination;
    }
}

如果很难直接获得响应,MessageDTOList您可以随时:

List<MessageDTO> messages = ... // result of service and succesfull mapping entity
MessageDTOList messagesDerived = new MessageDTOList();
messagesDerived.addAll(messages);

然后只是:

MessagesDTO messagesDTO = mm.map(messagesDerived, MessagesDTO.class);

推荐阅读