ModelMapper 将 List<...> 映射到对象 属性

ModelMapper map List<...> to object property

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

我的代码:

MessageDTO

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

MessagesDTO

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

MyConverter

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 和 Converter,我也成功地在项目的许多其他地方使用了 modelmapper,但是找不到如何将某种类型的列表映射到 DTO 属性的方法,该属性是该类型的列表。

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

一种解决方案是声明 class 具有存储运行时类型。所以喜欢:

@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);