При генерации реализаций mapper с MapStruct, используя "jsr330" componentModel, micronaut генерирует исключение NoSuchBeanException во время выполнения при попытке вставить их.
Обходной путь может заключаться в использовании поставщика, который будет предоставлять объекты сопоставления, но сгенерированный код должен работать.
Определение картографа:
@Mapper(componentModel = "jsr330")
public interface FooBarMapper {
Foo toFoo(Bar bar);
}
Контроллер:
@Controller
public class SomeController {
@Inject
public SomeController(FooBarMapper mapper) {
}
@Get
public String foo() {
return "foo";
}
}
pom.xml выдержка:
<annotationProcessorPaths>
<path>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>${mapstruct.version}</version>
</path>
<path>
<groupId>io.micronaut</groupId>
<artifactId>micronaut-inject-java</artifactId>
<version>${micronaut.version}</version>
</path>
<path>
<groupId>io.micronaut.configuration</groupId>
<artifactId>micronaut-openapi</artifactId>
<version>${micronaut.version}</version>
</path>
</annotationProcessorPaths>
При вызове метода на контроллере я бы ожидал, что Micronaut найдет сгенерированный класс Mapstruct (он аннотирован @Singleton), но вместо этого получится
Сообщение: бин типа [com.example.FooBarMapper] не существует. Убедитесь, что класс объявлен как bean-компонент, и если вы используете Java или Kotlin, убедитесь, что вы включили обработку аннотаций.
Путь пройден: новый SomeController ([FooBarMapper mapper])
io.micronaut.context.exceptions.DependencyInjectionException: не удалось ввести значение для параметра [mapper] класса: com.example.SomeController