【问题标题】:Injection of HttpServletRequestHttpServletRequest 的注入
【发布时间】:2025-12-02 20:15:02
【问题描述】:

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

我能用它做什么?

【问题讨论】:

    标签: java dependency-injection ejb jboss7.x


    【解决方案1】:

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

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

    @Context
    private HttpServletRequest httpRequest;
    

    【讨论】:

    • 你是说@javax.ws.rs.core.Context 吗?
    • @KirillBazarov - 是的,这就是要使用的注释。
    • @KirillBazarov - 这解决了你的问题吗?如果是这样,请随时投票/接受这个答案。谢谢。
    • 需要注意的是@Context 只能在 JAX-RS webservice 类中工作,绝对不能在 EJB 类中工作。也许 OP 巧合地实际上也使用了 JAX-RS,即使问题中提到了 nowhere。因此,这个答案乍一看完全是盲目的猜测,是在黑暗中无知的拍摄,毕竟是幸运的拍摄。
    • 不,当您从事 Web 服务实施工作一年时,您会意识到其他人遇到的问题与您在流程早期遇到的问题相同。
    【解决方案2】:

    如果您的受抚养人是 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>
    

    【讨论】: