SunのRI1.1で動かす つづき
えーっと。いくつか手を入れなければ、そのままでは動かない。以下、修正した点。
- Sun RI1.1のcom.sun.faces.application.ViewHandlerImpl#createView
たぶんバグ?なのかな。生成するUIViewRootがnew UIViewRoot();とハードコードされているため、faces-config.xmlでS2UIViewRootが指定されていても、常にUIViewRootが生成されてしまう。そのため、org.seasar.jsf.lifecycle.LifecycleImpl#hasEventのS2UIViewRootへのキャストで落ちてしまう。
ちなみに、MyFacesのViewHandler実装であるorg.apache.myfaces.application.jsp.JspViewHandlerImpl#createViewは
uiViewRoot = (UIViewRoot)facesContext.getApplication().createComponent(UIViewRoot.COMPONENT_TYPE);
となっている。これをSun RIへコピペしてnew UIViewRoot()を削除。
org.seasar.jsf.component.S2UIViewRoot#broadcastForPhaseの以下の部分、
FacesEvent event = (FacesEvent) i.next(); int ordinal = event.getPhaseId().getOrdinal(); if (ordinal == ANY_PHASE_ORDINAL || ordinal == phaseIdOrdinal) { UIComponent source = event.getComponent(); : :
ANY_PHASE_ORDINALがMyFaces固有ではないかと思われる。JSFのJavadocにはなかったので。
ここを、
if (ordinal == PhaseId.ANY_PHASE.getOrdinal() || ordinal == phaseIdOrdinal) {
と修正した。
以上2点、修正しないとどうなるかというと、従業員管理のサンプルで 検索 > 照会 > 戻る とかやると一番上の理由でClassCastExceptionで落ちます。
かなり急いで試したので間違っていたらすみません。眠ったら忘れそうなのでメモということでお許しを。
あと、まだ1点未確認のところがあって、検索 > 照会 > 編集 > 確認 で、間違っていないはずなのに Validation Error: {0}Value is not valid というエラーが部署プルダウンの右に表示される。
結局のところ、今のそのままのSun RIでは(RI側の問題で)S2JSFは動かせなかったという結論で良いのかなー?