在我的应用中,它不是一个Web服务应用,因此不提供REST端点,我正在使用注入的BeanContext
按需创建其他Bean的实例。这些Bean是@Prototype
类型,而不是@Singleton
,因为它们只应在需要时存在,并在使用后被丢弃。
该代码在Micronaut 3.6.3版本上运行良好,但当我升级到4.2.2版本时,注入的BeanContext
无法找到任何Bean了。使用beanContext.getBean(ProtoTypeBean.class)
会抛出NoSuchBeanException
异常。
为了更清楚地说明问题,我在我的GitHub仓库中有一个可复现此问题的案例。
简化后的代码结构如下:
主应用启动ApplicationContext
,这将创建一个ScheduleReader
实例并调用其run()
方法:
public static void main(String[] args) {
try (final ApplicationContext context = ApplicationContext.run()) {
context.getBean(ScheduleReader.class).run();
}
}
在ScheduleReader.run()
方法内部,我利用注入的BeanContext
来创建另一个Bean的实例:
@Singleton
@Slf4j
public class ScheduleReader implements Runnable {
private final BeanContext beanContext;
@Inject
ScheduleReader(final BeanContext beanContext) {
this.beanContext = beanContext;
}
@Override
public void run() {
beanContext.getBean(Action.class).run();
}
}
Action
也是一个@Prototype
类型的Bean,但在尝试获取它时,我遇到了以下异常:
12:22:29.946 [pool-1-thread-1] ERROR com.example.ScheduleReader - Error while starting Action: No bean of type [com.example.Action] exists. Make sure the bean is not disabled by bean requirements (enable trace logging for 'io.micronaut.context.condition' to check) and if the bean is enabled then ensure the class is declared a bean and annotation processing is enabled (for Java and Kotlin the 'micronaut-inject-java' dependency should be configured as an annotation processor).
io.micronaut.context.exceptions.NoSuchBeanException: No bean of type [com.example.Action] exists. Make sure the bean is not disabled by bean requirements (enable trace logging for 'io.micronaut.context.condition' to check) and if the bean is enabled then ensure the class is declared a bean and annotation processing is enabled (for Java and Kotlin the 'micronaut-inject-java' dependency should be configured as an annotation processor).
...
当我直接在ScheduleReader
类中再次使用ApplicationContext.run()
来获取另一个应用上下文时,我能够成功检索到其他Bean,但这似乎不是理想解决方案,毕竟每次创建Bean实例都要启动一个新的应用上下文显得不太合理。
Micronaut的指南主要关注于带有REST控制器的应用启动,但如前所述,我的应用是一个独立运行的应用,不暴露任何端点。在迁移指南中也没有找到关于这一变化或如何解决此问题的线索。
我是否漏掉了什么关键步骤或配置?