注入HttpServletRequest

我正在使用ejb 3并尝试@Inject HttpServletRequest,但在部署时我发生了exception。

码:

@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] 

我该怎么办?

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

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

 @Context private HttpServletRequest httpRequest; 

如果您的受抚养者是JAX-RS(Restful)类,那么请注意上面的答案。 另一方面,如果你有一个更复杂的dependency injection安排,问题肯定是有效的。

此function已添加到CDI 1.1规范(JSR-346)中,后者又已添加到新的Java EE 7规范中。 换句话说,最新的Java企业应用程序服务器类将能够处理这个问题。

与此同时,如果您需要能够管理一些请求范围依赖项,这些依赖项需要访问实际的HttpServletRequest信息,您可以使用您的方法并使用JBoss Solder工具。 (如果网站看起来已经不存在,请不要惊慌,事实是工作转移到官方的CDI 1.1规范实施 – 即“焊接2” – 他们不再使用焊接了。但它仍然完全适合CDI 1.0。)

maven依赖将是

  org.jboss.solder solder-api 3.2.0.Final jar compile   org.jboss.solder solder-impl 3.2.0.Final jar compile