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
我正在尝试在我的依赖范围 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