使用ViewScoped bean的JSF注销

时间:2014-01-23 14:27:10

标签: jsf omnifaces view-scope

在我的应用程序中,我有一个带有注销按钮的顶栏,可以调用bean方法

public String logout(){
    FacesContext.getCurrentInstance().getExternalContext().invalidateSession();
    return Navigator.goTo("/index.xhtml");
}

它运作良好,但我有一个特定的页面,它失败了这个例外

2014-01-23T15:17:42.405+0100|WARNING: StandardWrapperValve[Faces Servlet]: Servlet.service() for servlet Faces Servlet threw exception
java.lang.NullPointerException
    at org.jboss.weld.context.beanstore.http.AbstractSessionBeanStore.getLockStore(AbstractSessionBeanStore.java:120)
    at org.jboss.weld.context.beanstore.AttributeBeanStore.lock(AttributeBeanStore.java:219)
    at org.jboss.weld.context.AbstractContext.get(AbstractContext.java:97)
    at org.jboss.weld.context.PassivatingContextWrapper$AbstractPassivatingContextWrapper.get(PassivatingContextWrapper.java:64)
    at org.jboss.weld.bean.proxy.ContextBeanInstance.getInstance(ContextBeanInstance.java:93)
    at org.jboss.weld.bean.proxy.ProxyMethodHandler.invoke(ProxyMethodHandler.java:79)
    at org.omnifaces.cdi.viewscope.ViewScopeManager$Proxy$_$$_WeldClientProxy.preDestroyView(Unknown Source)
    at org.omnifaces.application.ViewScopeEventListener.processEvent(ViewScopeEventListener.java:56)
    at javax.faces.event.SystemEvent.processListener(SystemEvent.java:108)

这个页面和另一个页面之间的唯一区别是这个页面使用ViewScoped Bean,但我不明白这是怎么回事。解决方案?感谢

2 个答案:

答案 0 :(得分:2)

你试过这个吗?

String path = FacesContext.getCurrentInstance().getExternalContext().getApplicationContextPath() + "/index.xhtml";
FacesContext.getCurrentInstance().getExternalContext().invalidateSession();
FacesContext.getCurrentInstance().getExternalContext().redirect(path);

对我有用......

答案 1 :(得分:0)

我遇到类似的问题,使用Wildfly9抛出NullPointerException。

当用户登录我们的系统时,我们将他登录,然后我们使之前的会话无效。问题是,当我们使用CDI SessionScoped bean时,Wildfly会给出这个Stacktrace:

java.lang.NullPointerException at org.jboss.weld.context.beanstore.http.AbstractSessionBeanStore.getLockStore(AbstractSessionBeanStore.java:112) [weld-core-impl-2.2.16.SP1.jar:2015-09-16 08:49] at org.jboss.weld.context.beanstore.AttributeBeanStore.lock(AttributeBeanStore.java:209) [weld-core-impl-2.2.16.SP1.jar:2015-09-16 08:49] at org.jboss.weld.context.AbstractContext.get(AbstractContext.java:90) [weld-core-impl-2.2.16.SP1.jar:2015-09-16 08:49] at org.jboss.weld.context.PassivatingContextWrapper$AbstractPassivatingContextWrapper.get(PassivatingContextWrapper.java:76) [weld-core-impl-2.2.16.SP1.jar:2015-09-16 08:49] at org.jboss.weld.bean.ContextualInstanceStrategy$DefaultContextualInstanceStrategy.get(ContextualInstanceStrategy.java:101) [weld-core-impl-2.2.16.SP1.jar:2015-09-16 08:49] at org.jboss.weld.bean.ContextualInstanceStrategy$CachingContextualInstanceStrategy.get(ContextualInstanceStrategy.java:178) [weld-core-impl-2.2.16.SP1.jar:2015-09-16 08:49] at org.jboss.weld.bean.ContextualInstance.get(ContextualInstance.java:50) [weld-core-impl-2.2.16.SP1.jar:2015-09-16 08:49] at org.jboss.weld.bean.proxy.ContextBeanInstance.getInstance(ContextBeanInstance.java:99) [weld-core-impl-2.2.16.SP1.jar:2015-09-16 08:49] at org.jboss.weld.bean.proxy.ProxyMethodHandler.getInstance(ProxyMethodHandler.java:125) [weld-core-impl-2.2.16.SP1.jar:2015-09-16 08:49]

我甚至尝试了How to hunt down obscure HA clustering bug in Wildfly 8.2.0.Final中提出的解决方案。那里的问题有所不同,但Stacktrace很相似,所以我尝试了但没有成功。

这没有任何意义。为什么使一个会话失效会导致属于另一个会话的会话范围bean出现问题。它基本上与一个用户登录和不同的日志退出系统时相同。他们的会话范围豆应该没有任何干扰。作为最后的希望,我试图在不同的线程中执行使先前会话无效的代码,并且它有效。由于某些未知原因,在同一方法中创建一个新会话并使其他人失效会导致sessioncoped bean出现问题,但将它们放在不同的线程中工作正常。

我希望这可以帮助其他人陷入同样的​​问题。

注意: 也许从一开始的方法是错误的,我们应该使之前的会话无效,然后将用户登录。没有测试过这个,因为它有很多工作要做。