【发布时间】:2022-01-19 08:03:32
【问题描述】:
在将 Quarkus 从 1.6.1.Final 升级到 2.5.Final 后,@Inject 在 javax.ws.rs.core.Application 子类中失败:
@ApplicationScoped
public class MyBean {
public String foo() {
retun "bar";
}
}
@ApplicationPath("/")
public class MyApplication extends Application {
@Inject
MyBean myBean;
@Override
public Set<Class<?>> getClasses() {
myBean.foo(); // Causes NPE on Quarkus 2.5.Final, worked well with 1.6.1.Final
}
}
我尝试使用CDI.current().select(MyBean.class).get(),但得到了Unable to locate CDIProvider。
我可以尝试任何其他解决方法吗?谢谢。
【问题讨论】:
-
我怀疑有几件事:(1)
CDI.current().select(...)不应该工作,因为 Quarkus 使用 ARC 而不是真正的 CDI,而 ARC 在构建时而不是运行时发挥其“魔力” (2)您可能需要为Application添加一个范围,以便 ARC 将其“视为”一个 bean 并进行注入。我在这里可能大错特错:)只是想出了几件事,以防万一他们有帮助! -
我认为这是我们对
Application的固有限制... -
郑重声明,尽管 ArC 没有通过 CDI TCK,但它确实实现了相当大的一部分 CDI,包括
CDI.current()。如果这不起作用,则可能有问题,我建议用最小的复制器填充错误。 -
@Ladicek, @NikosParaskevopoulos:上面的代码在 1.6.1.Final 上运行良好(我也可以在
CDI.current() ...上运行)。深入研究一下,看起来应用程序初始化过程随着 Quarkus 2.5(2.0?)而改变。 JAX RS 应用程序现在在 ARC 处理 CDI bean 之前被初始化。因此myBean在getClasses()方法中为 null ...