Primefaces WELD-001303:在Websphere上没有作用域类型javax.enterprise.context.sessionScope的活动上下文

Primefaces WELD-001303:在Websphere上没有作用域类型javax.enterprise.context.sessionScope的活动上下文,primefaces,websphere,cdi,jsf-2.2,phaselistener,Primefaces,Websphere,Cdi,Jsf 2.2,Phaselistener,我们已经将应用程序升级为使用CDIBeans。当我们在Wildfly 10.x上部署应用程序时,这一变化非常顺利,但当我们尝试在WebSphereClassic和Liberty上部署相同的应用程序时,出现了一些问题 我们已经在这里找到了几个问题,比如,或者,但是没有一个答案能够解决我们的问题 在我的本地主机上,我将WebSphereLiberty配置文件与webProfile-7.0一起使用,这意味着CDI-1.2、EL-3.0、JSF-2.2和servlet-3.1。 我们的应用程序还使用Pr

我们已经将应用程序升级为使用CDIBeans。当我们在Wildfly 10.x上部署应用程序时,这一变化非常顺利,但当我们尝试在WebSphereClassic和Liberty上部署相同的应用程序时,出现了一些问题

我们已经在这里找到了几个问题,比如,或者,但是没有一个答案能够解决我们的问题

在我的本地主机上,我将WebSphereLiberty配置文件与webProfile-7.0一起使用,这意味着CDI-1.2、EL-3.0、JSF-2.2和servlet-3.1。 我们的应用程序还使用Primefaces 6.0

该问题发生在相位侦听器上。在它上面,我们正在注入一个Bean,该Bean带有
@Named
(javax.inject.Named)和
@SessionScoped
(javax.enterprise.context.SessionScoped)注释

在phaseListener上调用注入变量时,会引发以下错误

