首页 > 解决方案 > 为什么 HTTPServletRequest 可以通过 CDI 注入,但 HTTPServletResponse 不能?

问题描述

这个问题起飞了,因为我阅读了关于 JSF 2.3 的 Arjan Tijms 博客文章。在那里,他列出了所有可以通过 CDI 注入的 JSF 工件。虽然HttpServletRequest被提及,HttpServletResponse但并没有出现在我起初不相信的上述列表中。

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

我不明白为什么HttpServletResponse不应该注射。毕竟,我们的目标是通过简洁的注入来替换令人费解的方法链。在 的情况下HttpServletRequestFacesContext.getCurrentInstance().getExternalContext().getRequest();现在可以缩短为上述注入。

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

总结:为什么可以HttpServletRequest通过 CDI 进行注射,但HttpServletResponse不能?

标签: javaservletscdijava-ee-8jsf-2.3

解决方案


这里没有一个好的答案。

首先,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 也不拥有该类型,它可能只会造成混乱。


推荐阅读