Mapstruct с использованием не создает экземпляр класса - PullRequest
4 голосов
/ 11 апреля 2020

У меня есть следующий Mapper:

@Mapper(componentModel="spring", uses = {DrugstoreService.class})
public abstract class PreregisteredPharmacistMapper {

    @Mapping(source = "drugstoreId", target = "drugstore")
    public abstract PreregisteredPharmacist toEntity (
            PreregisteredPharmacistDTO preregisteredPharmacistDTO
    );

    public abstract void toEntityUpdate (
            @MappingTarget PreregisteredPharmacist preregisteredPharmacist,
            PreregisteredPharmacistDTO preregisteredPharmacistDTO
    );

    public abstract PreregisteredPharmacistDTO toDTO(
            PreregisteredPharmacist preregisteredPharmacist
    );
}

DrugstoreService - это интерфейс со следующей реализацией:

@Service
public class DrugstoreServiceImpl implements DrugstoreService {

    private DrugstoreRepository drugstoreRepository;

    /**
     * DrugstoreServiceImpl constructor.
     *
     * @param drugstoreRepository
     */
    @Autowired
    public DrugstoreServiceImpl (
            DrugstoreRepository drugstoreRepository
    ) {
        this.drugstoreRepository = drugstoreRepository;
    }

    @Override
    public Drugstore findEntityById(Integer id) {
        Optional<Drugstore> drugstore = drugstoreRepository.findById(id);
        if (!drugstore.isPresent()) {
            throw new ResourceNotFoundException("Drugstore", "id", id);
        }

        return drugstore.get();
    }
}

При попытке использовать маппер генерируется исключение NullPointerException, поскольку DrugstoreService является не создан в реализации картографа. Вот скриншот отладки кода: enter image description here Сгенерирована реализация для картографа. Так почему же аптечный сервис не работает?

1 Ответ

2 голосов
/ 11 апреля 2020

Когда используется componentModel, отличный от значения по умолчанию, вы должны использовать соответствующую инфраструктуру внедрения зависимостей для создания экземпляров ваших картографов. В вашем случае вы должны использовать Spring, чтобы получить свой маппер, а не создавать его вручную.

...