JBoss7_ja - terasolunaorg/terasoluna-gfw GitHub Wiki

JBoss EAP 7を利用する際の注意点

確認環境のバージョン情報
terasoluan-gfw OS Java JBoss RDBMS Browser Mail Server Message Queue
5.7.0.RELEASE Red Hat Enterprise Linux 8.2 Red Hat OpenJDK 11.0.9 JBoss EAP 7.3.0 PostgreSQL 12.4 Firefox ESR 78 (78.4.0esr) Postfix 3.5.7 + Dovecot 2.3.11.3 ActiveMQ 5.16.0

はじめに

JBoss EAP(JBoss Enterprise Application Platform)7環境においてTERASOLUNA Server Framework for Java (5.x)を使用する場合、 以下の設定が必要となる。

  • jboss-deployment-structure.xmlの作成と設定
  • サーブレットコンテナのデフォルトエンコーディングの設定(JBoss EAP 7.1.0以前を使用する場合)

jboss-deployment-structure.xmlの作成と設定

JBossのサーバモジュールとTERASOLUNA Server Framework for Java (5.x)で使用しているライブラリが競合した場合、JBoss側のモジュールが優先されるため、正常に動作しないことがある。
そのため、jboss-deployment-structure.xmlを作成し、JBoss側のモジュールを除外(一部、参照)する設定が必要となる。
jboss-deployment-structure.xmlは、WEB-INF直下に配置する。

WEB-INF/jboss-deployment-structure.xml

<jboss-deployment-structure>
    <deployment>
        <exclusions>
            <module name="org.hibernate.validator" /><!-- (1) -->
            <module name="org.slf4j" /><!-- (2) -->
            <module name="javax.inject.api" /><!-- (3) -->
            <module name="org.jboss.logging" /><!-- (4) -->
            <module name="javax.validation.api" /><!-- (5) -->
        </exclusions>
        <dependencies>
            <module name="javax.jms.api" /><!-- (6) -->
        </dependencies>
        <exclude-subsystems>
            <subsystem name="jaxrs" /><!-- (7) -->
            <subsystem name="jpa" /><!-- (8) -->
            <subsystem name="logging" /><!-- (9) -->
        </exclude-subsystems>
    </deployment>
</jboss-deployment-structure>
.. tabularcolumns:: |p{0.10\linewidth}|p{0.80\linewidth}|
項番 説明
(1)
Hibernate Validatorが正常に動作しないため、Hibernate Validatorモジュールを除外する。
(2)
アプリケーションログが正常に出力されないため、SLF4Jモジュールを除外する。
(3)
javax.inject.apiのバージョンが競合しエラーが発生する場合があるため、javax.inject.apiモジュールを除外する。(5.3.0.RELEASEでは除外しなくてもエラーは発生しない)
(4)
JBoss Loggingのバージョンが競合しエラーが発生する場合があるため、JBoss Loggingモジュールを除外する。(5.3.0.RELEASEでは除外しなくてもエラーは発生しない)
(5)
javax.validation.apiのバージョンが競合しエラーが発生する場合があるため、javax.validation.apiモジュールを除外する。(5.3.0.RELEASEでは除外しなくてもエラーは発生しないが、入力チェックにBean Validationを使う場合は本設定を推奨)
(6)
クラスパス上にJMSのAPIクラスが必要なため、javax.jms.apiモジュールを参照する。(JMSを使う場合は本設定が必要) [1]
(7)
Jacksonのバージョンが競合しエラーが発生するため、JAX-RSサブシステムが働かないように除外する。(Jacksonを使う場合は本設定が必要)
(8)
javax.persistence.api・Javassistのバージョンが競合しエラーが発生する場合があるため、JPAサブシステムが働かないように除外する。(5.3.0.RELEASEでは除外しなくてもエラーは発生しないが、O/R MapperとしてJPAを使う場合は本設定を推奨)
(9)
アプリケーションログにJPAのデバッグ・トレースログが正常に出力されない場合、LOGGINGサブシステムが働かないように除外する。(O/R MapperとしてJPAを使う場合は本設定を推奨) [2]
[1]
アプリケーション内でApache ActiveMQ固有のクラスを使用する場合は、JBossのリソースアダプタの仕組みを利用するために追加したActiveMQモジュールを"javax.jms.api"モジュールと同様の方法で参照する必要がある(JBossのリソースアダプタの仕組みについては、Resource Adaptersを参照されたい)。
なお、ActiveMQに関連するjarファイルをwarファイルの中に含める方法もあるが、この方法での動作検証は行っていない。
[2]
Servlet 3.0のファイルアップロード機能を利用する場合、アップロードされたファイルの削除において以下のようなログが出力される可能性がある。
実際にファイルがメモリまたはストレージに滞留することは確認されておらず、影響はないと考えられるが、問題がある場合はCommons FileUploadの利用も検討されたい。
level:WARN  logger:o.s.w.m.support.StandardServletMultipartResolver message:Failed to perform cleanup of multipart items java.lang.IllegalStateException: UT010057: multipart config was not present on Servlet

サーブレットコンテナのデフォルトエンコーディングの設定

JBoss EAP 7.1.0以前を使用する場合のみ、この設定を行ってください。
JBoss上でServlet 3.0のファイルアップロード機能を使用すると、ファイル名のマルチバイト文字が文字化けすることがある。
これを回避するためには、エンコーディングの設定が必要となる。
WEB-INF直下にjboss-web.xmlを作成し、文字コードを指定する。

WEB-INF/jboss-web.xml

  • 設定例
<?xml version="1.0" encoding="UTF-8"?>
<jboss-web xsi:schemaLocation="http://www.jboss.org/j2ee/schema/jboss-web_10_0.xsd"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://www.jboss.com/xml/ns/javaee" version="10.0">
    <default-encoding>UTF-8</default-encoding>
</jboss-web>

上記例では、"UTF-8"が適用される。

Undertowにおいて発生するNullPointerExceptionについて

JBoss EAP 7より、JBossWebの代わりにUndertowがWebサーバ実装として使用されるようになった。
Spring Framwork 5.3から追加された実装によりUndertowの実装バグが顕在化し、RequestMappingに存在しないパスをHttpServletMappingのURLパターンに設定している場合、NullpointerExceptionが発生することが確認されている。
上記により、実装によっては正常に動作しない可能性があるため注意されたい。
当事象はJboss 7.3で提供されるUndertow 2.0.28で発生することが確認されている。
なお、Undertow 2.2.6-SNAPSHOTにおいて、下記修正により当事象が解消されたことを確認した。
⚠️ **GitHub.com Fallback** ⚠️