Dig*_*i55 10 java servlets cdi jsf-2.3 java-ee-8
这个问题之所以出现是因为我阅读了Arjan Tijms 关于 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)。雅加达交易(当时的 JTA)也做了类似的事情)
目前,CDI 不想增强或扩展 Servlet 制品,这是有充分理由的。CDI 专注于其核心 bean 模型和注入。
然而,在Servlet中,对于提供生产者意味着什么存在着巨大的误解。Servlet 中至少有一个人认为这是关于提供集成点,或者 Servlet 必须完全基于 CDI,或者 Jetty 必须支持所有 10 个 CDI 实现(只有 2 个,但除此之外)。
这种讨论已经持续了至少8年。问题已再次打开和关闭。
我自己也是一个Servlet成员,所以我希望我能有一些影响,但仍然没能解决这个问题。
我们也可以让 Faces 提供HttpServletResponse
,但 Faces 也不拥有该类型,这可能只会造成混乱。
归档时间: |
|
查看次数: |
476 次 |
最近记录: |