注入HttpServletRequest

Kir*_*rov 12 java dependency-injection ejb jboss7.x

我正在使用ejb 3并尝试@Inject HttpServletRequest,但在部署时我发生异常.

码:

@Inject private HttpServletRequest httpRequest;
Run Code Online (Sandbox Code Playgroud)

例外:

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]
Run Code Online (Sandbox Code Playgroud)

我该怎么办?

Per*_*ion 22

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

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

@Context
private HttpServletRequest httpRequest;
Run Code Online (Sandbox Code Playgroud)

  • 值得注意的是,`@ Context`仅适用于JAX-RS Web服务类,并且绝对不能在EJB类中工作.也许OP恰巧实际上也使用了JAX-RS,尽管问题中没有提到*.因此,这个答案乍看之下是一个完全盲目的猜测和一个无知的黑暗射击,毕竟是一个幸运的射击. (25认同)
  • 不,当你已经开展了一年的Web服务实施时,你会发现当其他人遇到与你在过程早期遇到的问题时相同的问题. (3认同)
  • 你是说@ javax.ws.rs.core.Context吗? (2认同)

Mur*_*ams 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>
Run Code Online (Sandbox Code Playgroud)