我正在编写一个在 Tomcat 上运行的 CDI 应用程序。我使用 Tomcat 7.0.62 和 Weld 2.2.12.Final 作为 CDI 实现。我正在使用 CDI,而不使用 JSF。
该应用程序由未启用 CDI 的调度程序 servlet 组成。调度程序包括启用 CDI 的 servlet 的输出来创建页面。
当调度程序 servlet 和 CDI servlet 都在同一个 Web 应用程序中时,它可以正常工作。但是,我需要 CDI servlet 位于不同的 Web 应用程序中,因此我执行了跨上下文包含。当我执行跨上下文包含时,CDI servlet 会生成输出,直到它尝试访问 @RequestScoped bean。Bean 访问失败,出现以下异常:
org.jboss.weld.context.ContextNotActiveException: WELD-001303: No active contexts for scope type javax.enterprise.context.RequestScoped
at org.jboss.weld.manager.BeanManagerImpl.getContext(BeanManagerImpl.java:708)
at org.jboss.weld.bean.ContextualInstanceStrategy$DefaultContextualInstanceStrategy.getIfExists(ContextualInstanceStrategy.java:90)
at org.jboss.weld.bean.ContextualInstanceStrategy$CachingContextualInstanceStrategy.getIfExists(ContextualInstanceStrategy.java:165)
at org.jboss.weld.bean.ContextualInstance.getIfExists(ContextualInstance.java:63)
at org.jboss.weld.bean.proxy.ContextBeanInstance.getInstance(ContextBeanInstance.java:83)
...
Run Code Online (Sandbox Code Playgroud)
我也尝试过为调度程序 servlet 激活 CDI,但似乎没有任何区别。
在我看来,当包含 CDI servlet 时,CDI servlet 的请求上下文没有正确设置,而不是直接接收请求。
我已经搜索过这个网站,也通过谷歌搜索过,但没有找到匹配的问题/解决方案。我发现一个 tomcat 上下文设置“fireRequestListenersOnForwards=”true”,我将其应用于调度程序 servlet,但这并没有什么区别。
这是配置问题吗?任何人都可以提供有关如何解决这个问题的线索吗?
我会很感激!
背景资料:
存在问题的实际应用程序很大,因此我将其浓缩以了解损坏的本质。结果,我有两个战争文件。第一个 …