У меня есть автомобиль:
И КарДТО:
В моем классе обслуживания я передаю дополнительный параметр «владелец», и мне нужно преобразовать список.
Можно ли добавить «владельца» в Mapper?
Если да, то я полагаю, что это должно быть что-то похожее на это (не работает).
@Mapper
public interface CarMapper {
@Mapping(target = "owner", source = "owner")
List<Car> mapCars(List<CarDTO> cars, String owner);
}




Да, это возможно. Вы можете попробовать аннотацию @Context перед «владельцем».
Я бы предложил что-то вроде этого:
@Mapper
public interface CarMapper {
@Maping(target = "owner", source = "owner")
Car mapCar(CarDTO car, @Context String owner);
@Maping(target = "owner", source = "owner")
List<Car> mapAllCars(List<CarDTO> cars, @Context String owner);
@AfterMapping
default void afterMapping(@MappingTarget Car target, @Context String owner) {
target.setOwner(owner);
}
Есть несколько способов приблизиться к вашей проблеме. Вы также можете посмотреть Передача дополнительных параметров в MapStruct mapper
Как описано в ответе, вы можете использовать @Context.
Во-первых, добавьте один метод сопоставления объектов:
@Maping(target = "owner", source = "owner")
Car mapCar(CarDTO car, String owner);
Затем определите метод для отображения списка объектов с помощью @Context:
List<Car> mapCars(List<CarDTO> cars, @Context String owner);
Поскольку параметры
@Contextне предназначены для использования в качестве источника параметры, необходимо добавить прокси-метод, чтобы указать MapStruct на правильный метод отображения одного объекта, чтобы заставить его работать.
В конце добавьте метод прокси:
default Car mapContext(CarDTO car, @Context String owner) {
return mapCar(car, owner);
}
Я получаю сообщение об ошибке сборки java: в исходных параметрах не существует свойства с именем «владелец». Вы имели в виду "yyy"? mapstruct 1.5.3.Final Возможно, вы знаете, что вызывает это?
Вы можете попробовать использовать выражение:
@Mapping(target = "owner", expression = "java(owner)").