java.lang.IllegalArgumentException:javax.faces.context.ExceptionHandlerFactory
問題
Eclipse IDEでは、JSF 2.0 WebアプリケーションをTomcat 6.0.26にデプロイするときに、次の例外が発生し、Tomcatサーバーの起動に失敗しました。
__P.Sプロジェクトクラスパスに
jsf-api-2.1.0-b03.jar
と
jsf-impl-2.1.0-b03.jar
ライブラリが含まれています。
INFO: Unsanitized stacktrace from failed start... java.lang.IllegalArgumentException: javax.faces.context.ExceptionHandlerFactory at javax.faces.FactoryFinder.validateFactoryName(FactoryFinder.java:630) at javax.faces.FactoryFinder.setFactory(FactoryFinder.java:287) ... SEVERE: Critical error during deployment: com.sun.faces.config.ConfigurationException: CONFIGURATION FAILED! javax.faces.context.ExceptionHandlerFactory ... Caused by: java.lang.IllegalArgumentException: javax.faces.context.ExceptionHandlerFactory at javax.faces.FactoryFinder.validateFactoryName(FactoryFinder.java:630) ...
解決策
Eclipseのデバッグ・モードでは、ソースコード内を掘り下げ、
IllegalArgumentException
がFactoryFinderの
getFactory()
メソッドによってスローされることを確認します。
/** ** @throws IllegalArgumentException if <code>factoryName</code> does not ** identify a standard JavaServer Faces factory name ** @throws IllegalStateException if there is no configured factory ** implementation class for the specified factory name ** @throws NullPointerException if <code>factoryname</code> ** is null ** / public static Object getFactory(String factoryName) throws FacesException { validateFactoryName(factoryName); //... }
IllegalArgumentExceptionは、ファクタファインダが新しいJSF2.0
ExceptionHandlerFactory
ファクトリ名を認識しないことを文書化しました。
何千回ものテストと試しの後、最終的に、私のプロジェクトクラスパスに含まれている
javaee.jar
からの根本的な原因がわかります。
-
javaee.jar ** の内部を見ると、JSF 1.2 APIのセットも含まれています。Tomcatが新しいJSF 2.0 APIではなくこのJSF 1.2 APIを選択しているようです。
プロジェクトのクラスパスから
javaee.jar
を削除した後、JSF 2.0 WebアプリケーションはTomcatでうまく起動して実行できます。
リファレンス
2.0.3リリースノート]
リンク://タグ/jsf2/[jsf2]