我们在将我们的一个应用程序从 WebSphere 6.1 (JSF 1.1 Impl) 迁移到 WebSphere 7.0(JSF 1.2 Impl,Sun Impl [v7.0 中的默认值])时遇到了 JSF 问题。该应用程序使用一个 IBM jar,IBM 告诉我它是一个提供自定义 IBM JSF 功能和标签等的小部件 (jsf-ibm.jar),我们认为这是 JSF 1.2 Impl 支持所需的版本。
当我们点击应用程序时,我们会在具有支持 UI 类的自定义组件周围收到错误。该应用程序在我们最初访问时加载正常,但是当我们点击控件上的任何按钮或其他任何地方时,我们会收到以下异常(如下)。自定义组件是一个分页控件,添加到页面中如下:
<appname:dataTableNav id="navTable1" dataComponent="#{appSession.cLog.cLogLine}" pageSize="#{appSession.cLogPreferences.pageSize}" startingIndex="#{appSession.caseLog.cLogPref.startingIndex}" actionListener="#{pc_Log.handleSelectedPageEvent}" backImage="images/arrow_previous.gif"forwardImage="images/arrow_next.gif" pageStyleClass="resultlinks" currentPageStyleClass="selectedPage"/>
IBM 建议的问题是 JSF 1.2 Impl 在呈现自定义控件时遇到问题,因为 JSF 1.1 在保存/序列化自定义控件状态等并再次呈现时的行为与 1.2 不同。他们建议我们在我添加的支持 UI 类中缺少 saveState 和 restoreState 方法,但没有成功,即下面的代码片段和代码参考 url:
** Ref url:
http://blog.evolutionarydawn.com/2009/06/11/custom-jsf-component-12/
** Our code snippet:
public Object saveState(FacesContext context) {
System.out.println("Out .. In DataTableNavigatorUI.saveState-Begin!");
Object values[] = new Object[5];
values[0] = super.saveState(context);
values[1] = forwardImage;
values[2] = backImage;
values[3] = pageStyleClass;
values[4] = currentPageStyleClass;
System.out.println("Out .. In DataTableNavigatorUI.saveState-Exit!");
return ((Object) (values));
}
public void restoreState(FacesContext context, Object state) {
System.out.println("Out .. In DataTableNavigatorUI.restoreState-Begin!");
Object values[] = (Object[])state;
super.restoreState(context, values[0]);
forwardImage = (String) values[1];
backImage = (String) values[2];
pageStyleClass = (String) values[3];
currentPageStyleClass = (String) values[4];
System.out.println("Out .. In DataTableNavigatorUI.restoreState-Exit!");
}
来自 IBM 支持:
组件类缺少 saveState 和 restoreState 方法。这将导致此自定义组件的状态无法保存和恢复,我认为这会导致 ArrayIndexOutOfBoundsException。
我可以看到这段代码在调试和通过日志记录时被调用,并且可以在调用时调试每个方法,并且可以检查被捕获和恢复的值(当我通过调试检查时)。
正如您从下面的堆栈跟踪中看到的那样,应用程序似乎在 JSF 框架代码中崩溃了,所以不确定我们是否需要根据框架的需要来修改我们的代码!?
所以我们完全不知所措,因此欢迎任何想法、解决方案或反馈。
谢谢和问候,斯蒂芬
异常堆栈跟踪: [8/13/12 15:01:24:101 BST] 00000029 servlet E com.ibm.ws.webcontainer.servlet.ServletWrapper 服务 SRVE0068E:在应用程序 spocs-中的 servlet Faces Servlet 的服务方法之一中创建了未捕获的异常耳朵。异常创建:javax.servlet.ServletException:数组索引超出范围:com.ibm.ws.webcontainer.servlet.ServletWrapper.service(ServletWrapper. java:1663) 在 com.ibm.ws.webcontainer.servlet.ServletWrapper.service(ServletWrapper.java:1597) 在 com.ibm.ws.webcontainer.filter.WebAppFilterChain.doFilter(WebAppFilterChain.java:131) 在 com.ourapp .ourapp2.ourapp3.web.filter.LogonFilter.doFilter(LogonFilter.java:173) 在 com.ibm.ws.webcontainer.filter.FilterInstanceWrapper.doFilter(FilterInstanceWrapper.java:188) 在 com.ibm.ws。