为什么 HTTPServletRequest 可以通过 CDI 注入,而 HTTPServletResponse 不能?

Why is HTTPServletRequest injectable via CDI but HTTPServletResponse isn't?

这个问题之所以流行是因为我阅读了 Arjan Tijms blogpost about JSF 2.3。在那里,他列出了所有可以通过 CDI 注入的 JSF 工件。虽然提到了HttpServletRequest,但HttpServletResponse并没有出现在我起初不相信的所述列表中。

为了尝试一下,我设置了一个简单的服务器(JavaEE8、Wildfy22):

我不明白为什么 HttpServletResponse 不能注射。毕竟,我们的目标是通过简洁的注入来取代复杂的方法链。 在 HttpServletRequest 的情况下, FacesContext.getCurrentInstance().getExternalContext().getRequest(); 现在可以缩短为上述注入。

嗯,在 HttpServletResponse 的情况下,没有注入候选来替换 FacesContext.getCurrentInstance().getExternalContext().getResponse();,如上所示。

总结:为什么 HttpServletRequest 可以通过 CDI 注入,而 HttpServletResponse 不能?

这里没有一个好的答案。

首先,HttpServletRequest 是由 CDI 制作的,而不是 Faces。至于HttpServletResponse我不确定为什么它不是最初包含在CDI中,但我知道所有的Servlet人工制品最初都不应该由CDI提供。

相反,CDI 应该要求 Servlet 为它们提供“生产者”(从技术上讲,是内置 bean)。 Jakarta Transactions(当时的 JTA)做了类似的事情)

目前,CDI 不想增强或扩展 Servlet 工件,这是有充分理由的。 CDI 专注于其核心 bean 模型和注入。

然而,在Servlet中,对于提供生产者的含义存在着巨大的误解。 Servlet 中至少有一个人认为它是关于提供集成点,或者关于 Servlet 必须完全基于 CDI,或者关于 Jetty 必须支持那里所有 10 个 CDI 实现(只有 2 个,但除此之外)。

这个讨论至少持续了8年。问题已打开并再次关闭。

我自己也是Servlet会员,希望能有一些影响,但还是没能解决这个问题。

我们也可以让 Faces 提供 HttpServletResponse,但 Faces 也不拥有该类型,这可能只会造成混乱。