アプリケーションの EAR があり、これを古いサーバー (Windows Server 2003 R2、32 ビット、WebSphere 8.0.0.4) にデプロイします。ここで、理論的に同等の WebSphere 8.0.0.4 インスタンスを別のマシン (Windows Server 2012 R2 標準、64 ビット) にセットアップしました。
私たちは myfaces/richfaces[1] で JSF 1.2 を使用しています (はい、わかっています、わかっています、それはレガシーです。今は変更できません)。(「SunRI 1.2」は、アプリケーションの WebSphere セットアップで使用される実装として選択されます。)
両方に同じ EAR ファイルをデプロイし、同じ手順を実行しました。
元のサーバーでは、すべて正常に動作します。ただし、新しいサーバーでは、(明らかに) デプロイが成功した後、アプリケーションにログインするとき (つまり、レンダリングされる最初のページ) にこの例外が発生し続けます。
(セル/EAR/WAR/パッケージ名を*****で匿名化しています)
javax.el.ELException: //C:/Program Files (x86)/IBM/WebSphere/AppServer/profiles/AppSrv01/installedApps/****Node01Cell/*****.ear/*******.war/index.xhtml: Property 'chooseLocale' not found on type
***.UserLanguageBean
at com.sun.facelets.compiler.AttributeInstruction.write(AttributeInstruction.java:53)
at com.sun.facelets.compiler.UIInstructions.encodeBegin(UIInstructions.java:39)
at com.sun.facelets.compiler.UILeaf.encodeAll(UILeaf.java:149)
at javax.faces.component.UIComponent.encodeAll(UIComponent.java:257)
at com.sun.facelets.FaceletViewHandler.renderView(FaceletViewHandler.java:592)
at org.ajax4jsf.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:100)
at org.ajax4jsf.application.AjaxViewHandler.renderView(AjaxViewHandler.java:176)
at org.apache.myfaces.lifecycle.RenderResponseExecutor.execute(RenderResponseExecutor.java:41)
at org.apache.myfaces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:140)
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:155)
(つまり、h:commandLink --ここでのようにプロパティを探すべきではなく、代わりに実行するメソッドを探すべきであることに注意してください!)
実際、これは JSF エンジンが遭遇する (ほぼ) 最初の EL 式です。
<c:when test="#{not empty param.language}"> <!-- THIS IS OK, PARSED/INTERPRETED CORRECTLY! -->
<h:form style="display:none;" id="languageForm">
<h:commandLink action="#{userLanguageBean.chooseLocale}" id="languageButton"> <!-- THIS IS NOT, CAUSES EXCEPTION ON NEW SERVER -->
<f:param name="locale" value="#{param.language}"/>
</h:commandLink>
</h:form>
...
クラス UserLanguageBean は JSF Bean として登録されており、メソッド chooseLocale() を持っています。(そうしないと、古いサーバーでも機能しません。) 興味深いことに、古いサーバーは、少なくともデバッガーによると、例外がスローされるコードの部分にさえ到達しません!
現在(一部の JSF/Myfaces/Richfaces ライブラリが適切にロードされていないという疑いに基づいて)、次のことを試しました。
血まみれの詳細が続きますので、あなたがせっかちなタイプであるがすでにアイデアを持っている場合は、読み進めずに自由に回答を投稿してください!
--- 詳細: ---
両方のサーバーで詳細なクラスの読み込みをオンにして、native_stderr.log ファイルを比較しました。違いはありましたが、すべての JSF 関連のクラス (grep "(face\|jsf)" など) は同じ jar から来ているようです。
- 古いサーバーにしかロードされておらず、新しいサーバーにはロードされていないクラスがいくつかありましたが、(それらがどのクラスであるかに基づく直感)私はそれを新しいサーバーがポイントに達しなかったという事実に置きました実際に最初に表示された xhtml ページをレンダリングします (上記を参照)。
2 つのプラットフォームのそれぞれにデバッガーを接続し、クラスローダー (およびその親クラスローダーなど) を調べました。クラスパスに同じ jar があるようです。(EAR に存在しないものを含む。) - ポイント 1 と同様に、コピーの貼り付け、grepp、およびソートによってこれを特定しました。
新しいサーバーでの展開中にエラーを確認しました: (「悪い」もの)
- WebSphereコンソールでは、すべて問題ないと表示されました
- 展開中にログに記録されたいくつかの例外がありましたが、それらは古いもののログにはありませんでした (「良い」もの)。
構成をエクスポートし、(いくつかのサーバー名とベースディレクトリの違いを除いて) それらを比較しました。
- 繰り返しますが、セットアップの違いは見つかりましたが、JSF などと関係があると思われるものは何もありませんでした。
デバッガーで、a) 古いサーバーで JSF によって UserLanguageBean.chooseLocale() が呼び出される場所、および b) 新しいサーバーで ELException がスローされる場所のスタック トレース [2] を確認しました。
==> FacesServlet.service() (myfaces-api-1.2.7.jar に由来) のこの部分:
try
{
this._lifecycle.execute(facesContext); // <--- new server: Exception! further code is not reached
if (!handleQueuedExceptions(facesContext))
{
this._lifecycle.render(facesContext); // <--- old server: renders the tag
}
}
脚注:
[1]
$ ls -1 "c:\Program Files (x86)\IBM\WebSphere\AppServer\profiles\AppSrv01\installedApps\*******Node01Cell\*****.ear\*****.war\WEB-INF\lib\\" | grep faces
myfaces-api-1.2.7.jar
myfaces-extval-core-1.2.2.jar
myfaces-extval-generic-support-1.2.2.jar
myfaces-extval-property-validation-1.2.2.jar
myfaces-impl-1.2.7.jar
richfaces-api-3.3.1.GA.jar
richfaces-impl-3.3.1.GA.jar
richfaces-ui-3.3.1.GA.jar
==>だから、正確にどれを使っているのかよくわからない
[2]
a) 古いサーバーでの適切な実行:
TagMethodExpression.invoke(ELContext, Object[]) line: 68
_MethodExpressionToMethodBinding.invoke(FacesContext, Object[]) line: 78
ActionListenerImpl.processAction(ActionEvent) line: 57
HtmlCommandLink(UICommand).broadcast(FacesEvent) line: 141
AjaxViewRoot.processEvents(FacesContext, EventsQueue, boolean) line: 321
AjaxViewRoot.broadcastEvents(FacesContext, PhaseId) line: 296
AjaxViewRoot.processPhase(FacesContext, PhaseId, InvokerCallback) line: 253
AjaxViewRoot.processApplication(FacesContext) line: 466
InvokeApplicationExecutor.execute(FacesContext) line: 32
LifecycleImpl.executePhase(FacesContext, PhaseExecutor, PhaseListenerManager) line: 103
LifecycleImpl.execute(FacesContext) line: 76
FacesServlet.service(ServletRequest, ServletResponse) line: 151
b) 新しいサーバーでの例外: 最初のスタック トレース + PropertyNotFoundException (実際の例外) のスタック トレースを参照してください。
javax.el.PropertyNotFoundException: Property 'chooseLocale' not found on type ******.UserLanguageBean
at javax.el.BeanELResolver$BeanProperties.get(BeanELResolver.java:225)
at javax.el.BeanELResolver$BeanProperties.access$400(BeanELResolver.java:202)
at javax.el.BeanELResolver.property(BeanELResolver.java:312)
at javax.el.BeanELResolver.getValue(BeanELResolver.java:87)
at javax.el.CompositeELResolver.getValue(CompositeELResolver.java:55)
at org.apache.myfaces.el.unified.resolver.FacesCompositeELResolver.getValue(FacesCompositeELResolver.java:140)
at org.apache.el.parser.AstValue.getValue(AstValue.java:169)
at org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:283)
at com.sun.facelets.el.ELText$ELTextVariable.toString(ELText.java:174)
at com.sun.facelets.compiler.AttributeInstruction.write(AttributeInstruction.java:49)
at com.sun.facelets.compiler.UIInstructions.encodeBegin(UIInstructions.java:39)
at com.sun.facelets.compiler.UILeaf.encodeAll(UILeaf.java:149)
at javax.faces.component.UIComponent.encodeAll(UIComponent.java:257)
at com.sun.facelets.FaceletViewHandler.renderView(FaceletViewHandler.java:592)
at org.ajax4jsf.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:100)
at org.ajax4jsf.application.AjaxViewHandler.renderView(AjaxViewHandler.java:176)
at org.apache.myfaces.lifecycle.RenderResponseExecutor.execute(RenderResponseExecutor.java:41)
at org.apache.myfaces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:140)
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:155)