Как повторно использовать существующий картограф, когда цель сопоставления использует наследование

#java #mapping #mapstruct

Вопрос:

У меня есть Inventory класс и InventoryResponse класс.

 public class Inventory {
  private InventoryStatus inventoryStatus;
}

public class InventoryResponse {
  private string inventoryStatus;    
}
 

Я могу создать сопоставление от инвентаризации до инвентаризации с помощью сопоставления.

 @JsonInclude(JsonInclude.Include.NON_NULL)
@Mapper(unmappedTargetPolicy = ReportingPolicy.IGNORE)

public abstract class InventoryResponseMapper {

  @Mapping(source = "inventoryStatus.inventoryStatusCd", target = "inventoryStatus")
  public abstract InventoryResponse toInventoryResponse(Inventory inventory);

}
 

Теперь у меня есть новая версия response InventoryResponseV1 , в которой есть дополнительное свойство, называемое inventoryId . Для повторного использования я расширил InventoryResponse класс.

 public class InventoryResponseV1 extends InventoryResponse {
   private String inventoryId;
}
 

Теперь, чтобы сопоставить Inventory InventoryResponseV1 , я хотел повторно использовать InventoryResponseMapper класс, используя, uses = {InventoryResponseMapper.class}

 @JsonInclude(JsonInclude.Include.NON_NULL)
@Mapper(unmappedTargetPolicy = ReportingPolicy.IGNORE, uses = {InventoryResponseMapper.class})

public interface InventoryResponseV1Mapper {
    @Mapping(target = "inventoryId", expression = "java(java.util.UUID.randomUUID())")
    InventoryResponseV1 toInventoryResponseV1(Inventory inventory);
}
 

Я ожидаю, что все существующие сопоставления из инвентаря в InventoryResponseV1 будут разрешены с помощью InventoryResponseMapper (InventoryResponseV1-это InventoryResponse).

Как бы то ни было, сопоставление завершается со следующей ошибкой:

ошибка: Не удается сопоставить свойство «com.MyOrg.InventoryStatus inventoryStatus» в «java.lang.Строковый инвентаризационный статус». Подумайте о том, чтобы объявить/реализовать метод сопоставления: «java.lang.Карта строк(com.MyOrg.значение инвентаризационного статуса)». Инвентарный ответ1 на Изобретательский ответ1(товарный запас);

Является ли это ожидание неверным, принимая во внимание структуру карты? Я также пробовал использовать @DecoratedWith, но понял, что у него другой вариант использования.

Ответ №1:

Для повторного использования подобной конфигурации вам необходимо использовать MapperConfig .

Поэтому в вашем случае использования вы можете сделать что-то вроде:

 @Mapper(unmappedTargetPolicy = ReportingPolicy.IGNORE, config = InventoryResponseMapper.class)
public interface InventoryResponseV1Mapper {

    @Mapping(target = "inventoryId", expression = "java(java.util.UUID.randomUUID())")
    @InheritConfiguration
    InventoryResponseV1 toInventoryResponseV1(Inventory inventory);

}
 

и вы также можете настроить свой другой картограф

напр.

 @MapperConfig
@Mapper(unmappedTargetPolicy = ReportingPolicy.IGNORE)
public abstract class InventoryResponseMapper {

  @Mapping(source = "inventoryStatus.inventoryStatusCd", target = "inventoryStatus")
  public abstract InventoryResponse toInventoryResponse(Inventory inventory);

}