我正在使用MyFaces 1.1到2.1版的现有项目中升级JSF实现。我主要按照Migrating from JSF 1.2 to JSF 2.0中的说明进行操作。
由于我打算暂时升级JSF并推迟从JSP切换到Facelets并将组件库更新到以后的时间,我现在只需完成以下步骤:
myfaces-api
myfaces-impl
和<version>1.1.5</version>
工件的版本从<version>2.1.18</version>
更新为pom.xml
来更新MyFaces库
更新faces-config.xml
以符合从<faces-config>
到
<faces-config
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_2_1.xsd"
version="2.1">
将web.xml
更新为
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/j2ee/web-app_2_5.xsd">
现在,当我尝试在浏览器中打开应用程序时,我可以正常显示正常的起始页面,但是当我点击任何链接时,我收到以下错误:
javax.faces.application.ViewExpiredException: /pages/View.jsf - No saved view state could be found for the view identifier: /pages/View.jsf
at org.apache.myfaces.lifecycle.RestoreViewExecutor.execute(RestoreViewExecutor.java:171)
at org.apache.myfaces.lifecycle.LifecycleImpl.executePhase(LifecycleImpl.java:170)
at org.apache.myfaces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:117)
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:197)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.ajax4jsf.webapp.BaseXMLFilter.doXmlFilter(BaseXMLFilter.java:141)
at org.ajax4jsf.webapp.BaseFilter.doFilter(BaseFilter.java:281)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
...
在使用MyFaces 1.1的应用程序时,我没有收到此错误,它必须连接到我做的几个更改吗?
我尝试了以下方法来解决问题:
javax.faces.STATE_SAVING_METHOD
中的server
参数设置为web.xml
(根据ViewExpiredException: No saved view state could be found: on submitting a form in JSF)将org.apache.myfaces.SERIALIZE_STATE_IN_SESSION
参数添加到我的web.xml
(在阅读here之后,MyFaces 2.1将此参数默认为true
,与之后的Mojarra 2.1及更高版本的MyFaces相反版本):
<context-param>
<param-name>org.apache.myfaces.SERIALIZE_STATE_IN_SESSION</param-name>
<param-value>false</param-value>
</context-param>
将javax.faces.DEFAULT_SUFFIX
参数设置为.jsp
,因为我认为FacesServlet现在可能会为JSF 2.x寻找*.xhtml
模板:
<context-param>
<param-name>javax.faces.DEFAULT_SUFFIX</param-name>
<param-value>.jsp</param-value>
</context-param>
将org.apache.myfaces.USE_ENCRYPTION
参数设置为false
,因为它似乎默认为MyFaces 2.1中的true
(根据Secure Your Application而Random JSF error: no saved view state could be found中的第一个答案意味着重新发布加密密钥可能会导致问题):
<context-param>
<param-name>org.apache.myfaces.USE_ENCRYPTION</param-name>
<param-value>false</param-value>
</context-param>
确保在web.xml
中定义了FacesServlet,并将以.jsf
结尾的网址映射到它:
<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>*.jsf</url-pattern>
</servlet-mapping>
以上步骤都没有解决错误,所以我对它的起源有点迷失 - 特别是因为我没有触及模板本身,只是配置文件。
编辑:我刚刚发现ViewExpiredException on every navigation after migrating from JSF 1.2 to JSF 2.0也许切换JSF实现会起作用,但该帖子中的第二个答案表明MyFaces中的这个特定错误在版本2.0.7和2.1.1,所以我希望它也将在2.1.18中修复(我尝试升级到)。我犹豫是否转向Mojarra的另一个原因是我们的项目使用GPL 3.0许可证 - 根据https://www.gnu.org/licenses/license-list.en.html - 与Mojarra使用的CDDL许可证在法律上不兼容,如果我没有记错的话。
编辑2:目前,webapp也使用了Ajax4JSF,而且从Migrating JSF 1.1 with Ajax4jsf 1.x to JSF 2我得到了我需要用我的JSP文件中的f:ajax
标签替换a4j标签对于JSF2。
另一方面,JSF 1.2- >2.0 :viewId parameter for save view state is null读取类似JSF2中的f:ajax
标记不能与JSP一起使用,或者这仅适用于JSP的非常旧版本,如JSP 1.x(这是我从why <f:ajax> tags doesnt work in JSP with JSF2.0中的“旧JSP 得到的JSF 2不完全支持”中得到的结果?
是否正确,因为在web.xml
我有<web-app version=2.5
,因为我在Tomcat 7 servlet容器上部署了webapp,我确实在使用JSP 2.2(根据https://wiki.apache.org/tomcat/TomcatVersions) ,应该允许使用JSF2中的f:ajax
标签?
这会导致我遇到的错误吗?
编辑3: 我将整个堆栈跟踪添加到帖子中,并且意识到它确实包含对ajax4jsf库的引用,以行的形式
at org.ajax4jsf.webapp.BaseFilter.doFilter(BaseFilter.java:281)
(参见上面的整个堆栈跟踪)。
JSF2与ajax4jsf库的不兼容性是否确实会导致错误?虽然它是由servlet调用的,而不是我们的应用程序调用的,所以我不明白如何解决这个问题。
非常感谢任何帮助!