[err] 2017-05-10 09:45:06 ERROR MWExceptionHandler:139 - A server exception occurred
org.jboss.weld.context.ContextNotActiveException: WELD-001303: No active contexts for scope type javax.enterprise.context.SessionScoped
at org.jboss.weld.manager.BeanManagerImpl.getContext(BeanManagerImpl.java:691)
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:83)
at org.jboss.weld.bean.proxy.ProxyMethodHandler.getInstance(ProxyMethodHandler.java:125)
at web.frmwrk.mgbean.WebSession$Proxy$_$$_WeldClientProxy.getLocale(Unknown Source)
at web.frmwrk.application.LocaleFaceletViewHandler.calculateLocale(LocaleFaceletViewHandler.java:43)
at javax.faces.application.ViewHandlerWrapper.calculateLocale(ViewHandlerWrapper.java:76)
at org.apache.myfaces.application.ResourceHandlerImpl.getLocalePrefixForLocateResource(ResourceHandlerImpl.java:715)
at org.apache.myfaces.application.ResourceHandlerImpl.createViewResource(ResourceHandlerImpl.java:1609)
at org.apache.myfaces.application.ResourceHandlerImpl.createViewResource(ResourceHandlerImpl.java:62)
at javax.faces.application.ResourceHandlerWrapper.createViewResource(ResourceHandlerWrapper.java:83)
at javax.faces.application.ResourceHandlerWrapper.createViewResource(ResourceHandlerWrapper.java:83)
at javax.faces.application.ResourceHandlerWrapper.createViewResource(ResourceHandlerWrapper.java:83)
at javax.faces.application.ResourceHandlerWrapper.createViewResource(ResourceHandlerWrapper.java:83)
at org.apache.myfaces.view.facelets.impl.DefaultResourceResolver.resolveUrl(DefaultResourceResolver.java:53)
at org.apache.myfaces.view.facelets.impl.DefaultResourceResolver.resolveUrl(DefaultResourceResolver.java:39)
at org.apache.myfaces.view.facelets.FaceletViewDeclarationLanguage.viewExists(FaceletViewDeclarationLanguage.java:325)
at org.apache.myfaces.shared.application.DefaultViewHandlerSupport.checkResourceExists(DefaultViewHandlerSupport.java:573)
at org.apache.myfaces.shared.application.DefaultViewHandlerSupport.handleSuffixMapping(DefaultViewHandlerSupport.java:507)
at org.apache.myfaces.shared.application.DefaultViewHandlerSupport.calculateViewId(DefaultViewHandlerSupport.java:113)
at org.apache.myfaces.application.ViewHandlerImpl.deriveLogicalViewId(ViewHandlerImpl.java:122)
at javax.faces.application.ViewHandlerWrapper.deriveLogicalViewId(ViewHandlerWrapper.java:112)
at javax.faces.application.ViewHandlerWrapper.deriveLogicalViewId(ViewHandlerWrapper.java:112)
at javax.faces.application.ViewHandlerWrapper.deriveLogicalViewId(ViewHandlerWrapper.java:112)
at javax.faces.application.ViewHandlerWrapper.deriveLogicalViewId(ViewHandlerWrapper.java:112)
at org.apache.myfaces.lifecycle.RestoreViewExecutor.execute(RestoreViewExecutor.java:225)
at org.apache.myfaces.lifecycle.LifecycleImpl.executePhase(LifecycleImpl.java:196)
at org.apache.myfaces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:143)
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:198)
at com.ibm.ws.webcontainer.servlet.ServletWrapper.service(ServletWrapper.java:1290)
at com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:778)
at com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:475)
at com.ibm.ws.webcontainer.filter.WebAppFilterChain.invokeTarget(WebAppFilterChain.java:148)
at com.ibm.ws.webcontainer.filter.WebAppFilterChain.doFilter(WebAppFilterChain.java:79)
at com.ibm.ws.webcontainer.filter.WebAppFilterManager.doFilter(WebAppFilterManager.java:1021)
at com.ibm.ws.webcontainer.filter.WebAppFilterManager.invokeFilters(WebAppFilterManager.java:1143)
at com.ibm.ws.webcontainer.webapp.WebAppRequestDispatcher.dispatch(WebAppRequestDispatcher.java:1381)
at com.ibm.ws.webcontainer.webapp.WebAppRequestDispatcher.include(WebAppRequestDispatcher.java:541)
at com.ibm.ws.webcontainer.webapp.WebApp.sendError(WebApp.java:4265)
at com.ibm.ws.webcontainer.webapp.WebApp.handleException(WebApp.java:5031)
at com.ibm.ws.webcontainer.webapp.WebApp.handleRequest(WebApp.java:5011)
at com.ibm.ws.webcontainer31.osgi.webapp.WebApp31.handleRequest(WebApp31.java:525)
at com.ibm.ws.webcontainer.osgi.DynamicVirtualHost$2.handleRequest(DynamicVirtualHost.java:315)
at com.ibm.ws.webcontainer.WebContainer.handleRequest(WebContainer.java:1014)
at com.ibm.ws.webcontainer.osgi.DynamicVirtualHost$2.run(DynamicVirtualHost.java:280)
at com.ibm.ws.http.dispatcher.internal.channel.HttpDispatcherLink$TaskWrapper.run(HttpDispatcherLink.java:967)
at com.ibm.ws.http.dispatcher.internal.channel.HttpDispatcherLink.wrapHandlerAndExecute(HttpDispatcherLink.java:359)
at com.ibm.ws.http.dispatcher.internal.channel.HttpDispatcherLink.ready(HttpDispatcherLink.java:318)
at com.ibm.ws.http.channel.internal.inbound.HttpInboundLink.handleDiscrimination(HttpInboundLink.java:471)
at com.ibm.ws.http.channel.internal.inbound.HttpInboundLink.handleNewRequest(HttpInboundLink.java:405)
at com.ibm.ws.http.channel.internal.inbound.HttpInboundLink.processRequest(HttpInboundLink.java:285)
at com.ibm.ws.http.channel.internal.inbound.HttpICLReadCallback.complete(HttpICLReadCallback.java:66)
at com.ibm.ws.tcpchannel.internal.WorkQueueManager.requestComplete(WorkQueueManager.java:504)
at com.ibm.ws.tcpchannel.internal.WorkQueueManager.attemptIO(WorkQueueManager.java:574)
at com.ibm.ws.tcpchannel.internal.WorkQueueManager.workerRun(WorkQueueManager.java:929)
at com.ibm.ws.tcpchannel.internal.WorkQueueManager$Worker.run(WorkQueueManager.java:1018)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
[ERROR   ] SRVE0777E: Exception thrown by application class 'javax.faces.webapp.FacesServlet.service:230'
javax.servlet.ServletException: WELD-001303: No active contexts for scope type javax.enterprise.context.SessionScoped
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:230)
at [internal classes]
Caused by: org.jboss.weld.context.ContextNotActiveException: WELD-001303: No active contexts for scope type javax.enterprise.context.SessionScoped
at org.jboss.weld.manager.BeanManagerImpl.getContext(BeanManagerImpl.java:691)
at [internal classes]
at web.frmwrk.mgbean.WebSession$Proxy$_$$_WeldClientProxy.getLocale(Unknown Source)
at web.frmwrk.application.LocaleFaceletViewHandler.calculateLocale(LocaleFaceletViewHandler.java:43)
at javax.faces.application.ViewHandlerWrapper.calculateLocale(ViewHandlerWrapper.java:76)
... 1 more
下面是我们希望注入的会话范围bean

@Named("ws")
@SessionScoped
public class WebSession extends LoggableBean {
    private static final long serialVersionUID = 5L;

