Веб-приложение Liberty ViewExpiredException - не удалось найти сохраненное состояние просмотра для идентификатора представления

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

Что касается моего кода, я могу опубликовать любой, если это необходимо. Как я уже сказал, приложение работает на 100%, но только когда его использует один сервер. Все мои классы методов относятся к области сеанса, за исключением класса операций с базой данных, который относится к области приложения. Я полагаю, что управление рабочей нагрузкой приводит к тому, что текущая сессия иногда переходит между серверами, и это вызывает ошибку. Если кто-нибудь знает, как это исправить, я буду очень признателен. Спасибо!

РЕДАКТИРОВАТЬ: я публикую трассировку стека.

Caused by: javax.faces.application.ViewExpiredException: /main.xhtml - No saved view state could be found for the view identifier: /main.xhtml
at org.apache.myfaces.lifecycle.RestoreViewExecutor.execute(RestoreViewExecutor.java:183)
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:1255)
at com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:743)
at com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:440)
at com.ibm.ws.webcontainer.filter.WebAppFilterManager.invokeFilters(WebAppFilterManager.java:1156)
at com.ibm.ws.webcontainer.filter.WebAppFilterManager.invokeFilters(WebAppFilterManager.java:1004)
at com.ibm.ws.webcontainer.servlet.CacheServletWrapper.handleRequest(CacheServletWrapper.java:76)
at com.ibm.ws.webcontainer.WebContainer.handleRequest(WebContainer.java:921)
at com.ibm.ws.webcontainer.osgi.DynamicVirtualHost$2.run(DynamicVirtualHost.java:281)
at com.ibm.ws.http.dispatcher.internal.channel.HttpDispatcherLink$TaskWrapper.run(HttpDispatcherLink.java:960)
at com.ibm.cics.wlp.impl.CICSHttpRunnable.run(CICSHttpRunnable.java:244)
at com.ibm.cics.wlp.impl.CICSTaskWrapper.runWork(CICSTaskWrapper.java:701)
at com.ibm.cics.wlp.impl.CICSTaskWrapper.run(CICSTaskWrapper.java:386)

1 ответ

Решение

Я думаю, что, возможно, нашел решение. Эта проблема может быть связана с тем, что для метода сохранения состояния задан сервер. Я добавил это в web.xml моего кода:

<context-param>
    <param-name>javax.faces.STATE_SAVING_METHOD</param-name>
    <param-value>server</param-value>
</context-param>

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

В настоящее время я пытаюсь повторить проблему. Если я не смогу сделать это, я выберу это в качестве решения.

Другие вопросы по тегам