【问题标题】:Quarkus 2.5: @Inject inside JAX-RS Application subclass not working anymoreQuarkus 2.5:JAX-RS 应用程序子类中的@Inject 不再工作
【发布时间】:2022-01-19 08:03:32
【问题描述】:

在将 Quarkus 从 1.6.1.Final 升级到 2.5.Final 后,@Injectjavax.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 之前被初始化。因此 myBeangetClasses() 方法中为 null ...

标签: jax-rs cdi quarkus


【解决方案1】:

JAX-RS 应用程序类中的@Injectdisallowed 以来一直存在。我能够使用@IfBuildProperty 注释解决我的问题(通过配置注册资源类)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-20
    • 2016-09-25
    • 1970-01-01
    • 2016-12-06
    • 2017-10-27
    • 2016-08-17
    • 1970-01-01
    相关资源
    最近更新 更多