Проблема JSF после перезапуска сервера: не удалось найти сохраненное состояние просмотра
Продолжая решать эту проблему, я заменил Mojarra на MyFaces и обновил JDK, и когда я продолжаю работать с формой после перезапуска сервера, появляется следующая ошибка:
Произошла ошибка:
/food.xhtmlNo saved view state could be found for the view identifier: /food.xhtml
Caused by:
javax.faces.application.ViewExpiredException - /food.xhtmlNo saved view state could be found for the view identifier: /food.xhtml
Консоль:
SEVERE: Exception loading sessions from persistent storage
java.lang.IllegalStateException: unread block data
at java.io.ObjectInputStream$BlockDataInputStream.setBlockDataMode(ObjectInputStream.java:2376)
Трассировки стека:
javax.faces.application.ViewExpiredException: /food.xhtmlNo saved view state could be found for the view identifier: /food.xhtml
at org.apache.myfaces.lifecycle.RestoreViewExecutor.execute(RestoreViewExecutor.java:128)
at org.apache.myfaces.lifecycle.LifecycleImpl.executePhase(LifecycleImpl.java:171)
at org.apache.myfaces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:189)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:304)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:240)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:164)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:462)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:563)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:399)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:317)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:204)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:182)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:311)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:662)
И мой web.xml:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
id="WebApp_ID" version="3.0">
<display-name>PORTAL</display-name>
<session-config>
<session-timeout>180</session-timeout>
</session-config>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.xhtml</welcome-file>
<welcome-file>index.htm</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>Faces Servlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>*.xhtml</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>*.jsf</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>*.faces</url-pattern>
</servlet-mapping>
<context-param>
<param-name>javax.faces.STATE_SAVING_METHOD</param-name>
<param-value>client</param-value>
</context-param>
<context-param>
<param-name>javax.servlet.jsp.jstl.fmt.localizationContext</param-name>
<param-value>resources.application</param-value>
</context-param>
<context-param>
<param-name>javax.faces.DEFAULT_SUFFIX</param-name>
<param-value>.xhtml</param-value>
</context-param>
</web-app>
Вы когда-нибудь встречали такое сообщение об ошибке?
5 ответов
РЕШЕНИЕ: я должен был рассмотреть, какие классы должны быть сериализуемыми, а какие нет.
Это может быть немного поздно, чтобы ответить, но у меня была та же проблема, и я потратил довольно много времени на ее решение. Итак, я подумал, что это может помочь кому-то еще.
По умолчанию, MyFaces
выполняет сериализацию состояния, даже когда состояние сохраняется на сервере, в то время как Mojarra
не. Итак, если у вас есть некоторые bean-компоненты, которые не сериализуются или используют другие bean-компоненты, которые не сериализуются, вы увидите эту ошибку (сервер не может сериализовать объект).
Вы можете отключить сериализацию так MyFaces
будет работать как Mojarra
, Проверьте эту ссылку: ViewScoped Bean вызывает NotSerializableException
Проблема, с которой вы здесь столкнулись, типична и вызвана тем, что по умолчанию MyFaces генерирует случайный секрет для кодирования состояния просмотра. Каждый раз, когда сервер перезагружается, генерируется новый случайный секрет.
Чтобы решить эту проблему, вам нужно настроить некоторые параметры веб-конфигурации, в частности org.apache.myfaces.SECRET и org.apache.myfaces.MAC_SECRET, чтобы каждый раз при перезапуске сервера использовался один и тот же секрет. У Мохарры тоже есть что-то похожее, но я не помню названия параметра в данный момент.
Проверьте эту страницу Защитите свое приложение с MyFaces. Там вы можете найти все детали, необходимые для настройки вашего шифрования.
Вы можете отправлять вопросы о MyFaces, подписавшись на списки рассылки пользователей и разработчиков.
Как сказано, на другой ответ, нужно определить СЕКРЕТ. Я следовал инструкциям на http://wiki.apache.org/myfaces/Secure_Your_Application. Я добавил следующие строки в web.xml
(измените секреты соответственно). И не забудьте загрузить файлы политики JCE неограниченной силы.
<context-param>
<param-name>org.apache.myfaces.ALGORITHM</param-name>
<param-value>AES</param-value>
</context-param>
<!-- Defines the secret (Base64 encoded) used to initialize the secret key
for encryption algorithm. The size of it depends on the algorithm used for encryption -->
<context-param>
<param-name>org.apache.myfaces.SECRET</param-name>
<param-value>MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIz</param-value>
</context-param>
<!-- Define the initialization code (Bas64 encoded) that are used to initialize the secret key used
on the Message Authentication Code algorithm. The size of it depends on the algorithm used for mac calculation -->
<context-param>
<param-name>org.apache.myfaces.MAC_SECRET</param-name>
<param-value>YWJjZDEyMzQ=</param-value>
</context-param>
Я обычно получаю эту ошибку. Я использую myfaces 1.2 и websphere 7, но тогда я не перезагружал сервер. Сначала я остановил сервер, затем снова запустил, а не перезагружал. Это сработало.