アプリケーションの 1 つを WebSphere 6.1 (JSF 1.1 Impl) から WebSphere 7.0 (JSF 1.2 Impl、Sun Impl [v7.0 のデフォルト]) に移行する際に JSF の問題が発生しています。このアプリは、カスタムの IBM JSF 機能やタグなどを提供するウィジェット (jsf-ibm.jar) であると IBM が言う 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 サーブレット E com.ibm.ws.webcontainer.servlet.ServletWrapper サービス SRVE0068E: サーブレット Faces サーブレットのサービス メソッドの 1 つで作成されたキャッチされない例外がアプリケーション spocs-耳。例外が作成されました: 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.