我正在使用ejb 3并尝试@Inject HttpServletRequest,但在部署时我发生了异常。
代码:
@Inject private HttpServletRequest httpRequest;
例外:
org.jboss.weld.exceptions.DeploymentException: WELD-001408 Unsatisfied dependencies for type [HttpServletRequest] with qualifiers [@Default] at injection point [[field] @Inject private com.kmware.ttk.highway.beans.session.UserSessionBean.httpRequest]
我该怎么办?
答案 0 :(得分:21)
HttpServletRequest的生命周期由EJB / Web容器管理,而不是CDI容器。尝试注入它会导致问题,因为通常有许多接口实现,并且您的CDI容器没有足够的信息来决定要注入哪个实现。即使您成功注入了它的实例, 不 也是与EJB容器管理的实例相同。
要获取正确管理的请求实例,请执行以下操作:
@Context
private HttpServletRequest httpRequest;
答案 1 :(得分:8)
如果你的受抚养者是JAX-RS(Restful)类,那么请注意上面的答案。另一方面,如果你有一个更复杂的依赖注入安排,问题肯定是有效的。
此功能已添加到CDI 1.1规范(JSR-346)中,后者又已添加到新的Java EE 7规范中。换句话说,最新的Java企业应用程序服务器类将能够处理这个问题。
与此同时,如果您需要能够管理某些请求范围依赖项,这些依赖项需要访问实际的HttpServletRequest信息,您可以使用您的方法并使用JBoss Solder工具。 (如果网站看起来已经不存在,请不要惊慌,事实是工作转移到官方的CDI 1.1规范实施 - 即“焊接2” - 他们不再使用焊接了。但它仍然完全适合CDI 1.0。)
maven依赖项将是
<dependency>
<groupId>org.jboss.solder</groupId>
<artifactId>solder-api</artifactId>
<version>3.2.0.Final</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.jboss.solder</groupId>
<artifactId>solder-impl</artifactId>
<version>3.2.0.Final</version>
<type>jar</type>
<scope>compile</scope>
</dependency>