将实体映射到实体DTO的弹簧引导问题



我正在使用spring-boot-1.5.6和modelmapper-1.1.0。我想将实体对象映射到 OrderDto 但不知道如何通过模型映射器进行操作。请找到以下代码

Order.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
}

订购DTO.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返回带有项目的订单DTO

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

在上面的方法中,转换器从未被调用(可能是因为模型映射器的TypePair不正确(和项目相关的属性 在顺序中DTO始终为空。我想获取基于 ItemId 的 Item 值。

任何帮助或提示都是可观的。任何有或没有模型映射器的建议都会非常可观。

据我了解,您使用Pageorg.springframework.data或类似的东西。无论如何,此泛型Page类包含包含数据的泛型List。我想说,这种结构对于 modelMapper 来说"太通用了"。您最好获取数据列表,对其进行转换并创建一个新Page

此外

  • 您应该创建一个typeMap来注册新的转换器

  • 如果按modelMapper.map(..)提供新的目标对象,则context.getDestination()返回不为 null。在您的情况下,您会得到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());
}

如果您使用Spring Data JpaRepositories从数据库中检索数据,则可以创建一个存储库方法来为您创建 DTO。这样的方法看起来像这样:

@Query("SELECT new full.path.OrderDTO(s.itemId, s.itemName, s.itemUid) FROM Item s WHERE s.itemId = :id")
public OrderDTO getOrderDTOByItemId(@Param("id") long id);

该方法应位于用于从数据库中检索Item实例的 jparepository 类中。要实现此目的,您的 OrderDTO 需要具有具有此参数列表的构造函数。( long itemId, String itemName, String itemUid).参数的顺序需要与(s.itemId, s.itemName, s.itemUid)相同。此外,在创建带有参数的构造函数时,请始终确保也创建默认构造函数。

最新更新