Дополнительный параметр в mapstruct mapper

У меня есть автомобиль:

  • идентификатор
  • марка
  • модель
  • владелец

И КарДТО:

  • идентификатор
  • марка
  • модель

В моем классе обслуживания я передаю дополнительный параметр «владелец», и мне нужно преобразовать список.

Можно ли добавить «владельца» в Mapper?

Если да, то я полагаю, что это должно быть что-то похожее на это (не работает).

@Mapper
public interface CarMapper {

@Mapping(target = "owner", source = "owner")
List<Car> mapCars(List<CarDTO> cars, String owner);
}

Вы можете попробовать использовать выражение: @Mapping(target = "owner", expression = "java(owner)").

Rob Spoor 20.12.2022 18:01
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
1
218
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Да, это возможно. Вы можете попробовать аннотацию @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 Возможно, вы знаете, что вызывает это?

denu 02.02.2023 15:02

Другие вопросы по теме