Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 包含的启用CDI的Servlet失败,ContextNotActivieException:WELD-001303:_Java_Tomcat_Servlets_Cdi_Weld - Fatal编程技术网

Java 包含的启用CDI的Servlet失败,ContextNotActivieException:WELD-001303:

Java 包含的启用CDI的Servlet失败,ContextNotActivieException:WELD-001303:,java,tomcat,servlets,cdi,weld,Java,Tomcat,Servlets,Cdi,Weld,我正在编写一个在Tomcat上运行的CDI应用程序。我正在使用Tomcat 7.0.62和 焊接2.2.12.最终作为CDI实施。我使用的是没有JSF的CDI 该应用程序由未启用CDI的dispatcher servlet组成。这个 dispatcher包含支持CDI的servlet的输出,以创建页面 当dispatcher servlet和CDI servlet都位于同一个web应用程序中时, 它很好用。但是,我需要CDIServlet位于不同的web应用程序中,所以 我做了一个跨上下文的包含

我正在编写一个在Tomcat上运行的CDI应用程序。我正在使用Tomcat 7.0.62和 焊接2.2.12.最终作为CDI实施。我使用的是没有JSF的CDI

该应用程序由未启用CDI的dispatcher servlet组成。这个 dispatcher包含支持CDI的servlet的输出,以创建页面

当dispatcher servlet和CDI servlet都位于同一个web应用程序中时, 它很好用。但是,我需要CDIServlet位于不同的web应用程序中,所以 我做了一个跨上下文的包含。当我进行跨上下文包含时,CDIServlet 生成输出,直到它尝试访问@RequestScope 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)
...
我也尝试过为DispatcherServlet激活CDI,但没有 似乎有什么不同

在我看来,CDIServlet的请求上下文尚未设置 当包含CDIServlet而不是接收请求时 直接的

我搜索了这个网站,也通过谷歌,但没有找到一个匹配的 问题/解决方案。我发现一个tomcat上下文设置“fireRequestListenersOnForwards=true” 我将其应用于DispatcherServlet,但这没有什么区别

这是配置问题吗?有人能提供一个解决这个问题的线索吗

我将非常感激

背景资料:

有这个问题的实际应用程序很大,所以我将其压缩为 到破碎的本质。因此,我有两个war文件。第一次战争档案 包含CDIServlet和dispatcher,代码我称之为IncluderServlet。第二个war文件仅包含 调度器servlet

CDIServlet

CDI Servlet在其META_INF目录中有一个context.xml文件,其中包含以下内容:

<?xml version="1.0" encoding="UTF-8"?>
<Context>
    <Resource name="BeanManager" 
        auth="Container"
        type="javax.enterprise.inject.spi.BeanManager"
        factory="org.jboss.weld.resources.ManagerObjectFactory" />
</Context>
如果我通过与CDIServlet位于同一web应用程序中的DispatcherServlet访问CDIServlet,它也可以工作。URI:/SimpleDiservlet/IncluderServlet,输出:

Simple CDI Servlet Including Servlet
Will now include the CDI servlet ...
Got the RequestDispatcher.
Simple CDI Servlet
finally here we are. Name is: InjectedBean
但是,如果我从另一个上下文中包含CDIServlet,我不会在输出中获得注入的bean名称,上面提到的异常会出现在日志中。URI:/ExternalIncluderServlet/IncluderServlet,输出:

CDI Servlet Includer

This servlet includes a CDI servlet in a different web app. It is not CDI enabled.

Got the RequestDispatcher.
Simple CDI Servlet
finally here we are. Name is: 
请注意,我不能使用请求分派器转发,而不能使用include作为原始文件 应用程序包括来自其他几个servlet的输出,而不仅仅是一个servlet。开放 对于每个include,新的HTTP请求将是低效的,因为请求的数量会减少 将乘以包含的servlet的数量,这将是相当丑陋的 最重要的是

更新: 我在Tomee1.7.2和WebSphereApplicationServerV8.5上进行了尝试。结果总结如下

