16

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

我能用它做什么?

4

2 回答 2

27

HttpServletRequest 的生命周期由 EJB/web 容器管理,而不是 CDI 容器。尝试注入它会导致问题,因为通常有许多接口实现,并且您的 CDI 容器没有足够的信息来决定注入哪个实现。即使您成功注入了它的一个实例,它也不会与由 EJB 容器管理的实例相同。

要获取正确管理的请求实例,请改为执行以下操作:

@Context
private HttpServletRequest httpRequest;
于 2012-11-16T16:00:41.813 回答
10

如果您的受抚养人是 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>
于 2013-08-26T19:07:57.907 回答