我正在使用spring-boot-1.5.6和modelmapper-1.1.0。我想将实体对象映射到OrderDto
但不知道如何通过modelMapper做到这一点。请找到下面的代码

Order.Java

public class Order {
    private String orderUid;
    private Invoice invoice;
    private List<Item> items;

    //Getter & setter
}

Item.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的建议都是很有意义的。

最佳答案

据我了解,您使用Pageorg.springframework.data类或类似的东西。无论如何,此通用Page类包含与数据一起使用的通用List。我会说,这种构造对于modelMapper而言只是“太通用”。您最好获取数据列表,将其转换并创建一个新的Page

此外

  • 您应该创建一个typeMap来注册一个新的转换器
  • 如果您通过context.getDestination()提供新的目标对象,则
  • modelMapper.map(..)返回的值不为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());
    }
    

    关于java - 将实体映射到EntityDTO的Spring Boot问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52500145/

    10-11 19:55