java - 将实体映射到 entityDTO 的 Spring Boot 问题
问题描述
我正在使用 spring-boot-1.5.6 和 modelmapper-1.1.0。我想将实体对象映射到 OrderDto,但不知道如何通过 modelMapper 来实现。请找到以下代码
订单.Java
public class Order {
private String orderUid;
private Invoice invoice;
private List<Item> items;
//Getter & setter
}
项目.java
public class Item {
private String itemId;
private String itemName;
private String itemUid;
private String isbn;
//other details of item
//Getter & setter
}
OrderDTO.java
public class OrderDTO {
private String orderUid;
private Invoice invoice;
private String itemId;
private String itemName;
private String itemUid;
private String isbn;
//other details of item
//Getter & setter
}
我想根据我们从客户端(前端)获得的 itemID 返回带有项目的 OrderDTO
public Page<OrderDTO> convertOrderEntityToDTO (Page<Order> orderList,String itemId) {
ModelMapper modelMapper = new ModelMapper();
Type listType = new TypeToken<Page<OrderDTO>>() {}.getType();
modelMapper.addConverter((MappingContext<Order, OrderDTO> context) -> {
Item item = context.getSource().getItems().stream()
.filter(item -> equalsIgnoreCase(item.getItemId,itemId))
.findAny().orElse(null);
if (item != null) {
OrderDTO orderDTO = context.getDestination();
orderDTO.setItemId(item.getItemId());
orderDTO.setItemName(item.getItemName());
orderDTO.setItemUid(item.getItemUid());
orderDTO.setIsbn(item.getIsbn());
return orderDTO;
}
return null;
});
Page<OrderDTO> addonServices = modelMapper.map(orderList, listType);
}
在上述方法中,转换器从未被调用(可能是因为modelMapper的TypePair不正确)并且OrderDTO中的项目相关属性始终为null。我想根据 ItemId 获取 Item 值。
任何帮助或提示都将是可观的。任何带有或不带有 modelMapper 的建议都将是非常可观的。
解决方案
据我了解,您使用Page
class oforg.springframework.data
或类似的东西。无论如何,这个泛型Page
类包含List
您的数据的泛型。我会说,这种结构对于 modelMapper 来说“太通用了”。您最好获取数据列表,将其转换并创建一个新的Page
.
此外
您应该创建一个
typeMap
来注册一个新的转换器context.getDestination()
如果您通过 提供新的目标对象,则返回非空modelMapper.map(..)
。在你的情况下,你会得到null
.
这是我对您convertOrderEntityToDTO
方法的看法:
public Page<OrderDTO> convertOrderEntityToDTO(Page<Order> orderList, String itemId) {
ModelMapper modelMapper = new ModelMapper();
modelMapper.createTypeMap(Order.class, OrderDTO.class)
.setConverter(context -> context.getSource().getItems().stream()
.filter(o -> equalsIgnoreCase(o.getItemId(), itemId))
.findAny().map(o -> {
OrderDTO orderDTO = new OrderDTO();
orderDTO.setItemId(o.getItemId());
orderDTO.setItemName(o.getItemName());
orderDTO.setItemUid(o.getItemUid());
orderDTO.setIsbn(o.getIsbn());
return orderDTO;
}).orElse(null));
List<OrderDTO> orderDtoList = orderList.getContent().stream()
.map(o -> modelMapper.map(o, OrderDTO.class))
.collect(Collectors.toList());
return new PageImpl<>(orderDtoList, orderList.getPageable(), orderList.getTotalElements());
}
推荐阅读
- swift - 动画消失时不起作用,但出现时起作用
- javascript - Fullcalendar v5 如何使用复选框显示和隐藏事件
- asp.net - 如何将图像上传到 Razor 页面中的模型?
- javascript - 将数据放在文本框上编辑/更新模态 Laravel
- c - CS50 pset4 滤镜(不太舒服) - 模糊功能不起作用
- javascript - 比较两个数组的元素,结果返回不正确的值,为什么?
- django - 使用 Daphne 部署 Django+Channels+Heroku:关闭 Postgre 连接
- azure - Azure AKS:分配静态 IP 后,Kubernetes pod 一直显示 CrashLoopBackOff 状态
- go - 如何在 ctx 处理 websocket 超时
- java - 当 JTextField 内容不等于某个 int 时显示消息