【问题标题】:CDI failure with Dependent/applicatio Scope class依赖/应用程序范围类的 CDI 失败
【发布时间】:2018-11-22 14:21:07
【问题描述】:

我试图在我的依赖范围类中注入 ServletContext,但它总是失败。

java.lang.IllegalStateException: No CXF message usable for JAX-RS @Context injections in that thread so can't use interface javax.servlet.ServletContext

我无法理解为什么我不能在这里注入它的原因。我正在使用生产者方法,当在生产者方法内部时,我尝试访问 ServletContext obj 然后它给出了上述异常。我还检查了 Injected servlet 上下文是否为空,但它不为空。但是当我使用它调用任何方法时,例如sc.getContextPath() 它会给出上述异常。下面是sn-p的代码:

@Dependent
public class AuthContexthandler {

  @Context
  ServletContext sc;

  @Produces
  JWTAuthContextInfo getInfo() {
    try{
      System.out.println(sc.getContextPath()); //here I get the above mentioned error
      //rest of the code
    }catch(Exception e){
      e.printStackTrace();
    }
  }
}

【问题讨论】:

  • 我认为,如果你使用注入注解而不是上下文注解,它会起作用
  • 是的,确实如此。将其发布为答案,但您能解释一下为什么会这样吗?我完全迷失在 CDI 概念中!!
  • 当我学习 CDI 和 JAX-RS 时,我也对依赖注入 (DI) 概念感到非常困惑,直到我发布 JAX-RS 有自己的 DI 机制,它使用与 CDI 不同的注释。这导致应用程序具有由 JAX-RS 管理的 bean 和由 CDI 管理的其他 bean。由于两个框架都使用不同的注解来标记 bean 和注入点,因此您需要确保使用正确的注解。在您的示例中,AuthContextHandler 类是 CDI bean(因为 @Dependent 注释),而 @Context 标记 JAX-RS 注入点。
  • @ChristophBöhme 现在有意义了!!解释得很好。

标签: dependency-injection jax-rs cdi


【解决方案1】:

你必须使用@inject 而不是@Context。

您可以使用@Context 将与 HTTP 请求的上下文相关的对象实例注入到 JAX-RS 源类中,并且 AuthContextHandler(如 @Christoph Böhme 所说)不是 JAX-RS 源类,因此您不能使用 @Context

但正如http://docs.jboss.org/weld/reference/latest/en-US/html_single/ 所说:

绑定到生命周期上下文的对象称为 bean。 CDI 包括 对几种不同类型的 bean 的内置支持,包括 以下 Java EE 组件类型:

托管 bean 和 EJB 会话 bean。托管 bean 和 EJB 会话 bean 可能会注入其他 bean。但是还有一些其他的对象, 不是这里使用的意义上的豆子,也可能有豆子 通过 CDI 注入。在 Java EE 平台中,有以下几种 组件可能注入了 bean:

消息驱动的 bean,

拦截器,

小服务程序,

servlet 过滤器和

servlet 事件监听器,

JAX-WS 服务端点和处理程序,

JAX-RS 资源,

providers 和 javax.ws.rs.core.Application 子类,以及

JSP 标记处理程序和标记库事件侦听器。

这意味着你也可以在你的 JAX-RS 源类中使用 @Inject 注解。

CDI 中还有一些预定义的 Bean,例如 ServletContext,您可以使用 @inject 注解来注入它们。

https://docs.jboss.org/seam/3/servlet/latest/reference/en-US/html/injectablerefs.html https://docs.oracle.com/javaee/7/tutorial/cdi-adv004.htm

【讨论】:

    猜你喜欢
    • 2021-12-17
    • 2013-12-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-10
    • 1970-01-01
    • 1970-01-01
    • 2017-01-14
    • 2019-08-27
    相关资源
    最近更新 更多