NoSuchBeanException для классов, сгенерированных MapStruct в Micronaut

При создании 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

Созданы ли картографы?

Filip 10.01.2019 22:05

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

age 11.01.2019 07:25

Когда приходит это сообщение от Микронавта? Во время компиляции или выполнения? Возможно, микронавт не ждет других обработчиков аннотаций

Filip 11.01.2019 11:26

Во время выполнения, если я изменяю порядок процессоров аннотаций в pom, так что mapstruct находится после micronaut, код mapstruct не создается.

age 11.01.2019 16:23

Это известная проблема, см. github.com/micronaut-projects/micronaut-core/issues/991

Filip 11.01.2019 17:46

А, ладно, я подозревал что-то подобное, но, к сожалению, не объясняет мою другую проблему, но пока что спасибо за ваше время.

age 11.01.2019 19:21

Да, это не объясняет проблемы. К сожалению, я мало что знаю о Micronaut, чтобы помочь с этим.

Filip 11.01.2019 19:42

Проблема была решена в ядре и будет включена в следующий выпуск, хотя этот пример по-прежнему не будет работать, поскольку экземпляры Mapper не являются автоматически компонентами Micronaut. Вам нужно будет определить @Factory с @Bean, который возвращает средство сопоставления, чтобы сделать его bean-компонентом.

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

Ответы 1

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

Я нашел Микронавт PR, который должен решить проблему с mapstruct с использованием компонентной модели jsr330. Они планируют включить исправление в 1.1.0.

ОБНОВЛЕНИЕ: проблема исправлена ​​в 1.1.0.RC1.

Спасибо за усилия - это именно то, что я искал.

age 13.03.2019 16:28

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