Как использовать собственный картограф с mapstruct с вложенными значениями и условными значениями - PullRequest
0 голосов
/ 11 октября 2019

Я пытаюсь сопоставить один объект другому, используя mapstrut, и в настоящее время сталкиваюсь с некоторыми проблемами, связанными с использованием его в некоторых случаях.

public class TargetOrderDto {
    String id;
    String preferedItem;
    List<Item> items;
    String status;
    Address address;

}

public class Item {
  String id;
  String name;
}


public abstract class TargetOrderMapper {

  @Autowired
  private StatusRepository statusRepository;

  @Mappings({
      @Mapping(target = "id", source = "reference"),
      @Mapping(target = "preferedItem", source = ""), // Here I need to loop through these values checking for a single value with a specific tag
      @Mapping(target = "items", source = "items"),   // List of objects to another list of different data types. 
      @Mapping(target = "status", source = "remoteStatus") // may need to extract a value from a repository
  })
  abstract OrderDto toTargetOrderDto(RemoteOrder remoteOrder);

}

// Remote Data

public class RemoteOrder {
  String reference;
  List<Item> items;
  String remoteStatus;
}


public class RemoteItem {
  String id;
  String flag;
  String description;
}

Это текущие сценарии, в которых я не смог разобраться (возможно, я картирую сложный объект).

  1. preferedItem : для этого мне нужно выполнить цикл по элементам в заказе и идентифицировать элемент с определенным флагом. (если оно совпадает, тогда я беру это значение, иначе я использую ноль)
  2. items : мне нужно преобразовать это в список из 2 разных списков;Список из списка, у всех свои правила сопоставления.
  3. remoteStatus : Это немного сложнее, мне нужно извлечь статус из remoteOrder, а затем посмотреть в БД, используя statusRepository для альтернативного сопоставленного значения в дБ.

любая помощь высоко ценится.

1 Ответ

0 голосов
/ 13 октября 2019

Вы не можете делать бизнес-логику с MapStruct. Так что держите отображения простыми и определяйте свои собственные методы, когда дело доходит до условных отображений в списке. Примечание: вы можете написать свой собственный метод, и MapStruct выберет его. Кроме того, из этой собственной реализации вы можете снова обратиться к методам MapStruct.

public abstract class TargetOrderMapper {

  @Autowired
  private StatusRepository statusRepository;

  @Mappings({
      @Mapping(target = "id", source = "reference"),
      @Mapping(target = "preferedItem", source = ""), // Here I need to loop through these values checking for a single value with a specific tag
      @Mapping(target = "items", source = "items"),   // List of objects to another list of different data types. 
      @Mapping(target = "status", source = "remoteStatus") // may need to extract a value from a repository
  })
  abstract OrderDto toTargetOrderDto(RemoteOrder remoteOrder);

  protected List<Item> toItemList(List<Item> items) {
     // do what ever you want..
     // and call toItem during iterating.
  }

  protected abstract Item toItem(Item item);
}

То же самое относится и к состоянию. Я добавил FAQ FAQ некоторое время назад о списке (в основном об обновлении, но я думаю, что то же самое применимо и здесь).

О поисках, вы можете использовать @MappingContext для передачи контекстакоторый содержит логику для доступа к БД. Смотри здесь

...