Micronaut Injected BeanContext не может получить bean-компоненты ⇐ JAVA
-
Anonymous
Micronaut Injected BeanContext не может получить bean-компоненты
В моем приложении, которое не является приложением веб-сервиса и не предоставляет конечную точку отдыха, я использую внедренный BeanContext для создания экземпляров других bean-компонентов всякий раз, когда они мне нужны. Эти bean-компоненты являются bean-компонентами @Prototype, а не @Singleton, поскольку они должны существовать только при необходимости и удаляться после использования.
Код работал нормально с micronaut 3.6.3, но когда я обновился до 4.2.2, внедренный BeanContext не смог найти ни одного компонента. beanContext.getBean(ProtoTypeBean.class); выдаст исключение NoSuchBeanException
Чтобы прояснить, что я имею в виду, в моем репозитории GitHub есть воспроизводимый случай.
Упрощенная версия кода выглядит так:
Основное приложение запускает ApplicationContext, который создает экземпляр ScheduleReader и вызывает run()
public static void main(String[] args) { попробуйте (окончательный контекст ApplicationContext = ApplicationContext.run()) { context.getBean(ScheduleReader.class).run(); } } В методе ScheduleReader.run() я использую внедренный BeanContext для создания экземпляра другого компонента
@Singleton @Slf4j публичный класс ScheduleReader реализует Runnable { частный окончательный BeanContext beanContext; @Инжект ScheduleReader (окончательный BeanContext beanContext) { this.beanContext = beanContext; } @Override общественный недействительный запуск () { beanContext.getBean(Action.class).run(); } } Действие также является @Prototype, но на этом этапе я получаю следующее исключение:
12:22:29.946 [pool-1-thread-1] ОШИБКА com.example.ScheduleReader — ошибка при запуске Действия: не существует bean-компонента типа [com.example.Action]. Убедитесь, что компонент не отключен требованиями компонента (включите ведение журнала трассировки для «io.micronaut.context.condition» для проверки), и если компонент включен, убедитесь, что класс объявлен как компонент и включена обработка аннотаций (для Java и Kotlin зависимость «micronaut-inject-java» должна быть настроена как обработчик аннотаций). io.micronaut.context.Exceptions.NoSuchBeanException: не существует bean-компонента типа [com.example.Action]. Убедитесь, что компонент не отключен требованиями компонента (включите ведение журнала трассировки для «io.micronaut.context.condition» для проверки), и если компонент включен, убедитесь, что класс объявлен как компонент и включена обработка аннотаций (для Java и Kotlin зависимость «micronaut-inject-java» должна быть настроена как обработчик аннотаций). в io.micronaut.context.DefaultBeanContext.newNoSuchBeanException(DefaultBeanContext.java:2773) в io.micronaut.context.DefaultApplicationContext.newNoSuchBeanException(DefaultApplicationContext.java:304) в io.micronaut.context.DefaultBeanContext.resolveBeanRegistration(DefaultBeanContext.java:2735) в io.micronaut.context.DefaultBeanContext.getBean(DefaultBeanContext.java:1729) в io.micronaut.context.DefaultBeanContext.getBean(DefaultBeanContext.java:856) в io.micronaut.context.DefaultBeanContext.getBean(DefaultBeanContext.java:848) в com.example.ScheduleReader.runPlanner(ScheduleReader.java:41) в java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539) в java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264) в java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:304) в java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) в java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) в java.base/java.lang.Thread.run(Thread.java:833) Когда я использую другой ApplicationContext.run() в ScheduleReader, я могу использовать этот контекст приложения для извлечения других bean-компонентов, но я не могу себе представить, что вам нужно начинать сейчас ApplicationContexts каждый раз, когда вы хотите создать новый экземпляр компонента...
Руководства Micronaut ориентированы на запуск приложений с помощью остальных контроллеров, но, как уже говорилось, это всего лишь автономное приложение, которое не предоставляет конечные точки. Я также не нашел в руководствах по миграции никаких подсказок о том, что было изменено или как решить эту проблему.
Что мне не хватает?
В моем приложении, которое не является приложением веб-сервиса и не предоставляет конечную точку отдыха, я использую внедренный BeanContext для создания экземпляров других bean-компонентов всякий раз, когда они мне нужны. Эти bean-компоненты являются bean-компонентами @Prototype, а не @Singleton, поскольку они должны существовать только при необходимости и удаляться после использования.
Код работал нормально с micronaut 3.6.3, но когда я обновился до 4.2.2, внедренный BeanContext не смог найти ни одного компонента. beanContext.getBean(ProtoTypeBean.class); выдаст исключение NoSuchBeanException
Чтобы прояснить, что я имею в виду, в моем репозитории GitHub есть воспроизводимый случай.
Упрощенная версия кода выглядит так:
Основное приложение запускает ApplicationContext, который создает экземпляр ScheduleReader и вызывает run()
public static void main(String[] args) { попробуйте (окончательный контекст ApplicationContext = ApplicationContext.run()) { context.getBean(ScheduleReader.class).run(); } } В методе ScheduleReader.run() я использую внедренный BeanContext для создания экземпляра другого компонента
@Singleton @Slf4j публичный класс ScheduleReader реализует Runnable { частный окончательный BeanContext beanContext; @Инжект ScheduleReader (окончательный BeanContext beanContext) { this.beanContext = beanContext; } @Override общественный недействительный запуск () { beanContext.getBean(Action.class).run(); } } Действие также является @Prototype, но на этом этапе я получаю следующее исключение:
12:22:29.946 [pool-1-thread-1] ОШИБКА com.example.ScheduleReader — ошибка при запуске Действия: не существует bean-компонента типа [com.example.Action]. Убедитесь, что компонент не отключен требованиями компонента (включите ведение журнала трассировки для «io.micronaut.context.condition» для проверки), и если компонент включен, убедитесь, что класс объявлен как компонент и включена обработка аннотаций (для Java и Kotlin зависимость «micronaut-inject-java» должна быть настроена как обработчик аннотаций). io.micronaut.context.Exceptions.NoSuchBeanException: не существует bean-компонента типа [com.example.Action]. Убедитесь, что компонент не отключен требованиями компонента (включите ведение журнала трассировки для «io.micronaut.context.condition» для проверки), и если компонент включен, убедитесь, что класс объявлен как компонент и включена обработка аннотаций (для Java и Kotlin зависимость «micronaut-inject-java» должна быть настроена как обработчик аннотаций). в io.micronaut.context.DefaultBeanContext.newNoSuchBeanException(DefaultBeanContext.java:2773) в io.micronaut.context.DefaultApplicationContext.newNoSuchBeanException(DefaultApplicationContext.java:304) в io.micronaut.context.DefaultBeanContext.resolveBeanRegistration(DefaultBeanContext.java:2735) в io.micronaut.context.DefaultBeanContext.getBean(DefaultBeanContext.java:1729) в io.micronaut.context.DefaultBeanContext.getBean(DefaultBeanContext.java:856) в io.micronaut.context.DefaultBeanContext.getBean(DefaultBeanContext.java:848) в com.example.ScheduleReader.runPlanner(ScheduleReader.java:41) в java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539) в java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264) в java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:304) в java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) в java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) в java.base/java.lang.Thread.run(Thread.java:833) Когда я использую другой ApplicationContext.run() в ScheduleReader, я могу использовать этот контекст приложения для извлечения других bean-компонентов, но я не могу себе представить, что вам нужно начинать сейчас ApplicationContexts каждый раз, когда вы хотите создать новый экземпляр компонента...
Руководства Micronaut ориентированы на запуск приложений с помощью остальных контроллеров, но, как уже говорилось, это всего лишь автономное приложение, которое не предоставляет конечные точки. Я также не нашел в руководствах по миграции никаких подсказок о том, что было изменено или как решить эту проблему.
Что мне не хватает?
Мобильная версия