依赖/应用范围类

时间:2018-11-22 14:21:08

标签: dependency-injection jax-rs cdi

我试图将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上下文是否为null,但不为null。但是,当我调用任何使用它的方法(例如sc.getContextPath())时,就会出现上述异常。下面是代码片段:

@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();
    }
  }
}

1 个答案:

答案 0 :(得分:1)

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

您可以使用@Context将与HTTP请求的上下文相关的对象实例注入到JAX-RS源类中,并且由于AuthContextHandler(如@ChristophBö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平台中,以下几种   组件可能注入了豆子:

     

消息驱动的豆

     

拦截器

     

servlets

     

servlet过滤器和

     

servlet事件监听器,

     

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

     

JAX-RS资源,

     

提供者和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