Выход из JSF с помощью bean-компонента ViewScoped

В моем приложении у меня есть верхняя панель с кнопкой выхода из системы, которая вызывает метод компонента

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)

Единственная разница между этой страницей и другой заключается в том, что здесь используется Bean-компонент ViewScoped, но я не понимаю, как это может быть проблемой. решения? Благодарность


person Cattani Simone    schedule 23.01.2014    source источник
comment
Не могли бы вы решить эту проблему?   -  person Theo    schedule 10.06.2015


Ответы (2)


Вы пробовали это?

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

Меня устраивает...

person Bruno    schedule 26.03.2014

У меня была аналогичная проблема с NullPointerException, выбрасываемым с помощью Wildfly9.

Когда пользователь входит в нашу систему, мы регистрируем его, а затем аннулируем его предыдущие сеансы. Проблема в том, что когда мы используем bean-компонент CDI SessionScoped, Wildfly дает следующую трассировку стека:

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]

Я даже попробовал решение, представленное в Как обнаружить непонятную ошибку кластеризации высокой доступности в Wildfly 8.2.0.Final . Проблема была другой, но Stacktrace был похож, поэтому я попробовал, но безуспешно.

Это не имело никакого смысла. Почему аннулирование одного сеанса может привести к проблемам с компонентами сеанса, принадлежащими другому сеансу. Это в основном то же самое, когда один пользователь входит в систему, а другой выходит из системы. Их сеансовые компоненты не должны иметь никаких помех. В качестве последней надежды я попытался выполнить код аннулирования предыдущих сеансов в другом потоке, и это сработало. По какой-то неизвестной мне причине создание нового сеанса и аннулирование других в том же методе вызывает проблемы с bean-компонентами с областью сеанса, но их использование в другом потоке работает нормально.

Я надеюсь, что это поможет кому-то еще, кто застрял в той же проблеме.

Примечание. Возможно, подход с самого начала был неверным, и нам нужно было сделать предыдущие сеансы недействительными, а затем войти в систему. Не тестировал этот сеанс, так как он требует много работы.

person ontime    schedule 02.03.2016