#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);
}