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);
我正在努力将 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);