Как внедрить (custructor) боб весны в абстрактный картограф Mapstruct? - PullRequest
0 голосов
/ 18 октября 2019

У меня ниже класса mapper, в котором я хочу использовать CounterService. Я пытаюсь внедрить конструктор, но это не работает, и null печатает.

@Mapper(componentModel = "spring", uses = CounterService.class, injectionStrategy = InjectionStrategy.CONSTRUCTOR)
public abstract class CarMapper {

    private CounterService counterService;

    public CarMapper(CounterService counterService) {
       this.counterService = counterService;
    }

    public abstract Car dtoToEntity(CarDto carDto);

    public CarDto entityToDto(Car car) {
        System.out.println(counterService)
        //....
        return carDto;
    }

}

Класс реализации mapStruct

@Component
public class CarMapperImpl extends CarMapper{

  @Override
  public Car dtoToEntity(CarDto carDto){
    //...
  }
}

Если я использую инъекцию поля, используя @AutoWired,таким образом, он работает нормально. Это означает, что Spring не поддерживает внедрение в конструкцию класса abstract. Это потому, что abstract класс не может быть создан непосредственно и требует создания подкласса для создания экземпляра?
Есть ли способ mapStruct создать конструктор внутри класса реализации как:

  public CarMapperImpl(CounterService counterService){
    super(counterService);
  }

Кстати, конструктор инъекций должен работать.

1 Ответ

0 голосов
/ 20 октября 2019

Это не имеет никакого отношения к весне. Это было преднамеренное решение, принятое командой MapStruct, чтобы не использовать супер-конструкторы.

Что вы можете сделать, так это использовать инъекцию сеттера.

@Mapper(componentModel = "spring", uses = CounterService.class, injectionStrategy = InjectionStrategy.CONSTRUCTOR)
public abstract class CarMapper {

    private CounterService counterService;

    public abstract Car dtoToEntity(CarDto carDto);

    public CarDto entityToDto(Car car) {
        System.out.println(counterService)
        //....
        return carDto;
    }

    @Autowired
    public void setCounterService(CounterService counterService) {
        this.counterService = counterService;
    }

}
...