我有时正在看的一个JEE应用程序-不知道为什么会发生-变成这种异常。
WELD-001304: More than one context active for scope type javax.enterprise.context.SessionScoped
at org.jboss.weld.manager.BeanManagerImpl.internalGetContext(BeanManagerImpl.java:678)
at org.jboss.weld.manager.BeanManagerImpl.getContext(BeanManagerImpl.java:645)
at org.jboss.weld.bean.ContextualInstanceStrategy$DefaultContextualInstanceStrategy.getIfExists(ContextualInstanceStrategy.java:89)
at org.jboss.weld.bean.ContextualInstanceStrategy$CachingContextualInstanceStrategy.getIfExists(ContextualInstanceStrategy.java:164)
at org.jboss.weld.bean.ContextualInstance.getIfExists(ContextualInstance.java:63)
at org.jboss.weld.bean.proxy.ContextBeanInstance.getInstance(ContextBeanInstance.java:87)
at org.jboss.weld.bean.proxy.ProxyMethodHandler.getInstance(ProxyMethodHandler.java:131)
at org.apache.deltaspike.core.impl.scope.window.WindowBeanHolder$Proxy$_$$_WeldClientProxy.getContextualStorage(Unknown Source)
at org.apache.deltaspike.core.impl.scope.window.WindowContextImpl.getContextualStorage(WindowContextImpl.java:119)
at org.apache.deltaspike.core.util.context.AbstractContext.get(AbstractContext.java:78)
at org.jboss.weld.contexts.PassivatingContextWrapper$AbstractPassivatingContextWrapper.get(PassivatingContextWrapper.java:70)
at org.jboss.weld.bean.ContextualInstanceStrategy$DefaultContextualInstanceStrategy.getIfExists(ContextualInstanceStrategy.java:89)
at org.jboss.weld.bean.ContextualInstance.getIfExists(ContextualInstance.java:63)
at org.jboss.weld.bean.proxy.ContextBeanInstance.getInstance(ContextBeanInstance.java:87)
at org.jboss.weld.bean.proxy.ProxyMethodHandler.getInstance(ProxyMethodHandler.java:131)
at org.apache.deltaspike.core.impl.scope.viewaccess.ViewAccessViewHistory$Proxy$_$$_WeldClientProxy.getLastView(Unknown Source)
at org.apache.deltaspike.core.impl.scope.viewaccess.ViewAccessContext.close(ViewAccessContext.java:131)
at org.apache.deltaspike.core.impl.scope.viewaccess.ViewAccessContext.onProcessingViewFinished(ViewAccessContext.java:119)
at org.apache.deltaspike.jsf.impl.listener.request.DeltaSpikeLifecycleWrapper.render(DeltaSpikeLifecycleWrapper.java:118)
at javax.faces.lifecycle.LifecycleWrapper.render(LifecycleWrapper.java:92)
at org.apache.deltaspike.jsf.impl.listener.request.JsfClientWindowAwareLifecycleWrapper.render(JsfClientWindowAwareLifecycleWrapper.java:160)
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:659)
at io.undertow.servlet.handlers.ServletHandler.handleRequest(ServletHandler.java:74)
尚不清楚为什么会这样。而且副作用并不总是相同的。在某些情况下,如果您尝试使用其他浏览器以隐身模式登录,则确实需要重新启动服务器。好像来自WELD的BeanManager已被完全烘烤。
此错误最经常发生,是在您睡觉时和第二天开始与应用程序进行交互时。但是有趣的是,如果我开始触发精油测试,这种情况也会经常发生。不知道为什么硒测试会加剧异常。
我现在通过放置一个断点看到,我们已经尝试解决一些注入点注释。在某些时候,它要解决的不便之处之一是:
at org.jboss.weld.bean.proxy.ContextBeanInstance.getInstance(ContextBeanInstance.java:87)
It is doing a
T existingInstance = ContextualInstance.getIfExists(bean, manager);
Where the Managed Bean
parameter bean = [class org.apache.deltaspike.core.impl.scope.window.WindowBeanHolder] with qualifiers [@Any @Default]
It is tring to resolve the bean injext:
[[BackedAnnotatedField] @Inject private org.apache.deltaspike.core.impl.scope.window.WindowBeanHolder.windowContextQuotaHandler]
Into the bean:
Managed Bean [class org.apache.deltaspike.jsf.impl.scope.window.JsfWindowContextQuotaHandler] with qualifiers [@Any @Default]
此窗口bean持有人(我相信可以是任何其他bean,都无关紧要)使用会话范围的注释进行注释:
@SessionScoped
public class WindowBeanHolder extends AbstractBeanHolder<String>
{
然后,由于在第678行输入返回SessionScoped上下文的逻辑时,系统由于wildfly beanmanager impl而中断,因此:
private Context internalGetContext(Class<? extends Annotation> scopeType) { Context activeContext = null; final List<Context> ctx = contexts.get(scopeType); if (ctx == null) { return null; } for (Context context : ctx) { if (context.isActive()) { if (activeContext == null) { activeContext = context; } else { throw BeanManagerLogger.LOG.duplicateActiveContexts(scopeType.getName()); } } } return activeContext; }
此BeanManagerImpl代码对显然两个SessionScopedContexts处于同一活动状态这一事实将不满意。
在此代码片段中,我在调试器中看到的是contexts变量包含以下3个会话作用域的上下文:[org.jboss.weld.contexts.bound.BoundSessionContextImpl@136b5782,org.jboss.weld.module.web.context.http.HttpSessionContextImpl@6ef334ee,org.jboss.weld.module.web.context.http.HttpSessionDestructionContext@37a5a86e]
The first ACTIVE CONTEXT found was: oactiveContext = rg.jboss.weld.module.web.context.http.HttpSessionContextImpl@6ef334ee The second CONTEXT we have is: context = org.jboss.weld.module.web.context.http.HttpSessionDestructionContext@37a5a86e
这意味着,无论出于什么原因,在我的系统中,HttpSessionContextImpl和HttpSessionDestructionContext都可以。
我不知道如何在ACTIVE / INACTIVE之间切换这些上下文,如果这应该是特定于“ ThreadContext”的标志,则对于给定的线程,该会话作用域已损坏,但其他具有不同JESSESIONID cookie的线程将在其中启动适当的原始状态。只有一个会话上下文处于活动状态。
关于什么可能导致这种情况的任何想法?
注意,widlfly 13.0。最终用途:
<dependency> <groupId>org.jboss.weld</groupId> <artifactId>weld-core-impl</artifactId> <version>3.0.4.Final</version> <scope>provided</scope> </dependency>
非常感谢
我有时正在看的一个JEE应用程序-不知道为什么会发生-变成这种异常。 WELD-001304:作用域类型为javax.enterprise.context.SessionScoped的多个上下文处于活动状态...
现在已理解该问题。