在我的应用程序中,我有一个顶部栏,上面有一个注销按钮,可以调用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,但是我不明白这怎么会是一个问题。解决方案?谢谢
发布于 2014-03-27 03:02:17
你试过这个吗?
String path = FacesContext.getCurrentInstance().getExternalContext().getApplicationContextPath() + "/index.xhtml";
FacesContext.getCurrentInstance().getExternalContext().invalidateSession();
FacesContext.getCurrentInstance().getExternalContext().redirect(path);对我来说很管用。
发布于 2016-03-02 18:27:51
我在使用Wildfly9抛出NullPointerException时也遇到过类似的问题。
当用户登录到我们的系统时,我们会让他登录,然后我们会使他之前的会话无效。问题是,当我们使用CDI时,SessionScoped会给出这个堆栈跟踪:
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的问题。这基本上与一个用户登录和另一个用户从系统中注销是一样的。它们的会话作用域bean应该没有任何干扰。作为最后的希望,我尝试在另一个线程中执行使以前的会话无效的代码,并且它起作用了。对于我来说,出于某种未知的原因,在同一方法中创建一个新会话并使其他会话无效会导致会话作用域bean出现问题,但将它们放在不同的线程中工作得很好。
我希望这能帮助其他在同一问题上陷入困境的人。
注意:可能从一开始的方法就是错误的,我们应该使以前的会话无效,然后让用户登录。我还没有测试这个,因为它有很多工作要做。
https://stackoverflow.com/questions/21310935
复制相似问题