При создании 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), но вместо этого результат
Сообщение: Не существует bean-компонента типа [com.example.FooBarMapper]. Убедитесь, что класс объявлен bean-компонентом, и если вы используете Java или Kotlin, убедитесь, что вы включили обработку аннотаций. Выбранный путь: новый SomeController ([FooBarMapper mapper]) io.micronaut.context.exceptions.DependencyInjectionException: не удалось ввести значение для параметра [сопоставитель] класса: com.example.SomeController
Да, мапперы были созданы, и я также могу создать их вручную в контроллере. Просто подключение с использованием @Inject не работает.
Когда приходит это сообщение от Микронавта? Во время компиляции или выполнения? Возможно, микронавт не ждет других обработчиков аннотаций
Во время выполнения, если я изменяю порядок процессоров аннотаций в pom, так что mapstruct находится после micronaut, код mapstruct не создается.
Это известная проблема, см. github.com/micronaut-projects/micronaut-core/issues/991
А, ладно, я подозревал что-то подобное, но, к сожалению, не объясняет мою другую проблему, но пока что спасибо за ваше время.
Да, это не объясняет проблемы. К сожалению, я мало что знаю о Micronaut, чтобы помочь с этим.
Проблема была решена в ядре и будет включена в следующий выпуск, хотя этот пример по-прежнему не будет работать, поскольку экземпляры Mapper не являются автоматически компонентами Micronaut. Вам нужно будет определить @Factory с @Bean, который возвращает средство сопоставления, чтобы сделать его bean-компонентом.




Я нашел Микронавт PR, который должен решить проблему с mapstruct с использованием компонентной модели jsr330. Они планируют включить исправление в 1.1.0.
ОБНОВЛЕНИЕ: проблема исправлена в 1.1.0.RC1.
Спасибо за усилия - это именно то, что я искал.
Созданы ли картографы?