注入 HttpServletRequest

2022-09-02 23:55:34

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

我能用它做什么?


答案 1

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

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

@Context
private HttpServletRequest httpRequest;

答案 2

如果你的依赖人是JAX-RS(Restful)类,那么请注意上面的答案。另一方面,如果你有一个更复杂的依赖注入安排,这个问题肯定是有效的。

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

同时,如果您需要能够管理一些请求范围依赖项,而这些依赖项实际上需要访问实际的 HttpServletRequest 信息,则可以使用您的方法并使用 JBoss 焊接工具。(如果网站看起来已经不复存在,请不要惊慌,事实是工作转移到了官方的CDI 1.1规范实现上-即“Weld 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>

推荐