Проблема весенней загрузки с отображением сущности на entityDTO - PullRequest
0 голосов
/ 25 сентября 2018

Я использую 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
}

Я хотел бы вернуть OrderDTO с товаром на основе itemID, который мы получаем от клиента (FrontEnd)

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 для modelMapper), а атрибуты, связанные с элементом, в OrderDTO всегда равны нулю.Я хотел бы получить значение Item, основанное на ItemId.

Любая помощь или подсказка будут заметны.Любое предложение с ModelMapper или без него было бы действительно заметно.

Ответы [ 2 ]

0 голосов
/ 29 сентября 2018

Если вы используете 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);

Метод должен находиться в классе jparepository, который вы используете для извлечения Item экземпляров из базы данных.Чтобы это работало, ваш OrderDTO должен иметь конструктор с этим списком параметров.( long itemId, String itemName, String itemUid).Параметры должны быть в том же порядке, что и (s.itemId, s.itemName, s.itemUid).Также всегда убедитесь, что вы создаете конструктор по умолчанию, а также при создании конструктора с параметрами.

0 голосов
/ 29 сентября 2018

Насколько я понимаю, вы используете Page класс org.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());
}
...