Liberty Web 应用程序 ViewExpiredException - 找不到视图标识符的已保存视图状态

Liberty Web application ViewExpiredException - No saved view state could be found for the view identifier

对于这种类似的情况,我已经看到很多 post,但我相信我的问题可能有所不同。我已经找出原因,但还没有想出如何解决它。我是 运行 位于三个不同区域的 CICS 中的 3 台自由服务器,它们都使用相同的捆绑包来启动 Web 应用程序。 Web 应用程序完全可以运行并且运行良好,但是当所有三个服务器都启动并且在三个不同区域 运行 时,应用程序会收到 ViewExpiredException。我已经证明这就是通过关闭两台服务器并尝试复制问题但没有成功而出现问题的原因。

关于我的代码,如果需要,我可以post任何。正如我所说,该应用程序是 100% 可运行的,但只有当一台服务器正在使用它时。我的所有方法 classes 都是会话范围的,除了我的数据库操作 class,它是应用程序范围的。我相信工作负载管理会导致当前会话偶尔在服务器之间跳转,而这样做会导致错误。如果有人知道如何解决这个问题,我将不胜感激。非常感谢!

编辑:我正在 post 堆栈跟踪。

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.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)

我想我可能找到了解决办法。此问题可能是由于状态保存方法被设置为服务器。我已将其添加到代码的 web.xml 中:

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

据我了解,由于应用程序在服务器之间跳转,因此发生异常是因为状态保存方法是服务器端的,因此当我们前往另一台服务器时它会丢失。将方法更改为客户端可能会解决此问题。

我目前正在尝试重现该问题。如果我做不到,我会 select 这个作为解决方案。