Dependent/applicatio 范围 class 的 CDI 失败

CDI failure with Dependent/applicatio Scope class

我正在尝试在我的依赖范围 class 中注入 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 context 是否为 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();
    }
  }
}

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

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

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

An object bound to a lifecycle context is called a bean. CDI includes built-in support for several different kinds of bean, including the following Java EE component types:

managed beans, and EJB session beans. Both managed beans and EJB session beans may inject other beans. But some other objects, which are not themselves beans in the sense used here, may also have beans injected via CDI. In the Java EE platform, the following kinds of component may have beans injected:

message-driven beans,

interceptors,

servlets,

servlet filters and

servlet event listeners,

JAX-WS service endpoints and handlers,

JAX-RS resources,

providers and javax.ws.rs.core.Application subclasses, and

JSP tag handlers and tag library event listeners.

这意味着您还可以在 JAX-RS 源代码中使用 @Inject 注释 class。

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