Spring Boot не находит компонент Mapper

У меня есть следующий картограф:

@Mapper
@Component
public interface PriceEntityMapper {

    @Mapping(source = "brandId", target = "brandId")
    @Mapping(source = "startDate", target = "startDate", qualifiedByName = "timestampToLocalDateTime")
    @Mapping(source = "endDate", target = "endDate", qualifiedByName = "timestampToLocalDateTime")
    @Mapping(source = "priceList", target = "priceList")
    @Mapping(source = "productId", target = "productId")
    @Mapping(source = "priority", target = "priority")
    @Mapping(source = "price", target = "price")
    @Mapping(source = "curr", target = "currency")
    Price priceEntityToPrice(PriceEntity priceEntity);

    @Named("timestampToLocalDateTime")
    default LocalDateTime timestampToLocalDateTime(Timestamp timestamp) {
        return timestamp.toLocalDateTime();
    }
}

и следующая реализация:

@Service
public class PriceServiceImpl implements PriceService {

    private final PriceRepository priceRepository;
    private final PriceEntityMapper priceEntityMapper;

    @Autowired
    public PriceServiceImpl(PriceRepository priceRepository, PriceEntityMapper priceEntityMapper) {
        this.priceRepository = priceRepository;
        this.priceEntityMapper = priceEntityMapper;
    }

    @Override
    public Price getPrice(LocalDateTime applicationDate, Integer productId, Integer brandId) {
        try {

            //PriceEntity priceEntity = priceRepository.findByBrandIdAndProductIdAndStartDateLessThanEqualApplicationDateAndEndDateGreaterThanEqualApplicationDate(brandId, productId, Timestamp.valueOf(applicationDate));
            return priceEntityMapper.priceEntityToPrice(new PriceEntity());

        } catch (Exception e) {

            throw new ResponseStatusException(HttpStatus.NOT_FOUND, "Price not found", e);
        }
    }
}

ну, когда я пытаюсь запустить приложение, выдает следующую ошибку:

Параметр 1 конструктора в com.dharian.application.service.PriceServiceImpl требовал bean-компонента типа com.dharian.infraestructure.mapper.PriceEntityMapper, который не удалось найти.

Но у меня есть аннотации @Mapper и @Component, а еще у меня есть

@SpringBootApplication
@ComponentScan({"com.dharian.infraestructure", "com.dharian.application"})
public class PruebatecnicaApplication {
    public static void main(String[] args) {
        SpringApplication.run(PruebatecnicaApplication.class, args);
    }
}

Для сканирования посылок. Это не работает.

что это может быть?

Я попробовал @ComponentScan, изменил автоподключение и аннотацию к классу Mapper.

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

Ответы 1

Ответ принят как подходящий

Вместо использования @Component вам нужно объявить его как bean-компонент способом MapStruct:

@Mapper(componentModel = "spring")
public interface PriceEntityMapper {

Только теперь инициализируйте его с помощью @Autowired, и он будет создан как компонент.

В противном случае вам придется объявить картограф напрямую:

PriceEntityMapper mapper = Mappers.getMapper(PriceEntityMapper.class)

Для получения дополнительной информации см. документацию для раздела Параметры конфигурации MapStruct -> mapstruct.defaultComponentModel:

@Дхариан, ты также можешь проголосовать здесь, это поможет другим участникам понять, что такой ответ работает.

catch23 02.05.2024 12:04

Я пробовал, но мне говорят, что у меня недостаточно репутации.

Dharian 02.05.2024 12:13

действительно это работает как минимум с 15

catch23 03.05.2024 00:08

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