Mapstruct, отображение на вложенные объекты из нескольких входных параметров - PullRequest
0 голосов
/ 12 февраля 2020

Учитывая набор из пяти объектов:

KeyDto{String id}

ValueDto{String name, String value, String description}

Key{String id, String name}

Value{String value, String description}

Target{Key key, Value value}

Я хотел бы создать картограф с двумя параметрами:

 Target dtosToTarget(KeyDto keyDto, ValueDto valueDto);

Тем не менее, кажется, что определение только вспомогательных методов для Key и Value этого недостаточно:

@Mapping(source = "keyDto.id", target = "id")
@Mapping(source = "valueDto.name", target = "name")
Key keyDtoAndValueDtoToKey(KeyDto keyDto, ValueDto valueDto);

Value valueDtoToValue(ValueDto valueDto);

Это приводит к ошибке фактического метода dtosToTarget:

Ошибка: (17, 19) java: Невозможно отобразить свойство "java .lang.String value "to" mapping.Value value ". Подумайте о том, чтобы объявить / реализовать метод отображения: «mapping.Value map (java .lang.String value)».

Единственное решение, о котором я мог подумать - это определение пользовательских java выражений для вызова необходимых методы, такие как

@Mapping(target = "key", expression = "java(keyDtoAndValueDtoToKey(keyDto, valueDto))")
@Mapping(target = "value", expression = "java(valueDtoToValue(valueDto))")

Есть ли более чистый подход?

Ответы [ 2 ]

2 голосов
/ 15 февраля 2020

Ошибка, которую вы видите, заключается в том, что по умолчанию MapStruct попытается отобразить valueDto.value в Target.value, то есть String в Value.

Однако вы можете настроить это следующим образом:

@Mapper
public MyMapper {

    @Mapping( target = "key.id", source = "keyDto.id")
    @Mapping( target = "key.name", source = "valueDto.name")
    @Mapping( target = "value", source = "valueDto")
    Target dtosToTarget(KeyDto keyDto, ValueDto valueDto);

    Value valueDtoToValue(ValueDto valueDto);
}
0 голосов
/ 13 февраля 2020

Попробуйте:

@Mapping(source = "valueDto.name", target = "name")
void keyDtoAndValueDtoToKey(@MappingTarget KeyDto keyDto, ValueDto valueDto);

Это сохранит все поля из Key Dto как есть и отобразит обязательные поля из valueDto в соответствии с настройкой.

...