为什么 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):
@Inject private HttpServletRequest req;
工作正常
@Inject private HttpServletResponse res;
抛出 DeploymentException: WELD-001408: Unsatisfied dependencies for type HttpServletResponse
我不明白为什么 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 也不拥有该类型,这可能只会造成混乱。
这个问题之所以流行是因为我阅读了 Arjan Tijms blogpost about JSF 2.3。在那里,他列出了所有可以通过 CDI 注入的 JSF 工件。虽然提到了HttpServletRequest
,但HttpServletResponse
并没有出现在我起初不相信的所述列表中。
为了尝试一下,我设置了一个简单的服务器(JavaEE8、Wildfy22):
@Inject private HttpServletRequest req;
工作正常@Inject private HttpServletResponse res;
抛出DeploymentException: WELD-001408: Unsatisfied dependencies for type HttpServletResponse
我不明白为什么 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 也不拥有该类型,这可能只会造成混乱。