WAS 8.5 Tomcat 7.0.62 Tomee 1.7.2 ======= ============= =========== CDI servlet direct access works works works Included by servlet works works works in same web app Included by servlet works broken broken in different web app 我越想这个问题,就越觉得它真的应该起作用。你应该能够 成功使用请求调度器在Tomcat上包含支持CDI的servlet的输出。
我希望这里有人能帮我想办法让它工作。

哇!在一个好朋友的帮助下,我成功了

要实现这一点,您需要配置一个特殊的焊接交叉上下文过滤器。您可以通过向web.xml文件添加以下行来配置筛选器

<filter>
   <filter-name>WeldCrossContextFilter</filter-name>
   <filter-class>org.jboss.weld.servlet.WeldCrossContextFilter</filter-class>
</filter>
<filter-mapping>
   <filter-name>WeldCrossContextFilter</filter-name>
   <url-pattern>/*</url-pattern>
   <dispatcher>INCLUDE</dispatcher>
   <dispatcher>FORWARD</dispatcher>
   <dispatcher>ERROR</dispatcher>
</filter-mapping>
当我配置它时,CDIServlet的跨上下文包含会按预期工作。 我在Tomcat 7.0.42和8.0.23上试过了,到目前为止,还不错

另见:

我在官方焊接文档中查找过滤器的引用,但无法找到
找到任何东西。不管怎样,我希望这可能会对某人有所帮助。

还有……上有什么?您如何实际获取CDIServlet生成的内容?第二:您可以直接从浏览器或HttpRequester工具而不是通过前端控制器调用servlet吗?成功了吗?嗨,金比,谢谢你的回复。我扩展了代码片段,还添加了程序输出文本。如果我直接访问CDIServlet,它就会工作。如果我通过与CDiPortlet位于同一web应用程序中的DispatcherServlet访问CDIServlet,它也可以工作。当我试图从不同的上下文中包含servlet时,它失败了。问得好。本质上,当跨上下文包含完成时,CDI/Weld没有机会初始化自身。这实际上并没有让我觉得奇怪,因为在这种情况下,CDIServlet将不涉及实际的HTTP请求,所以CDI侦听器甚至可能不会被触发。技术解决方法:对第二个servlet执行HTTP请求,但我想知道是否有合适的解决方案。我也这么认为-看起来CDI没有初始化自己,可能是因为CDI侦听器没有启动。有趣的是,有一个特殊的Tomcat上下文标志类似于此:fireRequestListenersOnForwards:设置为true,以便在Tomcat转发请求时触发任何配置的ServletRequestListeners。这主要用于CD的用户
I使用ServletRequestListeners为请求配置必要的环境的框架。如果未指定,则使用默认值false。我在DispatcherServlet上设置了它,但它似乎没有帮助。您的问题相当混乱。您能解释一下您部署的每个WAR文件中都包含哪些内容吗?为什么需要两个不同的war文件?
Simple CDI Servlet
finally here we are. Name is: InjectedBean
Simple CDI Servlet Including Servlet
Will now include the CDI servlet ...
Got the RequestDispatcher.
Simple CDI Servlet
finally here we are. Name is: InjectedBean
CDI Servlet Includer

This servlet includes a CDI servlet in a different web app. It is not CDI enabled.

Got the RequestDispatcher.
Simple CDI Servlet
finally here we are. Name is: 
WAS 8.5 Tomcat 7.0.62 Tomee 1.7.2 ======= ============= =========== CDI servlet direct access works works works Included by servlet works works works in same web app Included by servlet works broken broken in different web app
<filter>
   <filter-name>WeldCrossContextFilter</filter-name>
   <filter-class>org.jboss.weld.servlet.WeldCrossContextFilter</filter-class>
</filter>
<filter-mapping>
   <filter-name>WeldCrossContextFilter</filter-name>
   <url-pattern>/*</url-pattern>
   <dispatcher>INCLUDE</dispatcher>
   <dispatcher>FORWARD</dispatcher>
   <dispatcher>ERROR</dispatcher>
</filter-mapping>