    @Inject
    protected WebApplication wa;

    /** True if session originates from a trusted logon */
    private boolean trusted = false;

    /**
     * Current user, null if not logged in (this may be a simulated user token if {@link #simulateUser(int)} was called
     * before.
     */
    private ISofTokenType userToken;

    /**
     * Original login user (identical to userToken if not simulating another user
     */
    private ISofTokenType loginUserToken;

    /** Current locale of the websession. */
    private Locale locale;

    /** The policy rules resolver for this session */
    private transient PolicyResolver policy;

    @Inject
    protected Config config;

    @Inject
    protected WebPaths path;

    @Inject
    protected WebApplicationStore waStore;

    @PostConstruct
    protected void init() {
        try {
            setLocale(LocaleUtils.getDefaultLanguage().getCode());
        } catch (ConfigurationException ex) {
            // Fallback to default language in config.xml
            getLog().error(ex);
            locale = FacesContext.getCurrentInstance().getApplication().getDefaultLocale();
        }
    }

    /**
     * Check if the currentRelease session is linked with a logged in user or if the visitor is a guest.
     * 
     * @return True if the user is logged in, false otherwise.
     */
    public boolean isLoggedIn() {
        return userToken != null;
    }
}
这是phaseListener

public class PolicyController implements PhaseListener {
    private static final long serialVersionUID = 2189917635371117541L;

    private static final Log log = LogFactory.getLog(PolicyController.class);
    private static final String VALIDATION_ERROR_DEFAULT_KEY = "validation_error_default";
    private static final String COMPONENT_ATTRIBUTE_RENDERED_MODIFIED_BY_RULE = "rendered-modified-by-policy";

    private static enum PhaseMoment {
        BEFORE, AFTER
    };

    @Inject
    private WebSession ws;

    public void beforePhase(PhaseEvent event) {
        if (!FacesHelper.getConfig().getBoolean(Properties.POLICY_CONTROLLER_ENABLED, true)) {
            if (event.getPhaseId() == PhaseId.RENDER_RESPONSE) log.debug("Policy is disabled");
            return;
        }

        if ((event.getPhaseId() == PhaseId.RENDER_RESPONSE || event.getPhaseId() == PhaseId.PROCESS_VALIDATIONS)
                && ws.isLoggedIn()) { // <- Error happens here
            // Apply the rules...
            FacesContext fc = event.getFacesContext();
            log.debug("Run PolicyController before " + event.getPhaseId() + " (viewroot has "
                    + fc.getViewRoot().getChildCount() + " direct children)");
            traverseComponent(fc, fc.getViewRoot(), event.getPhaseId(), PhaseMoment.BEFORE);
        }
    }

    public void afterPhase(PhaseEvent event) {
        if (!FacesHelper.getConfig().getBoolean(Properties.POLICY_CONTROLLER_ENABLED, true)) {
            return;
        }

        if ((event.getPhaseId() == PhaseId.PROCESS_VALIDATIONS || event.getPhaseId() == PhaseId.RESTORE_VIEW)
                && ws.isLoggedIn()) { // <- Error happens here
            FacesContext fc = event.getFacesContext();
            log.debug("Run PolicyController after " + event.getPhaseId() + " (viewroot has "
                    + fc.getViewRoot().getChildCount() + " direct children)");
            traverseComponent(fc, fc.getViewRoot(), event.getPhaseId(), PhaseMoment.AFTER);
        }
    }
}
在if语句之前,使用webSession而不是ws,但得到了相同的错误

我想再次指出,这在Wildfly中运行良好,这导致我们假设我们正确地实现了代码。此外,我们确信我们使用的是Java8,服务器支持JEE7,因此,从我们所看到的所有地方来看,我们都认为这应该是我们的Websphere版本所支持的。 在WebSphereClassic9.0上部署应用程序时,我们遇到了完全相同的问题

到目前为止,我们发现的唯一区别是Websphere使用Myfaces,而Wildfly使用Mojara。这可能是我脸上的某种缺陷吗?我们是否需要使用任何特定的配置或代码来支持这类事情


如果您需要有关我们的实现的更多信息来帮助找出原因,请告诉我。

跟进这个问题已经晚了4年,但是,如果其他人发现了,应该在WebSphere上将解决方案设置为DelferServletRequestListenerDestroyonerror

因此,如果您在Liberty上,只需在server.xml上执行以下操作:


您能发布来自phaseListener和@SessionScoped bean的相关代码吗?在原始文本中添加了与问题相关的代码。Websphere Liberty 19.0中也存在同样的问题。还注意到这可能是由于myfaces,因为Wildfly正在使用Mojarra。
FacesContext context = event.getFacesContext();
WebSession webSession = context.getApplication().evaluateExpressionGet(context, "#{ws}", WebSession.class);