Wildflt 13 WELD-001304:作用域类型javax.enterprise.context.SessionScoped的多个上下文处于活动状态

问题描述 投票:0回答:1

我有时正在看的一个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的多个上下文处于活动状态...

jsf cdi weld deltaspike
1个回答
0
投票

现在已理解该问题。

© www.soinside.com 2019 - 2024. All rights reserved.