MapStruct, использующий интерфейс с загрузкой Spring, вызывает исключение NoSuchBeanDefinitionException

#spring-boot #exception #interface #mapstruct

Вопрос:

Я внедрил интерфейс для использования MapStruct :

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

    MapStructMapper INSTANCE = Mappers.getMapper( MapStructMapper.class );

    MyApiModel myInternalClassToMyApiModel(MyDocument.MyInternalClass myInternalClass);
    MyDocument.MyInternalClass myApiModelToMyInternalClass(MyApiModel myApiModel);
}
 

При запуске сборки gradle я получаю следующее исключение при выполнении тестов:

 Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'MapStructMapper' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
 

В моем тестовом классе у меня в настоящее время есть только:

 @Autowired
protected MapStructMapper mapper;
 

и в моем телосложении.

 implementation 'org.mapstruct:mapstruct:1.4.2.Final'
annotationProcessor 'org.mapstruct:mapstruct-processor:1.4.2.Final'
 

Как я могу решить эту проблему и как я могу вызвать сопоставление, если я использую MapStruct с использованием интерфейса?

Комментарии:

1. итак, вы решили эту проблему? столкнувшись с точно такой же проблемой

Ответ №1:

Основываясь на предоставленной вами информации, трудно дать окончательный ответ.

Пожалуйста, убедитесь, что вы включили в свою сборку не только зависимости от mapstruct, но и процессор аннотаций, чтобы MapStructMapperImpl он был фактически сгенерирован.

Если он действительно создан, вы должны убедиться, что он включен в контекст приложения вашего теста. Если вы используете @SpringBootTest , вам необходимо убедиться, что интерфейс объявлен в пакете, который сканируется сканированием компонентов. Если вы создадите выделенный контекст @ContextConfiguration , вам нужно будет указать список MapStructMapperImpl.class в списке, который вы передадите параметру classes , как и в случае с другими классами, аннотированными @Component .