首页 > 解决方案 > 将实体映射到 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 的建议都将是非常可观的。

标签: javaspring-bootmodelmapper

解决方案


据我了解,您使用Pageclass 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());
}

推荐阅读