JBoss AS 5.1.0 GA で動作する webapp があります。Mojarra 2.0.4 jar を使用します。これを JBoss AS 7.1.1 に移行中です。このバージョンの JBoss は 2.1.7 に同梱されています。そこで、2.0.4 のスロットを定義し、それらMETA-INF/jboss-deployment-structure.xml
を他の依存関係と共に依存関係として参照することで、Mojarra バージョンをダウングレードしました。
jboss-deployment-structure.xml
<?xml version="1.0" encoding="UTF-8"?>
<jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.0">
<deployment>
<exclusions>
<module name="javax.faces.api" slot="main"/>
<module name="com.sun.jsf-impl" slot="main"/>
<module name="javax.faces.api" slot="1.2"/>
<module name="com.sun.jsf-impl" slot="1.2"/>
</exclusions>
<dependencies>
<module name="org.hibernate.validator" export="true"/>
<module name="javax.validation.api" export="true"/>
<module name="com.google.gson" export="true"/>
<module name="org.codehaus.jettison" export="true"/>
<module name="org.jboss.resteasy.resteasy-jaxrs" export="true"/>
<module name="org.jboss.resteasy.resteasy-jackson-provider" export="true"/>
<module name="org.apache.log4j" export="true"/>
<module name="org.jboss.as.web" slot="main" export="true"/>
<module name="javax.faces.api" slot="2.0.4" export="true"/>
<module name="com.sun.jsf-impl" slot="2.0.4" export="true"/>
</dependencies>
</deployment>
</jboss-deployment-structure>
これにより、デプロイ時に次の例外がスローされました
12:51:18,761 INFO [javax.enterprise.resource.webcontainer.jsf.config] (MSC service thread 1-3) Initializing Mojarra 2.0.4 (FCS b09) for context ''
12:51:20,355 INFO [javax.enterprise.resource.webcontainer.jsf.config] (MSC service thread 1-3) Unsanitized stacktrace from failed start...: javax.faces.FacesException: Class org.jboss.as.web.deployment.jsf.JandexAnnotationProvider is not an instance of com.sun.faces.spi.AnnotationProvider
このリンクを参照し、依存関係を次のように変更しました
<?xml version="1.0" encoding="UTF-8"?>
<jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.0">
<deployment>
<exclusions>
<module name="javax.faces.api" slot="main"/>
<module name="com.sun.jsf-impl" slot="main"/>
<module name="javax.faces.api" slot="1.2"/>
<module name="com.sun.jsf-impl" slot="1.2"/>
<module name="org.jboss.as.web" slot="main" />
</exclusions>
<dependencies>
<module name="org.hibernate.validator" export="true"/>
<module name="javax.validation.api" export="true"/>
<module name="com.google.gson" export="true"/>
<module name="org.codehaus.jettison" export="true"/>
<module name="org.jboss.resteasy.resteasy-jaxrs" export="true"/>
<module name="org.jboss.resteasy.resteasy-jackson-provider" export="true"/>
<module name="org.apache.log4j" export="true"/>
<module name="org.jboss.as.web" slot="main" export="true"/>
<module name="javax.faces.api" slot="2.0.4" export="true"/>
<module name="com.sun.jsf-impl" slot="2.0.4" export="true"/>
<module name="org.jboss.as.web" slot="main">
<imports>
<include path="/org/**" />
<exclude path="/META-INF/**" />
</imports>
</module>
</dependencies>
</deployment>
</jboss-deployment-structure>
展開時のエラーを取り除きましたが、次のランタイム例外を導入しました
12:59:19,434 ERROR [stderr] (http--0.0.0.0-8080-4) java.lang.IllegalArgumentException: null source
12:59:19,435 ERROR [stderr] (http--0.0.0.0-8080-4) at java.util.EventObject.<init>(EventObject.java:38)
12:59:19,436 ERROR [stderr] (http--0.0.0.0-8080-4) at javax.faces.event.SystemEvent.<init>(SystemEvent.java:71)
12:59:19,444 ERROR [stderr] (http--0.0.0.0-8080-4) at javax.faces.event.ComponentSystemEvent.<init>(ComponentSystemEvent.java:73)
と
12:59:19,489 ERROR [org.apache.catalina.core.ContainerBase.[jboss.web].[default-host].[/].[Faces Servlet]] (http--0.0.0.0-8080-4) Servlet.service() for servlet Faces Servlet threw exception: java.lang.NullPointerException
at com.sun.faces.context.PartialViewContextImpl.createPartialResponseWriter(PartialViewContextImpl.java:431) [jsf-impl.jar:2.0.4-b09]
at com.sun.faces.context.PartialViewContextImpl.access$300(PartialViewContextImpl.java:72) [jsf-impl.jar:2.0.4-b09]
at com.sun.faces.context.PartialViewContextImpl$DelayedInitPartialResponseWriter.getWrapped(PartialViewContextImpl.java:559) [jsf-impl.jar:2.0.4-b09]
私は(もちろんグーグルで)、例外はしばしば3つのことが原因であると考えました
- xhtml で使用されている無効/閉じられていないタグ (誤って伝播された例外)
- セッション タイムアウト (誤って伝播された例外)
- Tomcat の POST パラメータ数の制限
残念ながら、最初の 2 つは原因ではありませんでした。バリデーターを使用して誤った xhtml ページを実行したところ、マークアップが有効であり、セッションの有効期限も切れていないことがわかりました。また、3 番目の点に対処するためorg.apache.tomcat.util.http.Parameters.MAX_COUNT
に を 5000 に増やしました。standalone.xml
エラーは引き続き発生します。
また、デフォルトでバンドルされている Mojarra 2.7.1 バージョンへの移行も試みました。これにより、最初の実行時例外は回避されましたが、2 番目の例外は残りました。このエラーの原因となっているこれらのページの唯一の特異点は、それらのページに ajax 呼び出しが含まれていることです。面白いことに、アプリケーションは AS 5.1.0 GA で正常に動作しているため、マークアップに誤りがあると、5.1.0 でも問題が発生したことになりますが、そうではありませんでした。したがって、無効なマークアップはほとんどありません。どんなポインタでも大歓迎です!
更新: の行が に評価されていることをPartialViewContextImpl.java:431
示していることがわかりました。理由はわかりませんがctx.getRenderKit()
null
UPDATE2 :フォーム内で純粋な html 入力コンポーネントを使用する場合にのみ問題が発生することが判明しました<input type="text">, <select>
。これらを から削除する<h:form>
か、対応する JSF タグに変換すると、正常に動作します。どこかで何かがひどくうまくいかない。これがjboss、Mojarra、または特に私のアプリが原因であるかどうかを正確に把握することはできません。プレーンなバニラ JSF アプリで試してみましたが、html 入力タグを使用するかどうかに関係なく、エラーは発生しませんでした。したがって、これを引き起こしているのは、私のアプリと jboss 7.x の組み合わせです。何か案は?