注入HttpServletRequest

时间:2012-11-16 15:47:28

标签: java dependency-injection ejb jboss7.x

我正在使用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]

我该怎么办?

2 个答案:

答案 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>