1

我们在将我们的一个应用程序从 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。

4

1 回答 1

0

您是否使用 Rational Application Developer 来开发您的 JSF 应用程序?你用的是什么版本的jsf-ibm.jar?查看 JAR 的清单文件。RAD 8.0.4.1 中包含的 JWL 实现修复了一个展示类似行为的错误,因此如果您使用 RAD 8.0.4 或更低版本创建 JSF 应用程序,您可能希望迁移到 8.0.4.1 并更新 JWL 库.

于 2012-09-16T01:12:45.423 回答