我试图将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();
}
}
}
答案 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