当使用BeanCreator创建SyntheticBean时,当bean被实例化时,我会得到NPE



我正在创建Quarkus扩展,我需要的一件事是使用AfterBeanDiscovery.addBean((.的替换

但是当Quarkus尝试实例化bean时,我得到了一个NullPointerException(在生成的代码中,所以不知道什么是null(

这是精简后的代码,但仍然存在相同的问题。我用下面的BuildStep创建了一个处理器

@BuildStep
SyntheticBeanBuildItem syntheticExample(BeanArchiveIndexBuildItem beanArchiveIndex) {
return SyntheticBeanBuildItem.configure(ExampleBean.class).scope(Singleton.class)
.creator(ExampleCreator.class)
.done();
}

创建者只是

private static class ExampleCreator implements BeanCreator<ExampleBean> {
@Override
public ExampleBean create(CreationalContext<ExampleBean> creationalContext, Map<String, Object> map) {
return new ExampleBean("X");
}
}

当我在JAX-RS资源中使用ExampleBean时,当我尝试访问该资源中的端点时,我会得到以下Stacktrace。

org.jboss.resteasy.spi.UnhandledException: java.lang.RuntimeException: Error injecting be.rubus.microstream.quarkus.integration.ExampleBean be.rubus.microstream.quarkus.GreetingResource.exampleBean
at org.jboss.resteasy.core.ExceptionHandler.handleException(ExceptionHandler.java:368)
at org.jboss.resteasy.core.SynchronousDispatcher.writeException(SynchronousDispatcher.java:218)
at org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:519)
...
Caused by: java.lang.RuntimeException: Error injecting be.rubus.microstream.quarkus.integration.ExampleBean be.rubus.microstream.quarkus.GreetingResource.exampleBean
at be.rubus.microstream.quarkus.GreetingResource_Bean.create(Unknown Source)
at be.rubus.microstream.quarkus.GreetingResource_Bean.create(Unknown Source)
at io.quarkus.arc.impl.AbstractSharedContext.createInstanceHandle(AbstractSharedContext.java:111)
...
Caused by: java.lang.NullPointerException
at be.rubus.microstream.quarkus.integration.ExampleBean_f7ae08679933a92c66701907ce1ebba818ff26b3_Synthetic_Bean.get(Unknown Source)
at be.rubus.microstream.quarkus.integration.ExampleBean_f7ae08679933a92c66701907ce1ebba818ff26b3_Synthetic_Bean.get(Unknown Source)
... 34 more

我错过了什么?

该问题的复制者:https://github.com/rdebusscher/quarkus-syntheticbean

Quarkus ARC团队提供了解决方案

Scope是谷歌果汁的Singleton,而不是CDI的。由于io.quarkus.arc.processor.BeanConfiguratorBase#scope(java.lang.Class<? extends java.lang.annotation.Annotation>)中的检查不足,未正确报告问题

最新更新