開発ガイド
JBoss Enterprise Application Platform 6 向け
エディッション 2
Red Hat Content Services
Sande Gilda
Eamon Logue
elogue@redhat.com
Darrin Mison
David Ryan
Misty Stanley-Jones
misty@redhat.com
Tom Wells
twells@redhat.com
概要
前書き
1. 表記方法
1.1. 印刷における表記方法
等幅の太字
現在作業中のディレクトリ内のファイルmy_next_bestselling_novel
の内容を表示させるには、 シェルプロンプトでcat my_next_bestselling_novel
コマンドを入力してから Enter を押してそのコマンドを実行します。
Enter を押してコマンドを実行します。Press Ctrl+Alt+F2 to switch to a virtual terminal.
等幅の太字
で表示します。 例えば、
ファイル関連のクラス群はファイルシステムに対してはfilesystem
、 ファイルにはfile
、 ディレクトリにはdir
をそれぞれ含みます。 各クラスは個別に関連する権限セットを持っています。
メインメニューバーから システム > 個人設定 > マウス の順で選択し マウスの個人設定 を起動します。 ボタン タブ内で 左ききのマウス チェックボックスをクリックしてから 閉じる をクリックしマウスの主要ボタンを左から右に切り替えます (マウスを左ききの人が使用するのに適した設定にする)。To insert a special character into a gedit file, choose Applications → Accessories → Character Map from the main menu bar. Next, choose Search → Find… from the Character Map menu bar, type the name of the character in the Search field and click Next. The character you sought will be highlighted in the Character Table. Double-click this highlighted character to place it in the Text to copy field and then click the Copy button. Now switch back to your document and choose Edit → Paste from the gedit menu bar.
等幅の太字で且つ斜体
または プロポーショナルの太字で且つ斜体
ssh を使用してリモートマシンに接続するには、 シェルプロンプトでssh username@domain.name
と入力します。 リモートマシンがexample.com
であり、 そのマシンで使用しているユーザー名が john ならssh john@example.com
と入力します。mount -o remount file-system
コマンドは指定したファイルシステムを再マウントします。 例えば、/home
ファイルシステムを再マウントするコマンドはmount -o remount /home
になります。現在インストールされているパッケージのバージョンを表示するには、rpm -q package
コマンドを使用します。 結果として次を返してきます、package-version-release
。
Publican は DocBook の発行システムです。
1.2. 引用における表記方法
mono-spaced roman
(等幅の Roman) にセットされるので以下のように表示されます。
books Desktop documentation drafts mss photos stuff svn books_tests Desktop1 downloads images notes scripts svgs
mono-spaced roman
(等幅の Roman) でセットされますが、以下のように強調表示されます。
package org.jboss.book.jca.ex1;
import javax.naming.InitialContext;
public class ExClient
{
public static void main(String args[])
throws Exception
{
InitialContext iniCtx = new InitialContext();
Object ref = iniCtx.lookup("EchoBean");
EchoHome home = (EchoHome) ref;
Echo echo = home.create();
System.out.println("Created Echo");
System.out.println("Echo.echo('Hello') = " + echo.echo("Hello"));
}
}
1.3. 注記および警告
注記
重要
警告
第1章 アプリケーションの開発
1.1. はじめに
1.1.1. JBoss Enterprise Application Platform 6 の紹介
1.2. 前提条件
1.2.1. Java Enterprise Edition 6 を理解する
1.2.1.1. EE 6 プロファイルの概要
1.2.1.2. Java Enterprise Edition 6 Web Profile
Java EE 6 Web Profile の要件
- Java Platform、Enterprise Edition 6
Java Web テクノロジー
- Servlet 3.0 (JSR 315)
- JSP 2.2 および Expression Language (EL) 1.2
- JavaServer Faces (JSF) 2.0 (JSR 314)
- JSP 1.2 向けの Java Standard Tag Library (JSTL)
- Debugging Support for Other Languages 1.0 (JSR 45)
エンタープライズアプリケーションテクノロジー
- Contexts and Dependency Injection (CDI) (JSR 299)
- Dependency Injection for Java (JSR 330)
- Enterprise JavaBeans 3.1 Lite (JSR 318)
- Java Persistence API 2.0 (JSR 317)
- Common Annotations for the Java Platform 1.1 (JSR 250)
- Java Transaction API (JTA) 1.1 (JSR 907)
- Bean Validation (JSR 303)
1.2.1.3. Java Enterprise Edition 6 Full Profile
EE 6 Full Profile に含まれるアイテム
- EJB 3.1 (Lite ではない) (JSR 318)
- Java EE Connector Architecture 1.6 (JSR 322)
- Java Message Service (JMS) API 1.1 (JSR 914)
- JavaMail 1.4 (JSR 919)
Web サービステクノロジー
- Jax-RS RESTful Web Services 1.1 (JSR 311)
- Implementing Enterprise Web Services 1.3 (JSR 109)
- JAX-WS Java API for XML-Based Web Services 2.2 (JSR 224)
- Java Architecture for XML Binding (JAXB) 2.2 (JSR 222)
- Web Services Metadata for the Java Platform (JSR 181)
- Java APIs for XML-based RPC 1.1 (JSR 101)
- Java APIs for XML Messaging 1.3 (JSR 67)
- Java API for XML Registries (JAXR) 1.0 (JSR 93)
管理およびセキュリティテクノロジー
- Java Authentication Service Provider Interface for Containers 1.0 (JSR 196)
- Java Authentication Contract for Containers 1.3 (JSR 115)
- Java EE Application Deployment 1.2 (JSR 88)
- J2EE Management 1.1 (JSR 77)
1.2.2. JBoss Enterprise Application Platform 6 で使用されるモジュールと新しいモジュラークラスローディングシステムについて
1.2.2.1. モジュール
- 静的モジュール
- 静的モジュールは、アプリケーションサーバーの
EAP_HOME/modules/
ディレクトリで事前に定義されます。各サブディレクトリは 1 つのモジュールを表し、1 つまたは複数の JAR ファイルと設定ファイル (modules.xml
) が含まれます。モジュールの名前は、module.xml
ファイルで定義されます。アプリケーションサーバーで提供されるすべての API (Java EE API や JBoss Logging などの他の API を含む) は、静的モジュールとして提供されます。カスタム静的モジュールの作成は、同じサードパーティーライブラリを使用する同じサーバー上に多くのアプリケーションがデプロイされる場合に役立ちます。これらのライブラリを各アプリケーションとバンドルする代わりに、JBoss 管理者はこれらのライブラリが含まれるモジュールを作成およびインストールすることができます。これらのアプリケーションはカスタム静的モジュールで明示的な依存関係を宣言できます。 - 動的モジュール
- 動的モジュールは、各 JAR または WAR デプロイメント (または、EAR 内のサブデプロイメント) に対してアプリケーションサーバーによって作成およびロードされます。動的モジュールの名前は、デプロイされたアーカイブの名前から派生されます。デプロイメントはモジュールとしてロードされるため、依存関係を設定でき、他のデプロイメントは依存関係として使用することが可能です。
1.2.2.2. クラスロードとモジュールの概要
1.3. JBoss Enterprise Application Platform 6 のインストール
1.3.1. JBoss Enterprise Application Platform 6 のダウンロードとインストール
1.3.1.1. JBoss Enterprise Application Platform 6 のダウンロード
- カスタマーサービスポータル (https://access.redhat.com) にログインします。
- メニューから、Downloads → JBoss Enterprise Middleware → Downloads を選択します。
- Product ドロップダウンボックスから Application Platform を選択します。
- 適切な Application Platform バージョンを見つけ、Download リンクをクリックします。
- Quickstarts、Maven Repository、HTTP Connectors、ネイティブバイナリーなどの必要な他のパッケージをダウンロードします。
選択した JBoss Enterprise Application Platform 6 および補足ファイルがお使いのコンピューターにダウンロードされます。
1.3.1.2. ZIP ダウンロードを使用した JBoss Enterprise Application Platform 6 のインストール
Zip ファイルを使用したインストール方法は、サポートされたすべてのオペレーティングシステムに適しています。
JBoss Enterprise Application Platform 6 をインストールする前に、Red Hat カスタマーサービスポータルから Zip アーカイブをダウンロードする必要があります。
手順1.1 タスク
Zip アーカイブを希望の場所に移動します。
Zip ファイルを、JBoss Enterprise Application Platform 6 をインストールするサーバーとディレクトリーに移動します。ディレクトリーには、サーバーを起動および停止するユーザーがアクセスできる必要があります。適切なアプリケーションを使用し、Zip アーカイブを展開します。
Linux では通常、unzip
というコマンドで Zip アーカイブを展開します。Microsoft Windows 環境では、ファイルを右クリックし、すべて展開 を選択してください。
Zip アーカイブの抽出で作成されたディレクトリーは JBoss Enterprise Application Platform 6 の最上位ディレクトリーです。これは、通常 EAP_HOME
という名前になります。インストールを移動する場合は、このディレクトリーを別のディレクトリーまたは別のサーバーに移動できます。
1.3.2. JBoss Enterprise Application Platform 6 の基本知識
1.3.2.1. インストールの構造および詳細
表1.1 最上位のディレクトリとファイル
名前 | 目的 |
---|---|
appclient/ | アプリケーションクライアントコンテナの設定詳細が含まれます。 |
bin/ | Red Hat Enterprise Linux および Microsoft Windows 用 JBoss Enterprise Application Platform 6 向け起動スクリプトが含まれます。 |
bundles/ | JBoss Enterprise Application Platform 6 の内部機能に関する OSGi バンドルが含まれます。 |
docs/ | ライセンスファイル、スキーマ、およびサンプル |
domain/ | JBoss Enterprise Application Platform 6 が管理対象ドメインとして実行された時に使用される設定ファイル、デプロイメントコンテンツ、および書き込み可能領域。 |
modules/ | サービスが要求したときに JBoss Enterprise Application Platform 6 により動的にロードされるモジュール。 |
standalone/ | JBoss Enterprise Application Platform 6 がスタンドアローンサーバーとして実行された場合に使用される設定ファイル、デプロイメントコンテンツ、および書き込み可能領域。 |
welcome-content/ | デフォルトインストールのポート 8080 で利用可能な Welcome Web アプリケーションにより使用されるコンテンツが含まれます。 |
jboss-modules.jar
| モジュールをロードするブートストラップメカニズム。 |
表1.2 domain/
ディレクトリーにあるディレクトリー
名前 | 目的 |
---|---|
configuration/ | 管理ドメイン用の設定ファイル。これらのファイルは管理コンソールや管理 CLI で変更し、直接編集するためのものではありません。 |
data/ | デプロイされたサービスの情報。サービスは、デプロイメントスキャナーではなく、管理コンソールや管理 CLI を使用してデプロイするため、このディレクトリーにファイルを手動で置かないようにしてください。 |
log/ | ローカルインスタンスで実行されるホストおよびプロセスコントローラー用実行時ログファイルが含まれます。 |
servers/ | ドメイン内の各サーバーインスタンス用の同等の data/ 、log/ 、および tmp/ ディレクトリーが含まれます。これらのディレクトリーには、最上位の domain/ ディレクトリー内の同じディレクトリーに類似したデータが含まれます。 |
tmp/ | 管理対象ドメインに対してローカルユーザーを認証するために管理 CLI で使用される共有キーメカニズムに関するファイルなどの一時データが含まれます。 |
表1.3 standalone/
ディレクトリーにあるディレクトリー
名前 | 目的 |
---|---|
configuration/ | スタンドアローンサーバー用の設定ファイル。これらのファイルは管理コンソールや管理 CLI で変更し、直接編集するためのものではありません。 |
deployments/ | デプロイしたサービスの情報。スタンドアローンサーバーには、デプロイメントスキャナーが含まれているため、このディレクトリにデプロイ用のアーカイブを置くことができます。しかし、管理コンソールあるいは管理 CLI を使いデプロイメントを管理する方法が推奨されます。 |
lib/ | スタンドアローンサーバーモードに関連する外部ライブラリ。デフォルトは空です。 |
tmp/ | サーバーに対してローカルユーザーを認証するために管理 CLI で使用される共有キーメカニズムに関連するファイルなどの一時データが含まれます。 |
1.3.2.2. スタンドアローンサーバー
1.3.2.3. 管理ドメイン
図1.1 管理ドメインの図解
1.3.2.4. JBoss Enterprise Application Platform 6 の新しい機能と変更された機能
- JBoss Enterprise Application Platform 6 は、Java Enterprise Edition 6 の Full Profile および Web Profile の仕様の認定された実装です。
- 管理対象ドメインは、複数のサーバーインスタンスおよび物理ホストを一元管理し、スタンドアローンサーバーは単一のサーバーインスタンスを可能にします。
- 設定、デプロイメント、ソケットバインディング、モジュール、拡張、およびシステムプロパティはすべて、サーバーグループ別に管理できます。
- 管理コンソールと CLI は、ドメインまたはスタンドアローン JBoss Enterprise Application Platform 6 インスタンスを管理する新しいインターフェースです。XML 設定ファイルを手作業で編集する必要がなくなりました。管理 CLI ではバッチモードも提供され、管理タスクを処理するスクリプトを作成し、自動化できます。
- セキュリティードメインなどのアプリケーションセキュリティーは、設定を簡素化できるよう一元管理されています。
- JBoss Enterprise Application Platform 6 のディレクトリーレイアウトは単純化されました。
modules/
ディレクトリーには、共通およびサーバー固有のlib/
ディレクトリーの代わりにアプリケーションサーバーモジュールが含まれるようになりました。domain/
およびstandalone/
ディレクトリーには、ドメインおよびスタンドアローンデプロイメント用のアーティファクトおよび設定ファイルが含まれます。 - 各種モジュールがオンデマンドでロードおよびアンロードされるように、クラスローディングメカニズムが完全にモジュール化されました。このため、パフォーマンスおよびセキュリティ面で利点があるだけでなく、非常に短時間で起動や再起動を行うことができます。
- データソース管理も単純化されました。データベースドライバーは、他のサービスと同様にデプロイできます。また、管理コンソールまたは管理 CLI で直接データソースを作成および管理できます。
- JBoss Enterprise Application Platform 6 の起動および終了が非常に速くなります。これは、特に開発者にとって利点があります。少ないリソースが使用されるため、システムリソースの使用が非常に効率的になります。
1.3.2.5. JBoss Enterprise Application Platform 6 の新用語
管理および設定
- 管理ドメイン
- 管理ドメインは JBoss Enterprise Application Platform が使用できる 2 つのモジュールの 1 つです。管理ドメインでは、複数の物理サーバーや仮想サーバー (ホストコントローラー) が中央ドメインコントローラーによって管理されます。コンテナのインスタンス (サーバー) はサーバーグループに分類されます。サーバーグループの各サーバーは同じ設定とデプロイメントを共有します。複数の物理ホストや仮想ホストからのサーバーがサーバーグループに含まれるようにすることが可能です。サーバーグループの設定はプロファイルと呼ばれます。管理ドメインは設定パラダイムであり、クラスタリングや高可用性とは関係ありません。
- ドメインコントローラー
- 管理ドメインに適用される用語です。物理ホストやサーバーグループ、サーバーの全体で設定を管理し伝搬する管理ドメインインスタンス上で実行されるプロセスのことです。デフォルトでは、ドメインコントローラーはローカルホスト上で実行されますが、他のドメインコントローラーへ接続するよう物理ホストを設定することも可能です。
- domain.xml
EAP_HOME/domain/configuration/domain.xml
ファイルは JBoss Enterprise Application Platform 6 の管理ドメインに対する中央設定です。ホスト固有でない設定詳細のすべてが含まれます。永続設定を維持するため設定ファイル自体が定期的に上書きされるため、管理 CLI または Web ベースの管理コンソールを使用して設定の詳細を管理することが推奨されます。- ホストコントローラー
- 管理ドメインに適用される用語です。JBoss Enterprise Application Platform の各個別のインスタンス上で実行されるプロセスのことです。ドメインのメンバーシップとは別の物理ホストへ適用される、異なるネットワークインターフェースや JVM プロパティーなどの設定を使用するよう、各物理ホストを設定することができます。
- スタンドアローンサーバー
- スタンドアローンサーバーは JBoss Enterprise Application Platform 6 で実行できる 2 つのモードの 1 つです。挙動は以前のバージョンの JBoss Enterprise Application と似ています。各サーバーはローカルで管理される独自の設定を持ち、デプロイメントはローカルで管理されます。
- standalone.xml
EAP_HOME/standalone/configuration/standalone.xml
ファイルは JBoss Enterprise Application Platform 6 のスタンドアローンサーバーに対する中央設定です。ホスト固有でない設定詳細のすべてが含まれます。永続設定を維持するため設定ファイル自体が定期的に上書きされるため、管理 CLI または Web ベースの管理コンソールを使用して設定の詳細を管理することが推奨されます。ファイル名がstandalone-PROFILE.xml
の形式を取る、追加のスタンドアローン設定の例が含まれます。これらの設定はスタンドアローンサーバーの異なるサブシステムを有効にします。- サーバーグループ
- 管理ドメインに適用される用語です。サーバーグループは、ドメイン内の複数の物理ホスト上に存在できる仮想サーバーのグループのことです。サーバーグループの各サーバーは同じ設定とデプロイメントを共有します。サーバーグループはクラスターではなく、高可用性やセッションレプリケーションを目的としています。また、サーバーグループは物理ホスト上に存在しませんが、仮想グルーピングです。サーバーグループの設定はプロファイルによって制御されます。
- サーバー
- 管理ドメインとスタンドアローンサーバーでは、サーバーという言葉が異なるものを意味することがあります。管理ドメインでは、サーバーはサーバーグループのメンバーで、物理ホストコントローラー上で実行されるプラットフォームの仮想インスタンスになります。異なる物理ホスト上で実行されるサーバーも同じサーバーグループのメンバーになることが可能です。ほとんどのサーバー設定はサーバーグループによって管理されますが、プロパティーの一部は存在する物理ホスト上で設定することが可能です。スタンドアローンサーバーでは、サーバーはインスタンス全体を意味します。本質的に、スタンドアローンサーバーは設定プロファイルを 1 つのみ保持しますが、管理ドメインは複数のプロファイルを保持することが可能で、各プロファイルを 1 つ以上のサーバーグループに適用することが可能です。
- ソケットバインディンググループ
- 管理ドメインに適用される用語です。ソケットバインディンググループは、サーバーグループの設定に適用できるソケットバインディングのグループのことです。サーバーグループが必要とするソケットバインディングはデプロイメントによって決まります。ソケットバインディンググループは、使用可能なソケットバインディングを細かくカスタマイズできるようにします。
- ソケットバインディング
- ソケットバインディングは、物理ネットワークポートやネットワークプロトコル (TCP、UDP、ICMP など)、論理名との間のマッピングのことです。ソケットバインディングはポートの割り当てを抽象化し、論理名で示すことができるようにします。
- ポートオフセット
- 同じ物理ホストで複数のサーバーを実行する必要がある場合、サーバーが同じポートを使用するとネットワークポートの競合が発生する可能性があります。ソケットバインディンググループにポートオフセットを割り当てることができます。ポートオフセットは各ポート番号に加算される整数のことです。例えば、8080 番ポートに 100 のポートオフセットが適用されると、8180 番ポートが割り当てられます。オフセットの値はポートごとに無効にすることが可能です。
- モジュール
- モジュールはクラスローディングや依存関係の管理に使用されるクラスの論理グルーピングのことです。モジュールは静的または動的になります。モジュールはデプロイメントが要求した場合のみロードされます。これはモジュラーまたは動的クラスローディングと呼ばれます。静的モジュールは JBoss Enterprise Application Platform が開始する前に存在します。JBoss Enterprise Application Platform に同梱される各 API は静的モジュールです。静的モジュールは事前定義されていますが、要求があった場合のみロードされます。動的モジュールは、デプロイメントが必要な時に要求があった場合のみ作成されロードされます。動的モジュールの名前はデプロイされたアーカイブの名前に由来します。
- 管理コンソール
- 管理コンソールは JBoss Enterprise Application Platform の Web ベースの管理インターフェースです。デフォルトでは 9990 ポートで使用できます。これにより、管理ドメインとスタンドアローンサーバーのどちらを使用するかに関わらず、グラフィックに Platform を設定することができます。管理 API を使用して、中央設定ファイルへ設定の詳細を読み書きするデプロイされた Web アプリケーションです。
- 管理 CLI
- 管理 CLI は Red Hat Enterprise Linux または Microsoft Windows ターミナルで実行できるコマンドラインベースの管理インターフェースです。管理 CLI はスクリプト化や一括操作を可能にし、異なる設定バージョンを保存したり元に戻すことを可能にします。Platform のローカルインスタンスやリモートインスタンスを管理することができます。管理 API を使用して設定の詳細を中央設定ファイルに読み書きします。
- 管理 API
- 管理 API は REST と似た API で、柔軟に JBoss Enterprise Application Platform を管理することができます。CRUD (作成、読み取り、更新、削除) パラダイムを使用し、出力は JSON 形式になります。Web ベースの管理コンソールと管理 CLI はコア関数に管理 API を使用します。
- プロファイル
- 管理ドメインとスタンドアローンサーバーのどちらを使用するかによってプロファイルの意味が若干変わります。管理ドメインでは、プロファイルはサーバーグループに適用される設定オプションのグループになります。プロファイルとソケットバインディンググループ、デプロイメントのセットを組み合わせ、サーバーグループを設定します。管理コンソールまたは管理 CLI にプロファイルを設定できます。スタンドアローンサーバーでは、プロファイルは JBoss Enterprise Application Platform の設定全体を意味します。提供されているプロファイル例があるため、最もニーズに近い設定で開始できます。その後、必要に合わせてカスタマイズします。Java EE 6 プロファイルは Java EE 6 API の機能を意味します。詳細は本書の
Java EE 6 Profile
の定義を参照してください。 - Java EE 6 プロファイル
- Java EE 6 API は、Java EE 実装の一部として提供される API のグループであるプロファイルの概念を定義します。Java EE 6 仕様には
Full Profile
とWeb Profile
の 2 つのプロファイルが定義されています。特定実装の開発者は希望の追加プロファイルを作成し、提供することができます。JBoss Enterprise Application Platform 6 は Full Profile と Web Profile の両方に完全準拠しています。 - モジュラークラスローディング
- モジュラークラスローディングとは JBoss Enterprise Application Platform がモジュール (クラスのグループ) をロードする方法を意味します。デプロイメントが要求する時のみモジュールがメモリーにロードされます。デプロイメントがモジュールを必要としなくなると、即座にモジュールはアンロードされます。モジュラークラスローディングはパフォーマンスとセキュリティーの向上に関係します。モジュラークラスローディングは手作業で設定を小型化する必要を軽減します。
- サブシステム
- サブシステムは JBoss Enterprise Application Platform の設定可能なコンポーネントです。サブシステムの設定は、モジュールやクラスのグループに適用されます。 JPA、JCA、Security、modcluster などの JBoss Enterprise Application Platform で提供される各 API はサブシステムレベルで設定可能です。各サブシステムの設定は、インストールの
docs/
ディレクトリに提供される指定のドキュメント型定義 (DTD) に従います。独自のサブシステムを作成して JBoss Enterprise Application Platform 6 を拡張することができます。 - 設定ファイルの履歴
- JBoss Enterprise Application Platform 6 は手作業で XML を変更せずに、管理コンソールや管理 CLI、管理 API を使用して設定することを目的としています。設定の変更はファイルシステムに対して自動的に永続化されます。これらの開発と共に、異なるバージョンの設定へ保存、ロード、ロールバック、転送を行う機能が追加されました。
- ファイルシステムパス
- JBoss Enterprise Application Platform 6 では設定内でファイルシステムパスの論理名を指定することができます。これにより、特定のホスト設定が普遍的な論理名へ解決し、設定の移植性を補助します。
- パスワードボールト
- JBoss Enterprise Application Platform 6 には、パスワードや機密情報が含まれるその他の文字列を暗号化されたパスワードボールトでマスクするメカニズムが含まれています。ビルトインのボールトメカニズムを使用できますが、アプリケーションに対して独自の実行を作成することもできます。
- JBoss LogManager
- JBoss LogManager は JBoss Enterprise Application Platform 6 のサブシステムで、アプリケーションや JBoss Enterprise Application Platform 6 の他のサブシステムより送信されたログメッセージをキャプチャーし対応します。JBoss LogManager は複数の一般的なアプリケーションロギングフレームワークをサポートします。
- リソースアダプター
- リソースアダプターは、 Java コネクターアーキテクチャー (JCA) 仕様を使用して Java EE アプリケーションとエンタープライズ情報システム (EIS) との間の通信を提供するデプロイ可能な Java EE コンポーネントです。通常、リソースアダプターは EIS のベンダーによって提供されるため、ベンダーの製品と Java EE アプリケーションとの統合は容易になります。
開発
- コンテキストおよび依存関係の挿入 (CDI)
- コンテキストおよび依存関係の挿入 (Contexts and Dependency Injection, CDI) は、EJB コンポーネントを管理された Bean として使用できるようにするための仕様で、2 つのコンポーネントモデルを統一し、開発プロセスを効率化します。JBoss Enterprise Application Platform は、CDI の参照実装である Weld より CDI を実装します。CDI は JCP JSR-299 に解説されています。
- Java Enterprise Edition (EE) プロファイル
- Java EE 6 プロファイルは Java EE 6 API のサブセットです。Java EE 6 は Full と Web の 2 つの異なるプロファイルを指定します。また、追加プロファイルの作成方法も指定します。JBoss Enterprise Application Platform 6 は Full Profile と Web Profile 両方の認定実装です。
- EJB 3.1
- Enterprise JavaBeans (EJB) は、アプリケーションの異なるビジネスロジックレイヤーをカプセル化するコンテナ管理オブジェクトです。EJB 3.1 仕様はセッション Bean とメッセージ駆動型 Bean を定義します。
- 移植可能な JNDI 名前空間
- EJB 3.1 は標準化されたグローバル JNDI 名前空間や、Java EE アプリケーションの様々なスコープへマッピングする複数の関連名前空間を導入しました。移植可能な EE アプリケーションに使用される JNDI 名前空間は
java:global
、java:module
、java:app
の 3 つです。JBoss Enterprise Application Platform 6 はこれらの新基準を利用し、適切な書式の JNDI 名を強制します。非修飾の相対名や絶対名は、トップレベル名前空間であるcomp
、module
、app
、global
、jboss
の 1 つに相対するように完全修飾する必要があります。JNDI 名がこのようなガイドラインに準拠しない場合、invalid name
エラーが発生します。 - Maven リポジトリ
- Apache Maven は、ソフトウェアの作成、管理、構築を行う Java アプリケーションの開発で標準的に使用される分散型構築自動ツールです。Maven は POM ファイルと呼ばれる設定ファイルを使用して、ローカルリポジトリやリモートリポジトリより構築の依存関係を識別したり、検索およびダウンロードします。JBoss Enterprise Application Platform 6 には Red Hat カスタマーサービスポータル (CSP) からダウンロードできる Maven リポジトリが含まれています。これには、アプリケーションの構築するため Java EE の開発者が一般的に使用する多くの要件が含まれています。Maven リポジトリは便宜上提供されていますが、依存関係はリモートのソースからダウンロードせずに、ローカルで依存関係を提供する必要があります。
- 2 次キャッシュ (2LC)
- 2 次キャッシュ (2LC) はアプリケーションの状態に関連する永続情報が保持されるデータストアです。2LC コンシューマーの例は、セッションステートレプリケーション、シングルサインオン (SSO)、Java 永続 API (JPA) などです。JBoss Enterprise Application Platform 6 は Infinispan を使用して 2LC を管理します。
- JBoss ロギング
- JBoss ロギングは JBoss Enterprise Application Platform に含まれるアプリケーションロギングフレームワークです。アプリケーションにロギングを追加するメカニズムや、ログメッセージを現地語化したり国際化するメカニズムを提供します。JBoss ロギングがデフォルトのロギングフレームワークになりますが、log4j などのサードパーティーのロギングフレームワークを代わりに使用したり、併用することも可能です。
- 永続クラスのエンティティー監査
- JBoss Enterprise Application Platform 6 には、データソースの情報を表す永続クラスのバージョンを監査および保持できるようにする Hibernate Envers が含まれています。
- jboss-ejb3.xml デプロイメント記述子
- Java Enterprise Edition (EE) によって定義される
ejb3-jar.xml
デプロイメント記述子によって提供される機能を上書きしたり追加したりするため、以前のjboss.xml
デプロイメント記述子はjboss-ejb3.xml
デプロイメント記述子に置き換えられました。この新ファイルはjboss.xml
との互換性がないため、jboss.xml
はデプロイメントで無視されます。 - jboss-deployment-structure.xml デプロイメント記述子
jboss-deployment-structure.xml
デプロイメント記述子はクラスローディングを細かく制御する新しい記述子となりました。この記述子はデプロイメントのMETA-INF/
ディレクトリかWEB-INF/
ディレクトリにあります。自動的な依存関係が追加されないようにする機能、追加されない依存関係を追加する機能、追加モジュールの定義、EAR のクラスローディングの挙動変更、モジュールへリソースルートを追加する機能などが含まれます。
1.4. 開発環境の設定
1.4.1. JBoss Developer Studio のダウンロードとインストール
1.4.1.1. JBoss Developer Studio の設定
1.4.1.2. JBoss Developer Studio 5.0 のアーリーアクセスバージョンのダウンロード
手順1.2 タスク
- http://devstudio.jboss.com/earlyaccess/ へアクセスします。
- 最新のビルドタブを選択します。
- 適切なバージョンをクリックしてダウンロードを開始します。
1.4.1.3. JBoss Developer Studio のインストール
- 前提条件
- 「 JBoss Developer Studio 5.0 のアーリーアクセスバージョンのダウンロード」 に従って JBoss Developer Studio をダウンロードします。
手順1.3 タスク
- ターミナルを開きます。
- ダウンロードした
.jar
ファイルが含まれるディレクトリへ移動します。 - 次のコマンドを実行して GUI インストーラーを開始します。
java -jar jbdevstudio-build_version.jar
- [Next] をクリックしてインストールを開始します。
- [I accept the terms of this license agreement] を選択し、[Next] をクリックします。
- インストールパスを調整し、[Next] をクリックします。
注記
インストールパスのフォルダーが存在しない場合はメッセージが表示されます。[Ok] をクリックしてフォルダーを作成します。 - デフォルトの JVM が選択されます。他の JVM を選択するか、そのまま [Next] をクリックします。
- 使用可能なアプリケーションプラットフォームを追加し、[Next] をクリックします。
- インストールの詳細を確認し、[Next] をクリックします。
- インストールが完了したら [Next] をクリックします。
- [Done] をクリックします。
1.4.1.4. JBoss Developer Studio の起動
- 前提条件
- 「JBoss Developer Studio のインストール」 に従ってインストールします。
手順1.4 タスク
- ターミナルを開きます。
- インストールディレクトリへ移動します。
- 次のコマンドを実行して JBoss Developer Studio を起動します。
[localhost]$ ./jbdevstudio
1.4.1.5. JBoss Enterprise Application Platform 6 サーバーの JBoss Developer Studio への追加
手順1.5 サーバーの追加
- [Servers]タブを開きます。[Servers]タブがない場合は次のようにパネルへ追加します。
- [Window] → [Show View] → [Other...] の順にクリックします。
- [Servers] フォルダーより [Server] を選択し、[OK] をクリックします。
- [new server wizard]リンクをクリックするか、空のサーバーパネル内で右クリックし、[New] → [Server] と選択します。
図1.2 新しいサーバーの追加 - 使用できるサーバーがない場合
- [JBoss Enterprise Middleware] を拡張し、 [JBoss Enterprise Application Platform 6.x] を選択します。その後、[Next] ボタンをクリックします。
図1.3 サーバータイプの選択
- [Browse] をクリックし、JBoss Enterprise Application Platform 6 のインストール場所へ移動します。そして [Next] をクリックします。
図1.4 サーバーインストールの閲覧
- この画面でサーバーの挙動を定義します。手作業でサーバーを起動するか JBoss Developer Studio に管理を任せます。デプロイメントのリモートサーバーを定義することもできます。この例では、サーバーはローカルサーバーで、チェックの必要がないため JBoss Developer Studio にサーバーを管理させます。[Next] をクリックします。
図1.5 新しい JBoss サーバーの挙動の定義
- この画面により新しいサーバーに対して既存のプロジェクトを設定することが可能です。現時点ではプロジェクトがないため、 [Finish] をクリックします。
図1.6 新しい JBoss サーバーのリソースの変更
JBoss Enterprise Application Server 6.0 のランタイムサーバーは [Servers] タブに表示されます。
図1.7 サーバーがサーバーリストに表示される
1.5. 最初のアプリケーションの実行
1.5.1. デフォルトの Welcome Web アプリケーションの置き換え
手順1.6 タスク
Welcome アプリケーションを無効にします。
管理 CLI スクリプトEAP_HOME/bin/jboss-cli.sh
を使用して次のコマンドを実行します。異なる管理ドメインのプロファイルを変更する必要があったり、スタンドアローンサーバーの場合はコマンドの/profile=default
の部分を削除する必要がある場合があります。/profile=default/subsystem=web/virtual-server=default-host:write-attribute(name=enable-welcome-root,value=false)
ルートコンテキストを使用するよう Web アプリケーションを設定します。
Web アプリケーションを設定してルートコンテキストを (/) を URL アドレスとして使用するには、META-INF/
またはWEB-INF/
ディレクトリにあるjboss-web.xml
を変更します。<context-root>
ディレクティブを次のようなディレクティブに置き換えます。<jboss-web> <context-root>/</context-root> </jboss-web>
アプリケーションをデプロイします。
サーバーグループか最初に変更したサーバーにアプリケーションをデプロイします。アプリケーションはhttp://SERVER_URL:PORT/
で使用できるようになります。
1.5.2. クイックスタートコードの例をダウンロードする
1.5.2.1. Java EE クイックスタートの例へのアクセス
JBoss Enterprise Application Platform 6 には、ユーザーが Java EE 6 の技術を使用してアプリケーションを作成できるよう手助けするクイックスタートの例が複数含まれています。
前提条件
- Maven 3.0.0 またはそれ以降のバージョン。Maven のインストールに関する詳細は http://maven.apache.org/download.html を参照してください。
手順1.7 クイックスタートのダウンロード
- Web ブラウザーを開き、URL https://access.redhat.com/jbossnetwork/restricted/listSoftware.html?product=appplatform にアクセスします。
- リストに「Application Platform 6 クイックスタート」があることを確認します。
- [ダウンロード] ボタンをクリックし、例が含まれる
.zip
ファイルをダウンロードします。 - 希望のディレクトリにアーカイブを展開します。
Java EE クイックスタートの例がダウンロードされ、解凍されます。各クイックスタートのデプロイ方法については quickstarts/
ディレクトリの README.md
ファイルを参照してください。
1.5.3. クイックスタートの実行
1.5.3.1. JBoss Developer Studio でのクイックスタートの実行
手順1.8 JBoss Developer Studio にクイックスタートをインポートする
- JBoss Developer Studio を起動します。
- メニューより [File] → [Import] と選択します。
- 選択リストより [Maven] → [Existing Maven Projects] と選択し、[Next] を選択します。
図1.8 既存の Maven プロジェクトのインポート
- クイックスタートディレクトリのルートを確認し、[OK] をクリックします。すべてのクイックスタートプロジェクトの pom.xml ファイルの一覧が [Projects] リストボックスに投入されます。
図1.9 Maven プロジェクトの選択
- [Next] をクリックした後、 [Finish] をクリックします。
手順1.9 helloworld
クイックスタートのビルドとデプロイ
helloworld
クイックスタートは最も単純なクイックスタートの 1 つで、JBoss サーバーが適切に設定され実行されているか検証することができます。
- [Servers] タブを開き、パネルにアプリケーションを追加します。
- [Window] → [Show View] → [Other...] をクリックします。
- [Servers] フォルダーから [Server] を選択し[Ok] をクリックします。
- [Project Explorer] タブで [helloworld] を右クリックし、[Run As] → [Run on Server] を選択します。
- [JBoss EAP 6.0 Runtime Server] サーバーを選択し、[Next] をクリックします。これにより
helloworld
クイックスタートが JBoss サーバーにデプロイされます。 helloworld
が JBoss サーバーに正しくデプロイされたかを確認するには、Web ブラウザーを開いて URL http://localhost:8080/jboss-as-helloworld にてアプリケーションに接続します。
1.5.3.2. コマンドラインを使用したクイックスタートの実行
手順1.10 コマンドラインを使用したクイックスタートのビルドおよびデプロイ
クイックスタートのルートディレクトリにある
README
ファイルを確認してください。このファイルにはシステム要件に関する一般的な情報、Maven の設定方法、ユーザーの追加方法、クイックスタートの実行方法が含まれています。クイックスタートを始める前に必ず読むようにしてください。このファイルには使用可能なクリックスタートの一覧表も含まれています。この表にはクイックスタート名と使用する技術が記載され、各クイックスタートの簡単な説明と設定するために必要な経験レベルが記載されています。クイックスタートの詳細情報はクイックスタート名をクリックしてください。他のクイックスタートを向上したり拡張するため作成されたクイックスタートもあります。このようなクイックスタートはPrerequisites
カラムに記載されています。クイックスタートに前提条件がある場合、クイックスタートを始める前にこれらをインストールする必要があります。任意コンポーネントのインストールや設定が必要になるクイックスタートもあります。これらのコンポーネントはクリックスタートが必要である場合のみインストールしてください。helloworld
クイックスタートを実行します。helloworld
クイックスタートは最も単純なクイックスタートの 1 つで、JBoss サーバーが適切に設定され実行されているか検証することができます。helloworld
クイックスタートのルートにあるREADME
ファイルを開きます。このファイルにはクイックスタートのビルドおよびデプロイ方法や実行しているアプリケーションへのアクセス方法の詳細手順が含まれています。別のクイックスタートを実行します。
各クイックスタートのルートフォルダーにあるREADME
ファイルの手順に従って例を実行します。
1.5.4. クイックスタートチュートリアルの確認
1.5.4.1. helloworld クイックスタート
helloworld クイックスタートでは JBoss Enterprise Application Platform 6 に単純なサーブレットをデプロイする方法を説明します。ビジネスロジックは CDI (Contexts and Dependency Injection) Bean として提供されるサービスにカプセル化されサーブレットに挿入されます。このクイックスタートは大変単純です。「Hello World」を Web ページに出力するだけです。サーバーが適切に設定され、起動されたかを最初に確認するのに適しています。
手順1.11 helloworld クイックスタートを JBoss Developer Studio にインポートします。
- クイックスタートがインポートされていない場合は 「JBoss Developer Studio のインストール」 の手順に従ってください。
- 「JBoss Developer Studio の起動」 の手順に従って JBoss Developer Studio を起動します。
- メニューより [File] → [Import] と選択します。
- 選択リストより [Maven] → [Existing Maven Projects] と選択し、[Next] を選択します。
図1.10 既存の Maven プロジェクトのインポート
QUICKSTART_HOME/quickstart/helloworld/
ディレクトリを閲覧し、[OK] をクリックします。[ Projects] リストボックスに [helloworld] クリックスタートプロジェクトからpom.xml
ファイルが追加されます。図1.11 Maven プロジェクトの選択
- [Finish] をクリックします。
手順1.12 helloworld クイックスタートのビルドとデプロイ
- JBoss Enterprise Application Platform 6 に対して JBoss Developer Studio を設定していない場合は 「JBoss Enterprise Application Platform 6 サーバーの JBoss Developer Studio への追加」 に従って設定を行ってください。
- [Project Explorer] タブの [jboss-as-helloworld] を右クリックし、[Run As] → [Run on Server] と選択します。
図1.12 サーバー上での実行
- [JBoss EAP 6.0 Runtime Server] サーバーを選択し、[Next] をクリックします。これにより helloworld クイックスタートが JBoss サーバーにデプロイされます。
- helloworld が JBoss サーバーに正しくデプロイされたかを確認するには、Web ブラウザを開いて URL http://localhost:8080/jboss-as-helloworld にてアプリケーションに接続します。
手順1.13 ディレクトリ構造の確認
QUICKSTART_HOME/helloworld
ディレクトリにあります。helloworld クリックスタートはサーブレットと CDI Bean によって構成されます。また、このアプリケーションの Bean を検索し、CDI をアクティベートするよう JBoss Enterprise Application Platform 6 に伝える空の beans.xml ファイルも含まれています。
beans.xml
はクイックスタートのsrc/main/webapp/
ディレクトリにあるWEB-INF/
フォルダーにあります。src/main/webapp/
ディレクトリには、単純なメタリフレッシュを使用してユーザーのブラウザーを http://localhost:8080/jboss-as-helloworld/HelloWorld にあるサーブレットへリダイレクトするindex.html
ファイルも含まれています。- この例の全設定は、例の
src/main/webapp/
ディレクトリにあるWEB-INF/
にあります。 - クイックスタートには
web.xml
ファイルは必要ありません。
手順1.14 コードの確認
HelloWorldServlet コードの検証
HelloWorldServlet.java
はsrc/main/java/org/jboss/as/quickstarts/helloworld/
ディレクトリにあります。このサーブレットが情報をブラウザーに送ります。27. @WebServlet("/HelloWorld") 28. public class HelloWorldServlet extends HttpServlet { 29. 30. static String PAGE_HEADER = "<html><head /><body>"; 31. 32. static String PAGE_FOOTER = "</body></html>"; 33. 34. @Inject 35. HelloService helloService; 36. 37. @Override 38. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 39. PrintWriter writer = resp.getWriter(); 40. writer.println(PAGE_HEADER); 41. writer.println("<h1>" + helloService.createHelloMessage("World") + "</h1>"); 42. writer.println(PAGE_FOOTER); 43. writer.close(); 44. } 45. 46. }
表1.4 HelloWorldServlet の詳細
行 注記 27 Java EE 6 以前はサーブレットの登録に XML ファイルが使用されました。サーブレットの登録はかなり簡易化され、 @WebServlet
アノテーションを追加し、サーブレットへのアクセスに使用される URL へのマッピングを提供することのみが必要となります。30-32 各 Web ページには適切な形式の HTML が必要になります。本クリックスタートは静的な文字列を使用して最低限のヘッダーとフッターの出力を書き出します。 34-35 これらの行は実際のメッセージを生成する HelloService CDI Bean を挿入します。HelloService の API を変更しない限り、ビューレイヤーを変更せずに HelloService の実装を後日変更することが可能です。 41 この行はサービスへ呼び出し、「Hello World」というメッセージを生成して HTTP 要求へ書き出します。 HelloService コードの検証
HelloService.java
ファイルはsrc/main/java/org/jboss/as/quickstarts/helloworld/
ディレクトリにあります。このサービスは大変単純で、メッセージを返します。XML やアノテーションの登録は必要ありません。9. public class HelloService { 10. 11. String createHelloMessage(String name) { 12. return "Hello " + name + "!"; 32. } 33. } 34.
1.5.4.2. numberguess クイックスタート
このクイックスタートでは単純なアプリケーションを作成し、 JBoss Enterprise Application Platform 6 にデプロイする方法を説明します。ここで作成するアプリケーションは情報を永続化しません。情報は JSF ビューを使用して表示され、ビジネスロジックは 2 つの CDI (Contexts and Dependency Injection) Bean にカプセル化されます。numberguess クイックスタートでは 1 から 100 までの数字を当てるチャンスが 10 回与えられます。数字を選択した後、その数字が正解の数字より大きいか小さいかが表示されます。
QUICKSTART_HOME/numberguess
ディレクトリにあります。numberguess クイックスタートは WAR モジュールとしてパッケージ化された複数の Bean や設定ファイル、Facelets (JSF) ビューによって構成されます。
手順1.15 numberguess クイックスタートを JBoss Developer Studio にインポートします。
- クイックスタートがインポートされていない場合は 「JBoss Developer Studio のインストール」 の手順に従ってください。
- 「JBoss Developer Studio の起動」 の手順に従って JBoss Developer Studio を起動します。
- メニューより [File] → [Inport] と選択します。
- 選択リストより [Maven] → [Maven Projects] と選択し、[Next] を選択します。
図1.13 既存の Maven プロジェクトのインポート
QUICKSTART_HOME/quickstart/numberguess/
ディレクトリを閲覧し、[OK] をクリックします。 [Projects] リストボックスに [numberguess] クリックスタートプロジェクトからpom.xml
ファイルが追加されます。- 終了 をクリックします。
手順1.16 numberguess クイックスタートのビルドとデプロイ
- JBoss Enterprise Application Platform 6 に対して JBoss Developer Studio を設定していない場合は 「JBoss Enterprise Application Platform 6 サーバーの JBoss Developer Studio への追加」 に従って設定を行ってください。
- [Project Explorer] タブの [jboss-as-numberguess] を右クリックし、[Run As] → [Run on Server] と選択します。
- [JBoss EAP 6.0 Runtime Server] サーバーを選択し、[Next] をクリックします。これにより numberguess クイックスタートが JBoss サーバーにデプロイされます。
- numberguess が JBoss サーバーに正しくデプロイされたかを確認するには、Web ブラウザを開いて URL http://localhost:8080/jboss-as-numberguess にてアプリケーションに接続します。
手順1.17 設定ファイルの確認
src/main/webapp/
ディレクトリにある WEB-INF/
ディレクトリに格納されています。
faces-config ファイルの確認
本クイックスタートはfaces-config.xml
ファイル名の JSF 2.0 バージョンを使用します。Facelets の標準的なバージョンが JSF 2.0 のデフォルトのビューハンドラーであるため、特に必要なものはありません。ここでは JBoss Enterprise Application Platform 6 は Java EE の領域を越えます。この設定ファイルが含まれると JSF が自動的に設定されます。そのため、設定はルート要素のみで構成されます。03. <faces-config version="2.0" 04. xmlns="http://java.sun.com/xml/ns/javaee" 05. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 06. xsi:schemaLocation=" 07. http://java.sun.com/xml/ns/javaee> 08. http://java.sun.com/xml/ns/javaee/web-facesconfig_2_0.xsd"> 09. 10. </faces-config>
beans.xml ファイルの確認
アプリケーションの Bean を検索し、CDI を有効にするよう JBoss Enterprise Application Platform に伝える空のbeans.xml
ファイルも存在します。web.xml ファイルはありません
クイックスタートにはweb.xml
ファイルは必要ありません。
手順1.18 JSF コードの確認
.xhtml
ファイル拡張子を使用しますが、レンダリングされたビューには .jsf
拡張子を使用します。
home.xhtml コードの確認
home.xhtml
ファイルはsrc/main/webapp/
ディレクトリにあります。03. <html xmlns="http://www.w3.org/1999/xhtml" 04. xmlns:ui="http://java.sun.com/jsf/facelets" 05. xmlns:h="http://java.sun.com/jsf/html" 06. xmlns:f="http://java.sun.com/jsf/core"> 07. 08. <head> 09. <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /> 10. <title>Numberguess</title> 11. </head> 12. 13. <body> 14. <div id="content"> 15. <h1>Guess a number...</h1> 16. <h:form id="numberGuess"> 17. 18. <!-- Feedback for the user on their guess --> 19. <div style="color: red"> 20. <h:messages id="messages" globalOnly="false" /> 21. <h:outputText id="Higher" value="Higher!" 22. rendered="#{game.number gt game.guess and game.guess ne 0}" /> 23. <h:outputText id="Lower" value="Lower!" 24. rendered="#{game.number lt game.guess and game.guess ne 0}" /> 25. </div> 26. 27. <!-- Instructions for the user --> 28. <div> 29. I'm thinking of a number between <span 30. id="numberGuess:smallest">#{game.smallest}</span> and <span 31. id="numberGuess:biggest">#{game.biggest}</span>. You have 32. #{game.remainingGuesses} guesses remaining. 33. </div> 34. 35. <!-- Input box for the users guess, plus a button to submit, and reset --> 36. <!-- These are bound using EL to our CDI beans --> 37. <div> 38. Your guess: 39. <h:inputText id="inputGuess" value="#{game.guess}" 40. required="true" size="3" 41. disabled="#{game.number eq game.guess}" 42. validator="#{game.validateNumberRange}" /> 43. <h:commandButton id="guessButton" value="Guess" 44. action="#{game.check}" 45. disabled="#{game.number eq game.guess}" /> 46. </div> 47. <div> 48. <h:commandButton id="restartButton" value="Reset" 49. action="#{game.reset}" immediate="true" /> 50. </div> 51. </h:form> 52. 53. </div> 54. 55. <br style="clear: both" /> 56. 57. </body> 58. </html>
表1.5 JSF の詳細
行 注記 20-24 ユーザーに送信できるメッセージ、「Higher」(より大きい) と「Lower」(より小さい) になります。 29-32 ユーザーが数を選択するごとに数字の範囲が狭まります。有効な数の範囲が分かるようにこの文章は変更されます。 38-42 このフィールドは値式を使用して Bean プロパティーにバインドされます。 42 ユーザーが誤って選択範囲外の数字を入力しないようバリデーターのバインディングが使用されます。バリデーターがない場合、ユーザーが範囲外の数字を選択してチャンスが減ってしまう可能性があります。 43-45 ユーザーの選択した数字をサーバーに送る方法があるはずです。ここでは Bean 上のアクションメソッドをバインドします。
手順1.19 クラスファイルの確認
src/main/java/org/jboss/as/quickstarts/numberguess/
ディレクトリにあります。パッケージの宣言とインポートはリストには含まれていません。完全なリストはクイックスタートのソースコードにあります。
Random.java 限定子コードの検証
型に基づき挿入の対象となる 2 つの Bean 間の曖昧さを削除するために限定子が使用されます。限定子の詳細は 「修飾子を使用して不明な挿入を解決」 を参照してください。@Random
限定子は乱数の挿入に使用されます。21. @Target({ TYPE, METHOD, PARAMETER, FIELD }) 22. @Retention(RUNTIME) 23. @Documented 24. @Qualifier 25. public @interface Random { 26. 27. }
MaxNumber.java 限定子コードの検証
@MaxNumber
qualifier
は最大許可数の挿入に使用されます。21. @Target({ TYPE, METHOD, PARAMETER, FIELD }) 22. @Retention(RUNTIME) 23. @Documented 24. @Qualifier 25. public @interface MaxNumber { 26. 27. }
ジェネレーターコードの検証
Generator
クラスは producer メソッドより乱数を作成する役割があります。また、producer メソッドより最大可能数も公開します。このクラスはアプリケーションスコープ指定であるため、毎回異なる乱数になることはありません。28. @ApplicationScoped 29. public class Generator implements Serializable { 30. private static final long serialVersionUID = -7213673465118041882L; 31. 32. private java.util.Random random = new java.util.Random(System.currentTimeMillis()); 33. 34. private int maxNumber = 100; 35. 36. java.util.Random getRandom() { 37. return random; 38. } 39. 40. @Produces 41. @Random 42. int next() { 43. // a number between 1 and 100 44. return getRandom().nextInt(maxNumber - 1) + 1; 45. } 46. 47. @Produces 48. @MaxNumber 49. int getMaxNumber() { 50. return maxNumber; 51. } 52. }
ゲームコードの検証
セッションスコープ指定クラスGame
はアプリケーションのプライマリエントリーポイントです。ゲームの設定や再設定、ユーザーが選択する数字のキャプチャーや検証、FacesMessage
によるユーザーへのフィードバック提供を行う役割があります。コンストラクト後の lifecycle メソッドを使用し、@Random Instance
<Integer>
Bean より乱数を読み出してゲームを初期化します。このクラスの @Named アノテーションを見てください。このアノテーションは式言語 (EL) より Bean を JSF ビューにアクセスできるようにしたい場合のみ必要です。この場合#{game}
が EL になります。¶ 035. @Named¶ 036. @SessionScoped¶ 037. public class Game implements Serializable {¶ 038.¶ 039. private static final long serialVersionUID = 991300443278089016L;¶ 040.¶ 041. /**¶ 042. * The number that the user needs to guess¶ 043. */¶ 044. private int number;¶ 045.¶ 046. /**¶ 047. * The users latest guess¶ 048. */¶ 049. private int guess;¶ 050.¶ 051. /**¶ 052. * The smallest number guessed so far (so we can track the valid guess range).¶ 053. */¶ 054. private int smallest;¶ 055.¶ 056. /**¶ 057. * The largest number guessed so far¶ 058. */¶ 059. private int biggest;¶ 060.¶ 061. /**¶ 062. * The number of guesses remaining¶ 063. */¶ 064. private int remainingGuesses;¶ 065.¶ 066. /**¶ 067. * The maximum number we should ask them to guess¶ 068. */¶ 069. @Inject¶ 070. @MaxNumber¶ 071. private int maxNumber;¶ 072.¶ 073. /**¶ 074. * The random number to guess¶ 075. */¶ 076. @Inject¶ 077. @Random¶ 078. Instance<Integer> randomNumber;¶ 079.¶ 080. public Game() {¶ 081. }¶ 082.¶ 083. public int getNumber() {¶ 084. return number;¶ 085. }¶ 086.¶ 087. public int getGuess() {¶ 088. return guess;¶ 089. }¶ 090.¶ 091. public void setGuess(int guess) {¶ 092. this.guess = guess;¶ 093. }¶ 094.¶ 095. public int getSmallest() {¶ 096. return smallest;¶ 097. }¶ 098.¶ 099. public int getBiggest() {¶ 100. return biggest;¶ 101. }¶ 102.¶ 103. public int getRemainingGuesses() {¶ 104. return remainingGuesses;¶ 105. }¶ 106.¶ 107. /**¶ 108. * Check whether the current guess is correct, and update the biggest/smallest guesses as needed.¶ 109. * Give feedback to the user if they are correct.¶ 110. */¶ 111. public void check() {¶ 112. if (guess > number) {¶ 113. biggest = guess - 1;¶ 114. } else if (guess < number) {¶ 115. smallest = guess + 1;¶ 116. } else if (guess == number) {¶ 117. FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("Correct!"));¶ 118. }¶ 119. remainingGuesses--;¶ 120. }¶ 121.¶ 122. /**¶ 123. * Reset the game, by putting all values back to their defaults, and getting a new random number.¶ 124. * We also call this method when the user starts playing for the first time using¶ 125. * {@linkplain PostConstruct @PostConstruct} to set the initial values.¶ 126. */¶ 127. @PostConstruct¶ 128. public void reset() {¶ 129. this.smallest = 0;¶ 130. this.guess = 0;¶ 131. this.remainingGuesses = 10;¶ 132. this.biggest = maxNumber;¶ 133. this.number = randomNumber.get();¶ 134. }¶ 135.¶ 136. /**¶ 137. * A JSF validation method which checks whether the guess is valid. It might not be valid because¶ 138. * there are no guesses left, or because the guess is not in range.¶ 139. *¶ 140. */¶ 141. public void validateNumberRange(FacesContext context, UIComponent toValidate, Object value) {¶ 142. if (remainingGuesses <= 0) {¶ 143. FacesMessage message = new FacesMessage("No guesses left!");¶ 144. context.addMessage(toValidate.getClientId(context), message);¶ 145. ((UIInput) toValidate).setValid(false);¶ 146. return;¶ 147. }¶ 148. int input = (Integer) value;¶ 149.¶ 150. if (input < smallest || input > biggest) {¶ 151. ((UIInput) toValidate).setValid(false);¶ 152.¶ 153. FacesMessage message = new FacesMessage("Invalid guess");¶ 154. context.addMessage(toValidate.getClientId(context), message);¶ 155. }¶ 156. }¶ 157. }¶
第2章 Maven ガイド
2.1. Maven について
2.1.1. Maven リポジトリについて
http://
、ファイルサーバーのリポジトリにはfile://
という風に共通のプロトコルを使いアクセスします。ローカルのリポジトリは、リモートリポジトリからのアーティファクトをダウンロードしキャッシュ化したものです。
2.1.2. Maven POM ファイルについて
pom.xml
ファイルには一部の設定オプションが必要で、他のすべてをデフォルトにします。詳細は 「Maven POM ファイルの最低要件」 を参照してください。
pom.xml
ファイルのスキーマは http://maven.apache.org/maven-v4_0_0.xsd にあります。
2.1.3. Maven POM ファイルの最低要件
pom.xml
ファイルの最低要件は次の通りです。
- プロジェクトルート
- modelVersion
- groupId - プロジェクトのグループの ID
- artifactId - アーティファクト (プロジェクト) の ID
- version - 指定グループ下のアーティファクトのバージョン
基本的な pom.xml
ファイルは次のようになります。
<project> <modelVersion>4.0.0</modelVersion> <groupId>com.jboss.app</groupId> <artifactId>my-app</artifactId> <version>1</version> </project>
2.1.4. Maven 設定ファイルについて
settings.xml
ファイルには Maven に関するユーザー固有の設定情報が含まれています。開発者の ID、プロキシ情報、ローカルリポジトリの場所など、 pom.xml
ファイルで配布されてはならないユーザー固有の設定が含まれています。
settings.xml
が存在する場所は 2 つあります。
- Maven インストール
- 設定ファイルは
M2_HOME/conf/
ディレクトリにあります。これらの設定はglobal
設定と呼ばれます。デフォルトの Maven 設定ファイルはコピー可能なテンプレートで、これを基にユーザー設定ファイルを設定することが可能です。 - ユーザーのインストール
- 設定ファイルは
USER_HOME/.m2/
ディレクトリにあります。 Maven とユーザーのsettings.xml
ファイルが存在する場合、内容はマージされます。重複する内容がある場合、ユーザーのsettings.xml
ファイルが優先されます。
settings.xml
ファイルの例になります。
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd"> <profiles> <!-- Configure the JBoss EAP Maven repository --> <profile> <id>jboss-eap-maven-repository</id> <repositories> <repository> <id>jboss-eap</id> <url>file:///path/to/repo/jboss-eap-6.0-maven-repository</url> <releases> <enabled>true</enabled> </releases> <snapshots> <enabled>false</enabled> </snapshots> </repository> </repositories> <pluginRepositories> <pluginRepository> <id>jboss-eap-maven-plugin-repository</id> <url>file:///path/to/repo/jboss-eap-6.0-maven-repository</url> <releases> <enabled>true</enabled> </releases> <snapshots> <enabled>false</enabled> </snapshots> </pluginRepository> </pluginRepositories> </profile> </profiles> <activeProfiles> <!-- Optionally, make the repository active by default --> <activeProfile>jboss-eap-maven-repository</activeProfile> </activeProfiles> </settings>
settings.xml
ファイルのスキーマは http://maven.apache.org/xsd/settings-1.0.0.xsd にあります。
2.2. Maven と JBoss Maven レポジトリのインストール
2.2.1. Maven のダウンロードとインストール
- Apache Maven Project - Download Maven へアクセスし、ご使用のオペレーティングシステムに対する最新のディストリビューションをダウンロードします。
- ご使用のオペレーシングシステムに対して Apache Maven をダウンロードしインストールする方法については Maven のドキュメントを参照してください。
2.2.2. JBoss Enterprise Application Platform 6 の Maven リポジトリのインストール
2.2.3. JBoss Enterprise Application Platform 6 の Maven リポジトリのローカルインストール
手順2.1 JBoss Enterprise Application Platform 6 の Maven リポジトリ ZIP アーカイブのダウンロード
- Web ブラウザーを開き、URL https://access.redhat.com/jbossnetwork/restricted/listSoftware.html?product=appplatform にアクセスします。
- リストに「Application Platform 6 Maven リポジトリ」があることを確認します。
- [ダウンロード] ボタンをクリックし、リポジトリが含まれる
.zip
ファイルをダウンロードします。 - ローカルファイルシステム上の同じディレクトリにあるファイルを希望のディレクトリへ解凍します。
jboss-eap-6.0.0.maven-repository
というMaven リポジトリディレクトリが作成されます。
重要
.m2/
ディレクトリにあるキャッシュされた repository/
サブディレクトリを削除してください。
2.2.4. Apache httpd を使用するため JBoss Enterprise Application Platform 6 の Maven リポジトリをインストールする
Apache httpd を設定する必要があります。手順は Apache HTTP Server Project を参照してください。
手順2.2 JBoss Enterprise Application Platform 6 の Maven リポジトリの ZIP アーカイブをダウンロードする
- Web ブラウザーを開き、URL https://access.redhat.com/jbossnetwork/restricted/listSoftware.html?product=appplatform へアクセスします。
- リストに「Application Platform 6 Maven リポジトリ」があることを確認します。
- ダウンロード ボタンをクリックし、リポジトリが含まれる
.zip
ファイルをダウンロードします。 - Apache サーバー上で Web にアクセス可能なディレクトリにファイルを展開します。
- Apache を設定し、作成されたディレクトリの読み取りアクセスとディレクトリの閲覧を許可します。
- 「Maven 設定を使用した JBoss Enterprise Application Platform の Maven リポジトリの設定」 に従って Maven リポジトリを設定します。
マルチユーザー環境が Apache httpd 上で Maven リポジトリにアクセスできるようになります。
2.2.5. Nexus Maven リポジトリマネージャーを使用して JBoss Enterprise Application Platform 6 の Maven リポジトリをインストールする
手順2.3 JBoss Enterprise Application Platform 6 の Maven リポジトリ ZIP アーカイブのダウンロード
- Web ブラウザーを開き、URL https://access.redhat.com/jbossnetwork/restricted/listSoftware.html?product=appplatform にアクセスします。
- リストに「Application Platform 6 Maven リポジトリ」があることを確認します。
- [ダウンロード] ボタンをクリックし、リポジトリが含まれる
.zip
ファイルをダウンロードします。 - 希望のディレクトリにファイルを展開します。
手順2.4 Nexus Maven リポジトリマネージャーを使用して JBoss Enterprise Application Platform 6 の Maven リポジトリを追加する
- 管理者として Nexus にログインします。
- リポジトリマネージャーの左側の [Views] → [Repositories] メニューより [Repositories] セクションを選択します。
- [Add...] ドロップダウンメニューをクリックし、[Hosted Repository] を選択します。
- 新しいリポジトリに名前と ID をつけます。
- フィールド [Override Local Storage] の場所に、展開されたリポジトリへのディスク上のパスを入力します。
- リポジトリグループでアーティファクトを使用できるようにする場合は次の手順に従い設定を継続します。必要がない場合は継続しないでください。
- リポジトリグループを選択します。
- [Configure] タブをクリックします。
- [Available Repositories] リストにある新しい JBoss Maven リポジトリを左側の [Ordered Group Repositories] へドラッグします。
注記
このリストの順番により Maven アーティファクトの検索優先度が決定されます。
これで Nexus Maven リポジトリマネージャーを使用してリポジトリが設定されました。
2.2.6. Maven リポジトリマネージャーについて
- お客様の組織と Maven リポジトリとの間のプロキシを設定する能力を提供します。これには、デプロイメントの高速化や効率化、Maven によるダウンロードを制御するレベルの向上など、さまざまなメリットがあります。
- 独自に生成したアーティファクトのデプロイ先を提供し、組織全体にわたる異なる開発チーム間におけるコラボレーションを可能にします。
一般的に使用される Maven リポジトリマネージャー
- Sonatype Nexus
- Nexus に関する詳しい情報は Sonatype Nexus: Manage Artifacts を参照してください。
- Artifactory
- Artifactory に関する詳しい情報は Artifactory Open Source を参照してください。
- Apache Archiva
- Apache Archiva に関する詳しい情報は Apache Archiva: The Build Artifact Repository Manager を参照してください。
2.3. Maven レポジトリの設定
2.3.1. JBoss Enterprise Application Platform の Maven リポジトリの設定
プロジェクトで JBoss Enterprise Application Platform の Maven リポジトリを使用するよう Maven に指示する方法は 2 つあります。
- Maven のグローバル設定またはユーザー設定でリポジトリを設定します。
- プロジェクトの POM ファイルでリポジトリを設定します。
手順2.5 JBoss Enterprise Application Platform の Maven リポジトリを使用するよう Maven を設定する
Maven の設定を使用して Maven リポジトリを設定する
推奨される方法です。リポジトリマネージャーや共有サーバーを用いたリポジトリを使用して Maven を設定すると、プロジェクトの制御や管理が向上します。また、代替のミラーを使用してプロジェクトファイルを変更せずにリポジトリマネージャーへの特定リポジトリのルックアップ要求をすべてリダイレクトすることが可能になります。ミラーに関する詳細は Using Mirrors for Repositories を参照してください。プロジェクトの POM ファイルにリポジトリ設定が含まれていない場合、この設定方法はすべての Maven プロジェクトに対して適用されます。プロジェクトの POM を使用して Maven リポジトリを設定する
通常、この方法は推奨されません。プロジェクトの POM ファイルにリポジトリを設定する場合は注意して計画を行い、ビルドが遅くなる可能性があり、想定外のリポジトリからアーティファクトが抽出されることがあることも認識するようにしてください。この方法がもたらす可能性がある結果については Why Putting Repositories in your POMs is a Bad Idea を参照してください。この設定方法は、設定されたプロジェクトのグローバルおよびユーザーの Maven 設定を上書きします。
2.3.2. Maven 設定を使用した JBoss Enterprise Application Platform の Maven リポジトリの設定
- Maven の設定を変更します。
- プロジェクトの POM ファイルを設定します。
注記
- ファイルシステム
file:///path/to/repo/jboss-eap-6.0.0-maven-repository/repository
- Apache Web サーバー
http://intranet.acme.com/jboss-eap-6.0.0-maven-repository/
- Nexus リポジトリマネージャー
https://intranet.acme.com/nexus/content/repositories/jboss-eap-6.0.0-maven-repository
手順2.6 設定
- 選択した設定タイプの
settings.xml
を開きます。グローバル設定
global
設定を設定する場合はM2_HOME/conf/settings.xml
ファイルを開きます。ユーザー設定
ユーザー固有の設定を設定する場合、USER_HOME/.m2/settings.xml
ファイルが存在しない時はM2_HOME/conf/
ディレクトリのsettings.xml
ファイルをUSER_HOME/.m2/
ディレクトリにコピーします。
- 次の XML を
settings.xml
ファイルの<profiles>
要素へコピーします。必ず<url>
を実際のリポジトリの場所に変更するようにしてください。<profile> <id>jboss-eap-repository</id> <repositories> <repository> <id>jboss-eap-repository</id> <name>JBoss EAP Maven Repository</name> <url>file:///path/to/repo/jboss-eap-6.0.0-maven-repository/repository</url> <layout>default</layout> <releases> <enabled>true</enabled> <updatePolicy>never</updatePolicy> </releases> <snapshots> <enabled>false</enabled> <updatePolicy>never</updatePolicy> </snapshots> </repository> </repositories> <pluginRepositories> <pluginRepository> <id>jboss-eap-repository-group</id> <name>JBoss EAP Maven Repository</name> <url> file:///path/to/repo/jboss-eap-6.0.0-maven-repository/repository </url> <layout>default</layout> <releases> <enabled>true</enabled> <updatePolicy>never</updatePolicy> </releases> <snapshots> <enabled>false</enabled> <updatePolicy>never</updatePolicy> </snapshots> </pluginRepository> </pluginRepositories> </profile>
次の XML をsettings.xml
ファイルの<activeProfiles>
要素へコピーします。<activeProfile>jboss-eap-repository</activeProfile>
- JBoss Developer Studio の稼働中に
settings.xml
ファイルを変更する時は、ユーザー設定をリフレッシュする必要があります。メニューより [Window] → [Preferences] と選択します。 [Preferences] ウインドウで [Maven] を開き、[User Settings] を選択します。[Update Settings] ボタンをクリックし、 JBoss Developer Studio で Maven のユーザー設定をリフレッシュします。図2.1 Maven ユーザー設定の更新
重要
~/.m2/repository/
ディレクトリ、Windows では \Documents and Settings\USERNAME\.m2\repository\
に存在する廃止されたリポジトリが原因であることがあります。repository/
サブディレクトリを削除し、再度実行してください。
JBoss Enterprise Application Platform のリポジトリが設定されます。
2.3.3. プロジェクト POM を用いた JBoss Enterprise Application Platform の Maven リポジトリの設定
- Maven の設定を変更します。
- プロジェクトの POM ファイルを設定します。
pom.xml
に追加して、JBoss Enterprise Application Platform の Maven リポジトリを使用するよう特定のプロジェクトを設定する方法について説明します。この設定メソッドは、グローバル設定やユーザー設定よりも優先され、これらの設定は無視されます。
注記
- ファイルシステム
file:///path/to/repo/jboss-eap-6.0.0-maven-repository/repository
- Apache Web サーバー
http://intranet.acme.com/jboss-eap-6.0.0-maven-repository/
- Nexus リポジトリマネージャー
https://intranet.acme.com/nexus/content/repositories/jboss-eap-6.0.0-maven-repository
- テキストエディターでプロジェクトの
pom.xml
ファイルを開きます。 - 次のリポジトリ設定を追加します。既にファイルに
<repositories>
設定が存在する場合は<repository>
要素を追加します。必ず<url>
をリポジトリが実存する場所に変更するようにしてください。<repositories> <repository> <id>jboss-eap-repository-group</id> <name>JBoss EAP Maven Repository</name> <url>file:///path/to/repo/jboss-eap-6.0.0-maven-repository/repository/</url> <layout>default</layout> <releases> <enabled>true</enabled> <updatePolicy>never</updatePolicy> </releases> <snapshots> <enabled>true</enabled> <updatePolicy>never</updatePolicy> </snapshots> </repository> </repositories>
- 次のプラグインリポジトリ設定を追加します。既にファイルに
<pluginRepositories>
設定が存在する場合は<pluginRepository>
要素を追加します。<pluginRepositories> <pluginRepository> <id>jboss-eap-repository-group</id> <name>JBoss EAP Maven Repository</name> <url>file:///path/to/repo/jboss-eap-6.0.0-maven-repository/repository/</url> <releases> <enabled>true</enabled> </releases> <snapshots> <enabled>true</enabled> </snapshots> </pluginRepository> </pluginRepositories>
第3章 クラスローディングとモジュール
3.1. はじめに
3.1.1. クラスロードとモジュールの概要
3.1.3. モジュール
- 静的モジュール
- 静的モジュールは、アプリケーションサーバーの
EAP_HOME/modules/
ディレクトリで事前に定義されます。各サブディレクトリは 1 つのモジュールを表し、1 つまたは複数の JAR ファイルと設定ファイル (modules.xml
) が含まれます。モジュールの名前は、module.xml
ファイルで定義されます。アプリケーションサーバーで提供されるすべての API (Java EE API や JBoss Logging などの他の API を含む) は、静的モジュールとして提供されます。カスタム静的モジュールの作成は、同じサードパーティーライブラリを使用する同じサーバー上に多くのアプリケーションがデプロイされる場合に役立ちます。これらのライブラリを各アプリケーションとバンドルする代わりに、JBoss 管理者はこれらのライブラリが含まれるモジュールを作成およびインストールすることができます。これらのアプリケーションはカスタム静的モジュールで明示的な依存関係を宣言できます。 - 動的モジュール
- 動的モジュールは、各 JAR または WAR デプロイメント (または、EAR 内のサブデプロイメント) に対してアプリケーションサーバーによって作成およびロードされます。動的モジュールの名前は、デプロイされたアーカイブの名前から派生されます。デプロイメントはモジュールとしてロードされるため、依存関係を設定でき、他のデプロイメントは依存関係として使用することが可能です。
3.1.4. モジュールの依存関係
例3.1 モジュールの依存関係
- モジュール A がモジュール C への明示的な依存関係を宣言する場合。
- または、モジュール B がモジュール B の依存関係をモジュール C でエクスポートする場合。
3.1.5. デプロイメントでのクラスローディング
- WAR デプロイメント
- WAR デプロイメントは 1 つのモジュールとして考慮されます。
WEB-INF/lib
ディレクトリのクラスはWEB-INF/classes
ディレクトリにあるクラスと同じように処理されます。war にパッケージされているクラスはすべて、同じクラスローダーでロードされます。 - EAR デプロイメント
- EAR デプロイメントは複数のモジュールで構成されます。これらのモジュールは以下のルールに従って定義されます。
- EAR の
lib/
ディレクトリは親モジュールと呼ばれる1つのモジュールです。 - また、EAR 内の各 WAR デプロイメントは1つのモジュールです。
- 同様に、EAR 内の EJB JAR デプロイメントも 1 つのモジュールとなっています。
サブデプロイメントモジュール (EAR 内の WAR、JAR デプロイメント) は、自動的に親モジュールに依存しますが、サブデプロイメント同士が自動的に依存するわけではありません。これは、サブデプロイメントの分離 (subdeployment isolation) と呼ばれ、デプロイメントごとまたはアプリケーションサーバー全体で無効にすることができます。サブデプロイメントモジュール間の明示的な依存関係については、他のモジュールと同じ方法で追加することが可能です。
3.1.6. クラスローディングの優先順位
- 暗黙的な依存性Java EE API などの、JBoss Enterprise Application Platform 6 が自動的に追加する依存性です。こちらの依存性は、一般的な機能や JBoss Enterprise Application Platform 6 が対応する API が含まれているため、優先順位が最も高くなっています。各暗黙的依存性に関する完全な詳細情報は 「暗黙的なモジュール依存関係」 を参照してください。
- 明示的な依存性アプリケーション設定にて手動で追加される依存性です。これらの依存性は、アプリケーションの
MANIFEST.MF
ファイルや、新しくオプションで追加された JBoss の配備記述子jboss-deployment-structure.xml
ファイルを使い追加可能です。明示的な依存性の追加方法については、「デプロイメントへの明示的なモジュール依存関係の追加」 を参照してください。 - ローカルリソースデプロイメント内にパッケージ化されるクラスファイル (例:WAR ファイルの
WEB-INF/classes
あるいはWEB-INF/lib
から) - デプロイメント間の依存性EAR デプロイメントにある他のデプロイメントとの依存性のことです。これには、EAR の
lib
ディレクトリにあるクラスや他の EJB jar に定義されているクラスが含まれることがあります。
3.1.7. 動的モジュールの名前付け
- WAR および JAR ファイルのデプロイメントは次の形式で名前が付けられます。
deployment.DEPLOYMENT_NAME
例えば、inventory.war
のモジュール名はdeployment.inventory.war
となり、store.jar
のモジュール名はdeployment.store.jar
となります。 - エンタープライズアーカイブ内のサブデプロイメントは次の形式で名前が付けられます。
deployment.EAR_NAME.SUBDEPLOYMENT_NAME
例えば、エンタープライズアーカイブaccounts.ear
内にあるreports.war
のサブデプロイメントのモジュール名はdeployment.accounting.ear.reports.war
になります。
3.1.8. Jboss-deployment-structure.xml
EAP_HOME/docs/schema/jboss-deployment-structure-1_0.xsd
にあります。
3.2. デプロイメントへの明示的なモジュール依存関係の追加
前提条件
- モジュール依存関係を追加するソフトウェアプロジェクトが存在する必要があります。
- 依存関係として追加するモジュールの名前を覚えておく必要があります。JBoss Enterprise Application Platform に含まれる静的モジュールのリストは 「モジュールに含まれるもの」 を参照してください。モジュールが他のデプロイメントである場合は 「動的モジュールの名前付け」 を参照してモジュール名を判断してください。
- デプロイメントの
MANIFEST.MF
ファイルにエントリーを追加します。 jboss-deployment-structure.xml
デプロイメント記述子にエントリーを追加します。
手順3.1 MANIFEST.MF へ依存関係の設定を追加する
MANIFEST.MF
ファイルに必要な依存関係エントリを作成することができます。「Maven を使用した MANIFEST.MF エントリーの生成」 を参照してください。
MANIFEST.MF
ファイルの追加プロジェクトにMANIFEST.MF
ファイルがない場合、MANIFEST.MF
というファイルを作成します。Web アプリケーション (WAR) では、このファイル をWEB-INF
ディレクトリに追加します。EJB アーカイブ (JAR) では、META-INF
ディレクトリに追加します。依存関係エントリの追加
依存関係モジュール名をコンマで区切り、依存関係エントリーをMANIFEST.MF
ファイルへ追加します。Dependencies: org.javassist, org.apache.velocity
任意: 依存関係を任意にする
依存関係エントリーのモジュール名にoptional
を付けると、依存関係を任意にすることができます。Dependencies: org.javassist optional, org.apache.velocity
任意: 依存関係のエクスポート
依存関係エントリーのモジュール名にexport
を付けると、依存関係をエクスポートすることができます。Dependencies: org.javassist, org.apache.velocity export
手順3.2 jboss-deployment-structure.xml への依存関係設定の追加
jboss-deployment-structure.xml
の追加アプリケーションにjboss-deployment-structure.xml
ファイルが存在しない場合は、jboss-deployment-structure.xml
という新しいファイルを作成し、プロジェクトに追加します。このファイルは<jboss-deployment-structure>
がルート要素の XML ファイルです。<jboss-deployment-structure> </jboss-deployment-structure>
Web アプリケーション (WAR) では、このファイルをWEB-INF
に追加します。EJB アーカイブ (JAR) では、META-INF
ディレクトリに追加します。依存関係セクションの追加
<deployment>
要素をドキュメントルート内に作成し、その中に<dependencies>
要素を作成します。モジュール要素の追加
依存関係ノード内に各モジュール依存関係に対するモジュール要素を追加します。name
属性をモジュールの名前に設定します。<module name="org.javassist" />
任意: 依存関係を任意にする
値がTRUE
のモジュールエントリーにoptional
属性を追加すると依存関係を任意にすることができます。この属性のデフォルト値はFALSE
です。<module name="org.javassist" optional="TRUE" />
任意: 依存関係のエクスポート
値がTRUE
のモジュールエントリーにoptional
属性を追加すると依存関係を任意にすることができます。この属性のデフォルト値はFALSE
です。<module name="org.javassist" export="TRUE" />
例3.2 2 つの依存関係を持つ jboss-deployment-structure.xml
<jboss-deployment-structure> <deployment> <dependencies> <module name="org.javassist" /> <module name="org.apache.velocity" export="TRUE" /> </dependencies> </deployment> </jboss-deployment-structure>
3.3. Maven を使用した MANIFEST.MF エントリーの生成
Dependencies
エントリーを持つ MANIFEST.MF
ファイルを生成することができます。この処理により、依存関係の一覧は自動的に生成されず、pom.xml
に指定された詳細が含まれる MANIFEST.MF
ファイルのみが作成されます。
前提条件
- 作業用の Maven プロジェクトが既に存在している必要があります。
- Maven プロジェクトが JAR、EJB、WAR プラグイン (
maven-jar-plugin
、maven-ejb-plugin
、maven-war-plugin
) のいずれかを使用しなければなりません。 - プロジェクトのモジュール依存関係の名前を知っていなければなりません。JBoss Enterprise Application Platform 6 に含まれる静的モジュールの一覧は 「モジュールに含まれるもの」 を参照してください。モジュールが別のデプロイメントにある場合は 「動的モジュールの名前付け」 を参照してモジュール名を判断してください。
手順3.3 モジュール依存関係が含まれる MANIFEST.MF ファイルの生成
設定の追加
プロジェクトのpom.xml
ファイルにあるパッケージングプラグイン設定に次の設定を追加します。<configuration> <archive> <manifestEntries> <Dependencies></Dependencies> </manifestEntries> </archive> </configuration>
依存関係の一覧表示
モジュール依存関係の一覧を <Dependencies> 要素に追加します。MANIFEST.MF
に依存関係を追加する時と同じ形式を使用します。この形式に関する詳細は 「デプロイメントへの明示的なモジュール依存関係の追加」 を参照してください。<Dependencies>org.javassist, org.apache.velocity</Dependencies>
プロジェクトの構築
Maven アセンブリゴールを用いたプロジェクトの構築[Localhost ]$ mvn assembly:assembly
MANIFEST.MF
ファイルが最終アーカイブに含まれます。
例3.3 pom.xml の設定されたモジュール依存関係
<plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-war-plugin</artifactId> <configuration> <archive> <manifestEntries> <Dependencies>org.javassist, org.apache.velocity</Dependencies> </manifestEntries> </archive> </configuration> </plugin> </plugins>
3.4. モジュールが暗黙的にロードされないようにする
前提条件
- モジュール依存関係を除外するソフトウェアプロジェクトが存在する必要があります。
- 除外するモジュール名を知っている必要があります。暗黙的な依存関係のリストや状態については 「暗黙的なモジュール依存関係」 を参照してください。
手順3.4 jboss-deployment-structure.xml への依存関係除外設定の追加
- アプリケーションに
jboss-deployment-structure.xml
ファイルが存在しない場合は、jboss-deployment-structure.xml
という新しいファイルを作成し、プロジェクトに追加しあす。このファイルは<jboss-deployment-structure>
がルート要素の XML ファイルです。<jboss-deployment-structure> </jboss-deployment-structure>
Web アプリケーション (WAR) では、このファイルをWEB-INF
に追加します。EJB アーカイブ (JAR) では、META-INF
ディレクトリに追加します。 <deployment>
要素をドキュメントルート内に作成し、その中に<exclusions>
要素を作成します。<deployment> <exclusions> </exclusions> </deployment>
- exclusions 要素内で、除外される各モジュールに対して
<module>
要素を追加します。name
属性をモジュールの名前に設定します。<module name="org.javassist" />
例3.4 2 つのモジュールの除外
<jboss-deployment-structure> <deployment> <exclusions> <module name="org.javassist" /> <module name="org.dom4j" /> </exclusions> </deployment> </jboss-deployment-structure>
3.5. サブシステムをデプロイメントから除外する
ここではサブシステムをデプロイメントより除外するために必要な手順について説明します。jboss-deployment-structure.xml
設定ファイルを編集します。サブシステムの除外はサブシステムの削除と同じ影響がありますが、1 つのデプロイメントのみに適用されます。
手順3.5 サブシステムの除外
- テキストエディターで
jboss-deployment-structure.xml
ファイルを開きます。 - 次の XML を <deployment> タグの中に追加します。
<exclude-subsystems> <subsystem name="SUBSYSTEM_NAME" /> </exclude-subsystems>
jboss-deployment-structure.xml
ファイルを保存します。
サブシステムが除外されます。サブシステムのデプロイメントユニットプロセッサがデプロイメント上で実行されないようになります。
例3.5 jboss-deployment-structure.xml
ファイルの例。
<jboss-deployment-structure> <ear-subdeployments-isolated>true</ear-subdeployments-isolated> <deployment> <exclude-subsystems> <subsystem name="resteasy" /> </exclude-subsystems> <exclusions> <module name="org.javassist" /> </exclusions> <dependencies> <module name="deployment.javassist.proxy" /> <module name="deployment.myjavassist" /> <module name="myservicemodule" services="import"/> </dependencies> <resources> <resource-root path="my-library.jar" /> </resources> </deployment> <sub-deployment name="myapp.war"> <dependencies> <module name="deployment.myear.ear.myejbjar.jar" /> </dependencies> <local-last value="true" /> </sub-deployment> <module name="deployment.myjavassist" > <resources> <resource-root path="javassist.jar" > <filter> <exclude path="javassist/util/proxy" /> </filter> </resource-root> </resources> </module> <module name="deployment.javassist.proxy" > <dependencies> <module name="org.javassist" > <imports> <include path="javassist/util/proxy" /> <exclude path="/**" /> </imports> </module> </dependencies> </module> </jboss-deployment-structure>
3.6. クラスローディングとサブデプロイメント
3.6.1. エンタープライズアーカイブのモジュールおよびクラスロード
- 各 WAR および EJB JAR サブデプロイメントはモジュールです。
- EAR アーカイブのルートにある
lib/
ディレクトリの内容はモジュールです。これは、親モジュールと呼ばれます。
- WAR サブデプロイメントでは、親モジュールとすべての EJB JAR サブデプロイメントに暗黙的な依存関係が存在します。
- EJB JAR サブデプロイメントでは、親モジュールと他のすべての EJB JAR サブデプロイメントに暗黙的な依存関係が存在します。
重要
MANIFEST.MF
ファイルのClass-Path
エントリーとして明示的に宣言されない限り、移植可能なアプリケーションがお互いにアクセスできるサブデプロイメントに依存しないことが推奨されます。
3.6.2. サブデプロイメントクラスローダーの分離
3.6.3. EAR 内のサブデプロイメントクラスローダーの分離を無効化する
重要
デプロイメント記述子ファイルの追加
jboss-deployment-structure.xml
デプロイメント記述子ファイルが存在しない場合は EAR のMETA-INF
ディレクトリへ追加し、次の内容を追加します。<jboss-deployment-structure> </jboss-deployment-structure>
<ear-subdeployments-isolated>
要素の追加<ear-subdeployments-isolated>
要素が存在しない場合はjboss-deployment-structure.xml
ファイルへ追加し、内容がfalse
となるようにします。<ear-subdeployments-isolated>false</ear-subdeployments-isolated>
この EAR デプロイメントに対してサブデプロイメントクラスローダーの分離が無効になります。そのため、EAR のサブデプロイメントは WAR ではないサブデプロイメントごとに自動的な依存関係を持ちます。
3.7. 参考資料
3.7.1. 暗黙的なモジュール依存関係
表3.1 暗黙的なモジュール依存関係
サブシステム | 常に追加されるモジュール | 条件付きで追加されるモジュール | 条件 |
---|---|---|---|
コアサーバー |
|
-
|
-
|
EE サブシステム |
|
-
|
-
|
EJB3 サブシステム |
-
|
|
Java EE 6 の仕様で指定されているように、デプロイメント内の有効な場所で
ejb-jar.xml が存在するか、アノテーションベースの EJB が存在すること (例:@Stateless 、@Stateful 、@MessageDriven など)
|
JAX-RS (Resteasy) サブシステム |
|
| デプロイメント内に JAX-RS のアノテーションが存在すること |
JCA サブシステム |
|
| デプロイメントがリソースアダプター (RAR) デプロイメントの場合 |
JPA (Hibernate) サブシステム |
|
| @PersistenceUnit または @PersistenceContext アノテーションが存在するか、デプロイメント記述子に<persistence-unit-ref> または <persistence-context-ref> が存在すること |
SAR サブシステム |
-
|
| デプロイメントが SAR アーカイブであること |
セキュリティサブシステム |
|
-
|
-
|
Web サブシステム |
-
|
| デプロイメントが WAR アーカイブであること。利用されている場合は、JavaServer Faces(JSF) のみが追加されます。 |
Web サービスサブシステム |
|
-
|
-
|
Weld (CDI) サブシステム |
-
|
| beans.xml ファイルがデプロイメント内で検出された場合 |
3.7.2. モジュールに含まれるもの
asm.asm
ch.qos.cal10n
com.google.guava
com.h2database.h2
com.sun.jsf-impl
com.sun.jsf-impl
com.sun.xml.bind
com.sun.xml.messaging.saaj
gnu.getopt
javaee.api
javax.activation.api
javax.annotation.api
javax.api
javax.ejb.api
javax.el.api
javax.enterprise.api
javax.enterprise.deploy.api
javax.faces.api
javax.faces.api
javax.inject.api
javax.interceptor.api
javax.jms.api
javax.jws.api
javax.mail.api
javax.management.j2ee.api
javax.persistence.api
javax.resource.api
javax.rmi.api
javax.security.auth.message.api
javax.security.jacc.api
javax.servlet.api
javax.servlet.jsp.api
javax.servlet.jstl.api
javax.transaction.api
javax.validation.api
javax.ws.rs.api
javax.wsdl4j.api
javax.xml.bind.api
javax.xml.jaxp-provider
javax.xml.registry.api
javax.xml.rpc.api
javax.xml.soap.api
javax.xml.stream.api
javax.xml.ws.api
jline
net.sourceforge.cssparser
net.sourceforge.htmlunit
net.sourceforge.nekohtml
nu.xom
org.antlr
org.apache.ant
org.apache.commons.beanutils
org.apache.commons.cli
org.apache.commons.codec
org.apache.commons.collections
org.apache.commons.io
org.apache.commons.lang
org.apache.commons.logging
org.apache.commons.pool
org.apache.cxf
org.apache.httpcomponents
org.apache.james.mime4j
org.apache.log4j
org.apache.neethi
org.apache.santuario.xmlsec
org.apache.velocity
org.apache.ws.scout
org.apache.ws.security
org.apache.ws.xmlschema
org.apache.xalan
org.apache.xerces
org.apache.xml-resolver
org.codehaus.jackson.jackson-core-asl
org.codehaus.jackson.jackson-jaxrs
org.codehaus.jackson.jackson-mapper-asl
org.codehaus.jackson.jackson-xc
org.codehaus.woodstox
org.dom4j
org.hibernate
org.hibernate.envers
org.hibernate.infinispan
org.hibernate.validator
org.hornetq
org.hornetq.ra
org.infinispan
org.infinispan.cachestore.jdbc
org.infinispan.cachestore.remote
org.infinispan.client.hotrod
org.jacorb
org.javassist
org.jaxen
org.jboss.as.aggregate
org.jboss.as.appclient
org.jboss.as.cli
org.jboss.as.clustering.api
org.jboss.as.clustering.common
org.jboss.as.clustering.ejb3.infinispan
org.jboss.as.clustering.impl
org.jboss.as.clustering.infinispan
org.jboss.as.clustering.jgroups
org.jboss.as.clustering.service
org.jboss.as.clustering.singleton
org.jboss.as.clustering.web.infinispan
org.jboss.as.clustering.web.spi
org.jboss.as.cmp
org.jboss.as.connector
org.jboss.as.console
org.jboss.as.controller
org.jboss.as.controller-client
org.jboss.as.deployment-repository
org.jboss.as.deployment-scanner
org.jboss.as.domain-add-user
org.jboss.as.domain-http-error-context
org.jboss.as.domain-http-interface
org.jboss.as.domain-management
org.jboss.as.ee
org.jboss.as.ee.deployment
org.jboss.as.ejb3
org.jboss.as.embedded
org.jboss.as.host-controller
org.jboss.as.jacorb
org.jboss.as.jaxr
org.jboss.as.jaxrs
org.jboss.as.jdr
org.jboss.as.jmx
org.jboss.as.jpa
org.jboss.as.jpa.hibernate
org.jboss.as.jpa.hibernate
org.jboss.as.jpa.hibernate.infinispan
org.jboss.as.jpa.openjpa
org.jboss.as.jpa.spi
org.jboss.as.jpa.util
org.jboss.as.jsr77
org.jboss.as.logging
org.jboss.as.mail
org.jboss.as.management-client-content
org.jboss.as.messaging
org.jboss.as.modcluster
org.jboss.as.naming
org.jboss.as.network
org.jboss.as.osgi
org.jboss.as.platform-mbean
org.jboss.as.pojo
org.jboss.as.process-controller
org.jboss.as.protocol
org.jboss.as.remoting
org.jboss.as.sar
org.jboss.as.security
org.jboss.as.server
org.jboss.as.standalone
org.jboss.as.threads
org.jboss.as.transactions
org.jboss.as.web
org.jboss.as.webservices
org.jboss.as.webservices.server.integration
org.jboss.as.webservices.server.jaxrpc-integration
org.jboss.as.weld
org.jboss.as.xts
org.jboss.classfilewriter
org.jboss.com.sun.httpserver
org.jboss.common-core
org.jboss.dmr
org.jboss.ejb-client
org.jboss.ejb3
org.jboss.iiop-client
org.jboss.integration.ext-content
org.jboss.interceptor
org.jboss.interceptor.spi
org.jboss.invocation
org.jboss.ironjacamar.api
org.jboss.ironjacamar.impl
org.jboss.ironjacamar.jdbcadapters
org.jboss.jandex
org.jboss.jaxbintros
org.jboss.jboss-transaction-spi
org.jboss.jsfunit.core
org.jboss.jts
org.jboss.jts.integration
org.jboss.logging
org.jboss.logmanager
org.jboss.logmanager.log4j
org.jboss.marshalling
org.jboss.marshalling.river
org.jboss.metadata
org.jboss.modules
org.jboss.msc
org.jboss.netty
org.jboss.osgi.deployment
org.jboss.osgi.framework
org.jboss.osgi.resolver
org.jboss.osgi.spi
org.jboss.osgi.vfs
org.jboss.remoting3
org.jboss.resteasy.resteasy-atom-provider
org.jboss.resteasy.resteasy-cdi
org.jboss.resteasy.resteasy-jackson-provider
org.jboss.resteasy.resteasy-jaxb-provider
org.jboss.resteasy.resteasy-jaxrs
org.jboss.resteasy.resteasy-jsapi
org.jboss.resteasy.resteasy-multipart-provider
org.jboss.sasl
org.jboss.security.negotiation
org.jboss.security.xacml
org.jboss.shrinkwrap.core
org.jboss.staxmapper
org.jboss.stdio
org.jboss.threads
org.jboss.vfs
org.jboss.weld.api
org.jboss.weld.core
org.jboss.weld.spi
org.jboss.ws.api
org.jboss.ws.common
org.jboss.ws.cxf.jbossws-cxf-client
org.jboss.ws.cxf.jbossws-cxf-factories
org.jboss.ws.cxf.jbossws-cxf-server
org.jboss.ws.cxf.jbossws-cxf-transports-httpserver
org.jboss.ws.jaxws-client
org.jboss.ws.jaxws-jboss-httpserver-httpspi
org.jboss.ws.native.jbossws-native-core
org.jboss.ws.native.jbossws-native-factories
org.jboss.ws.native.jbossws-native-services
org.jboss.ws.saaj-impl
org.jboss.ws.spi
org.jboss.ws.tools.common
org.jboss.ws.tools.wsconsume
org.jboss.ws.tools.wsprovide
org.jboss.xb
org.jboss.xnio
org.jboss.xnio.nio
org.jboss.xts
org.jdom
org.jgroups
org.joda.time
org.junit
org.omg.api
org.osgi.core
org.picketbox
org.picketlink
org.python.jython.standalone
org.scannotation.scannotation
org.slf4j
org.slf4j.ext
org.slf4j.impl
org.slf4j.jcl-over-slf4j
org.w3c.css.sac
sun.jdk
3.7.3. JBoss デプロイメント構造のデプロイメント記述子のリファレンス
- 明示的なモジュール依存関係を定義する。
- 特定の暗黙的な依存関係がローディングされないようにする。
- デプロイメントのリソースより追加モジュールを定義する。
- EAR デプロイメントのサブデプロイメント分離の挙動を変更する。
- EAR のモジュールに追加のリソースルートを追加する。
第4章 開発者向けのロギング
4.1. はじめに
4.1.1. ロギング
4.1.2. JBoss LogManager でサポートされるアプリケーションロギングフレームワーク
- JBoss Logging - JBoss Enterprise Application Platform 6 に含まれています。
- Apache Commons Logging - http://commons.apache.org/logging/
- Simple Logging Facade for Java (SLF4J) - http://www.slf4j.org/
- Apache log4j - http://logging.apache.org/log4j/1.2/
- Java SE Logging (java.util.logging) - http://download.oracle.com/javase/6/docs/api/java/util/logging/package-summary.html
4.1.3. ログレベルとは
TRACE
、DEBUG
、INFO
、WARN
、ERROR
、FATAL
WARN
レベルのログハンドラーは、WARN
、ERROR
、および FATAL
のレベルのメッセージのみを記録します。
4.1.4. サポートされているログレベル
表4.1 サポートされているログレベル
ログレベル | 説明 |
---|---|
FATAL |
クリティカルなサービス障害やアプリケーションのシャットダウンをもたらしたり、JBoss Enterprise Application Platform 6 のシャットダウンを引き起こす可能性があるイベントを表示するのに使用します。
|
ERROR |
発生したエラーの中で、現在のアクティビティや要求の完了を妨げる可能性があるが、アプリケーション実行の妨げにはならないエラーを表示するのに使用します。
|
WARN |
エラーではないが、理想的とは見なされない状況を表示するのに使用します。将来的にエラーをもたらす可能性のある状況を示す場合もあります。
|
INFO |
アプリケーションの全体的な進捗状況を示すメッセージに使用します。多くの場合、アプリケーションの起動、シャットダウン、およびその他の主要なライフサイクルイベントに使用されます。
|
DEBUG |
アプリケーションの個別の要求またはアクティビティの進捗状況を表示するメッセージに使用します。
DEBUG のログメッセージは通常アプリケーションのデバッグ時のみにキャプチャーされます。
|
TRACE |
アプリケーションの実行状態に関する詳細情報を提供するメッセージに使用します。通常、
TRACE のログメッセージはアプリケーションのデバッグ時のみにキャプチャーされます。
|
4.1.5. デフォルトログファイルの場所
表4.2 スタンドアローンサーバー用デフォルトログファイル
ログファイル | 説明 |
---|---|
EAP_HOME/standalone/log/boot.log |
サーバーブートログには、サーバーの起動に関するログメッセージが含まれます。
|
EAP_HOME/standalone/log/server.log |
サーバーログには、サーバーが起動された後のすべてのログメッセージが含まれます。
|
表4.3 管理対象ドメイン用デフォルトログファイル
ログファイル | 説明 |
---|---|
EAP_HOME/domain/log/host-controller/boot.log |
ホストコントローラーブートログには、ホストコントローラーの起動に関するログメッセージが含まれます。
|
EAP_HOME/domain/log/process-controller/boot.log |
プロセスコントローラーブートログには、ホストコントローラーの起動に関するログメッセージが含まれます。
|
EAP_HOME/domain/servers/SERVERNAME/log/boot.log |
指定されたサーバーのサーバーブートログには、指定されたサーバーの起動に関するログメッセージが含まれます。
|
EAP_HOME/domain/servers/SERVERNAME/log/server.log |
指定されたサーバーのサーバーログには、指定されたサーバーが起動された後のすべてのログメッセージが含まれます。
|
4.2. JBoss ロギングフレームワークを用いたロギング
4.2.1. JBoss ロギング
4.2.2. JBoss ロギングの機能
- 革新的かつ使いやすい「型指定された」ロガーを提供します。
- 国際化およびローカリゼーションを完全サポート。翻訳者は properties ファイルのメッセージバンドルを、開発者はインターフェースやアノテーションを使い作業を行います。
- 本番用に型指定されたロガーを生成し、開発用に型指定されたロガーをランタイム生成する build-time ツール
4.2.3. JBoss ロギングを使用してアプリケーションにロギングを追加
org.jboss.jboss-logging.Logger
) を作成し、そのオブジェクトの適切なメソッドを呼び出します。このタスクは、アプリケーションにこのオブジェクトのサポートを追加するために必要な手順を示しています。
前提条件
- ビルドシステムとして Maven を使用している場合は、JBoss Maven リポジトリを含めるようプロジェクトが設定されている必要があります。「プロジェクト POM を用いた JBoss Enterprise Application Platform の Maven リポジトリの設定」 を参照してください。
- JBoss ロギング JAR ファイルがアプリケーションのビルドパスに指定されている必要があります。これを行う方法は、アプリケーションをビルドするのに JBoss Developer Studio を使用するか、Maven を使用するかによって異なります。
- JBoss Developer Studio を使用してビルドする場合、これを行うには JBoss Developer Studio メニューから [Project] -> [Properties] を選択し、[Targeted Runtimes] を選択して、JBoss Enterprise Application Platform 6 のランタイムがチェックされていることを確認します。
- Maven を使用してビルドする場合、これを行うには、次の依存性設定をプロジェクトの
pom.xml
ファイルに追加します。<dependency> <groupId>org.jboss.logging</groupId> <artifactId>jboss-logging</artifactId> <version>3.0.0.CR1</version> <scope>provided</scope> </dependency>
JAR は、JBoss Enterprise Application Platform 6 がデプロイされたアプリケーションに提供するため、ビルドされたアプリケーションに含める必要はありません。
インポートの追加
使用する JBoss Logging クラスネームスペースに対して import ステートメントを追加します。少なくとも、import org.jboss.logging.Logger
をインポートする必要があります。import org.jboss.logging.Logger;
Logger オブジェクトの作成
org.jboss.jboss-logging.Logger
のインスタンスを作成し、静的メソッドLogger.getLogger(Class)
を呼び出して初期化します。各クラスに対してこれを単一インスタンス変数として作成することが推奨されます。private static final Logger LOGGER = Logger.getLogger(HelloWorld.class);
ロギングメッセージの追加
Logger
オブジェクトのメソッドへの呼び出しを、ログメッセージを送信するコードに追加します。Logger
オブジェクトには、さまざまなタイプのメッセージに対するさまざまなパラメーターを持つさまざまなメソッドが含まれます。最も使用しやすいものは次のとおりです。debug(Object message)
info(Object message)
error(Object message)
trace(Object message)
fatal(Object message)
これらのメッセージは、対応するログレベルとmessage
パラメーターを文字列として持つログメッセージを送信します。LOGGER.error("Configuration file not found.");
JBoss ロギングメソッドの完全なリストについては、JBoss ロギング Javadoc (http://docs.jboss.org/jbosslogging/latest/) を参照してください。
例4.1 プロパティーファイルを開くときに JBoss ロギングを使用
import org.jboss.jboss-logging.Logger; public class LocalSystemConfig { private static final Logger LOGGER = Logger.getLogger(LocalSystemConfig.class); public Properties openCustomProperties(String configname) { Properties props = new Properties(); try { LOGGER.info("Loading custom configuration from "+configname); props.load(new FileInputStream(configname)); } catch(IOException e) //catch exception in case properties file does not exist { LOGGER.error("Custom configuration file ("+configname+") not found. Using defaults."); throw new CustomConfigFileNotFoundException(configname); } return props; }
第5章 国際化と現地語化
5.1. はじめに
5.2. JBoss ロギングツール
5.2.1. 概要
5.2.1.1. JBoss ロギングツールの国際化および現地語化
org.jboss.logging
アノテーションが付けられたインターフェース内でメソッド定義として作成されます。JBoss ロギングがコンパイル時にインターフェースを実装するため、インターフェースを実装する必要はありません。定義すると、これらのメソッドを使用してコードでメッセージをログに記録したり、例外オブジェクトを取得することが可能です。
5.2.1.2. JBoss ロギングツールのクイックスタート
logging-tools
には JBoss ロギングツールの機能を実証する単純な Maven プロジェクトが含まれています。このクイックスタートは本書のコード例で幅広く使用されています。
5.2.1.3. メッセージロガー
@org.jboss.logging.MessageLogger
アノテーションが付けられます。
5.2.1.4. メッセージバンドル
@org.jboss.logging.MessageBundle
アノテーションが付けられます。
5.2.1.5. 国際化されたログメッセージ
@LogMessage
と @Message
アノテーションを付ける必要があり、@Message
の値属性を使用してログメッセージを指定しなければなりません。国際化されたログメッセージはプロパティーファイルに翻訳を提供するとローカライズされます。
5.2.1.6. 国際化された例外
5.2.1.7. 国際化されたメッセージ
5.2.1.8. 翻訳プロパティーファイル
5.2.1.9. JBoss ロギングツールのプロジェクトコード
@MessageLogger
アノテーションの projectCode
属性で定義されます。
5.2.1.10. JBoss ロギングツールのメッセージ ID
@Message
アノテーションの id
属性で定義されます。
5.2.2. 国際化されたロガー、メッセージ、例外の作成
5.2.2.1. 国際化されたログメッセージの作成
logging-tools
クイックスタートを参照してください。
前提条件
- 作業用の Maven プロジェクトが既に存在している必要があります。
- JBoss ロギングツールに必要な Maven 設定がプロジェクトにある必要があります。
手順5.1 国際化されたログメッセージバンドルの作成
メッセージロガーインターフェースの作成
ログメッセージの定義が含まれるように Java インターフェースをプロジェクトに追加します。定義されるログメッセージに対し、インターフェースに記述的な名前を付けます。ログメッセージインターフェースの要件は次の通りです。@org.jboss.logging.MessageLogger
アノテーションが付けられていなければなりません。org.jboss.logging.BasicLogger
を拡張しなければなりません。- このインターフェースを実装する型付きロガーのフィールドをインターフェースが定義する必要があります。
org.jboss.logging.Logger
のgetMessageLogger()
メソッドで定義します。
package com.company.accounts.loggers; import org.jboss.logging.BasicLogger; import org.jboss.logging.Logger; import org.jboss.logging.MessageLogger; @MessageLogger interface AccountsLogger extends BasicLogger { AccountsLogger LOGGER = Logger.getMessageLogger( AccountsLogger.class, AccountsLogger.class.getPackage().getName() ); }
メソッド定義の追加
各ログメッセージのインターフェースにメソッド定義を追加します。ログメッセージに対する各メソッドに記述的な名前を付けます。各メソッドの要件は次の通りです。- メソッドは
void
を返さなければなりません。 @org.jboss.logging.LogMessage
アノテーションが付いていなければなりません。@org.jboss.logging.Message
アノテーションが付いていなければなりません。@org.jboss.logging.Message
の値属性にはデフォルトのログインメッセージが含まれます。翻訳がない場合にこのメッセージが使用されます。
@LogMessage @Message(value = "Customer query failed, Database not available.") void customerQueryFailDBClosed();
デフォルトのログレベルはINFO
です。メソッドの呼び出し
メッセージがロギングされなければならない場所にコードのインターフェースメソッドへの呼び出しを追加します。プロジェクトがコンパイルされる時にアノテーションプロセッサーがインターフェースの実装を作成するため、インターフェースの実装を作成する必要はありません。AccountsLogger.LOGGER.customerQueryFailDBClosed();
カスタムのロガーは BasicLogger よりサブクラス化されるため、BasicLogger
のロギングメソッド (debug()
やerror()
など) を使用することもできます。国際化されていないメッセージをログに記録するため他のロガーを作成する必要はありません。AccountsLogger.LOGGER.error("Invalid query syntax.");
5.2.2.2. 国際化されたメッセージの作成と使用
logging-tools
クイックスタートを参照してください。
前提条件
- JBoss Enterprise Application Platform 6 のリポジトリを使用する作業用の Maven プロジェクトが存在しなければなりません。「Maven 設定を使用した JBoss Enterprise Application Platform の Maven リポジトリの設定」 を参照してください。
- JBoss ロギングツールの必要な Maven 設定が追加されている必要があります。「JBoss ロギングツールの Maven 設定」 を参照してください。
手順5.2 国際化されたメッセージの作成と使用
例外のインターフェースを作成します。
JBoss ロギングツールはインターフェースで国際化されたメッセージを定義します。定義されるメッセージに対し、インターフェースに記述的な名前を付けます。インターフェースの要件は次の通りです。- パブリックとして宣言される必要があります。
@org.jboss.logging.MessageBundle
アノテーションが付けられていなければなりません。- インターフェースと同じ型のメッセージバンドルであるフィールドをインターフェースが定義する必要があります。
@MessageBundle public interface GreetingMessageBundle { GreetingMessageBundle MESSAGES = Messages.getBundle(GreetingMessageBundle.class); }
メソッド定義の追加
各メッセージのインターフェースにメソッド定義を追加します。メッセージに対する各メソッドに記述的な名前を付けます。各メソッドの要件は次の通りです。- 型
String
のオブジェクトを返す必要があります。 @org.jboss.logging.Message
アノテーションが付いていなければなりません。- デフォルトメッセージに
@org.jboss.logging.Message
の値属性が設定されていなければなりません。翻訳がない場合にこのメッセージが使用されます。
@Message(value = "Hello world.") String helloworldString();
メソッドの呼び出し
メッセージを取得する必要がある場所でアプリケーションのインターフェースメソッドを呼び出します。System.console.out.println(helloworldString());
5.2.2.3. 国際化された例外の作成
logging-tools-qs
クイックスタートを参照してください。
手順5.3 国際化された例外の作成と使用
JBoss ロギングツール設定の追加
JBoss ロギングツールをサポートするために必要なプロジェクト設定を追加します。「JBoss ロギングツールの Maven 設定」 を参照してください。例外のインターフェースの作成
JBoss ロギングツールはインターフェースで国際化された例外を定義します。定義される例外に対し、インターフェースに記述的な名前を付けます。インターフェースの要件は次の通りです。public
として宣言される必要があります。@org.jboss.logging.MessageBundle
アノテーションが付けられていなければなりません。- インターフェースと同じ型のメッセージバンドルであるフィールドをインターフェースが定義する必要があります。
@MessageBundle public interface ExceptionBundle { ExceptionBundle EXCEPTIONS = Messages.getBundle(ExceptionBundle.class); }
メソッド定義の追加
各例外のインターフェースにメソッド定義を追加します。例外に対する各メソッドに記述的な名前を付けます。各メソッドの要件は次の通りです。- 型
Exception
のオブジェクトまたはException
のサブタイプを返す必要があります。 @org.jboss.logging.Message
アノテーションが付いていなければなりません。- デフォルトの例外メッセージに
@org.jboss.logging.Message
の値属性が設定されていなければなりません。翻訳がない場合にこのメッセージが使用されます。 - メッセージ文字列の他にパラメータを必要とするコンストラクターが返された例外にある場合、
@Param
アノテーションを使用してこれらのパラメーターをメソッド定義に提供しなければなりません。パラメーターはコンストラクターと同じ型で同じ順番でなければなりません。
@Message(value = "The config file could not be opened.") IOException configFileAccessError(); @Message(id = 13230, value = "Date string '%s' was invalid.") ParseException dateWasInvalid(String dateString, @Param int errorOffset);
呼び出しメソッド
例外を取得する必要がある場所でコードのインターフェースメソッドを呼び出します。メソッドは例外をスローしませんが、スローできる例外オブジェクトを返します。try { propsInFile=new File(configname); props.load(new FileInputStream(propsInFile)); } catch(IOException ioex) //in case props file does not exist { throw ExceptionBundle.EXCEPTIONS.configFileAccessError(); }
5.2.3. 国際化されたロガー、メッセージ、例外の現地語化
5.2.3.1. Maven で新しい翻訳プロパティーファイルを生成する
前提条件
- 作業用の Maven プロジェクトが既に存在している必要があります。
- JBoss ロギングツールに対してプロジェクトが設定されていなければなりません。
- 国際化されたログメッセージや例外を定義する 1 つ以上のインターフェースがプロジェクトに含まれていなければなりません。
手順5.4 Maven で新しい翻訳プロパティーファイルを生成する
Maven 設定の追加
-AgenereatedTranslationFilePath
コンパイラー引数を Maven コンパイラープラグイン設定に追加し、新しいファイルが作成されるパスを割り当てます。<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>2.3.2</version> <configuration> <source>1.6</source> <target>1.6</target> <compilerArgument> -AgeneratedTranslationFilesPath=basedir}/target/generated-translation-files </compilerArgument> <showDeprecation>true</showDeprecation> </configuration> </plugin>
上記の設定は Maven プロジェクトのtarget/generated-translation-files
ディレクトリに新しいファイルを作成します。プロジェクトの構築
Maven を使用したプロジェクトの構築[Localhost]$ mvn compile
@MessageBundle
または @MessageLogger
アノテーションが付けられたインターフェースごとに 1 つのプロパティーファイルが作成されます。各インターフェースが宣言される Java パッケージに対応するサブディレクトリに新しいファイルが作成されます。
InterfaceName.i18n_locale_COUNTRY_VARIANT.properties
という構文を使用して名前が付けられます。InterfaceName
はこのファイルが生成されたインターフェースの名前になります。
5.2.3.2. 国際化されたロガーや例外、メッセージの翻訳
logging-tools
クイックスタートを参照してください。
前提条件
- 作業用の Maven プロジェクトが既に存在している必要があります。
- JBoss ロギングツールに対してプロジェクトが設定されていなければなりません。
- 国際化されたログメッセージや例外を定義する 1 つ以上のインターフェースがプロジェクトに含まれていなければなりません。
- テンプレート翻訳プロパティーファイルを生成するようプロジェクトが設定されている必要があります。
手順5.5 国際化されたロガーや例外、メッセージの翻訳
テンプレートプロパティーファイルの生成
mvn compile
コマンドを実行し、テンプレート翻訳プロパティーファイルを作成します。プロジェクトへのテンプレートファイルの追加
翻訳したいインターフェースのテンプレートを、テンプレートが作成されたディレクトリからプロジェクトのsrc/main/resources
ディレクトリへコピーします。プロパティーファイルは翻訳するインターフェースと同じパッケージに存在しなければなりません。コピーしたテンプレートファイルの名前変更
GreeterLogger.i18n_fr_FR.properties
のように、含まれる翻訳に応じてテンプレートファイルのコピーの名前を変更します。テンプレートの内容の翻訳
新しい翻訳プロパティーファイルを編集し、適切な翻訳が含まれるようにします。# Level: Logger.Level.INFO # Message: Hello message sent. logHelloMessageSent=Bonjour message envoyé.
実行された各バンドルの各翻訳に対して手順の 2、3、4 を繰り返します。
target/generated-sources/annotations/
で確認できます。
5.2.4. 国際化されたログメッセージのカスタマイズ
5.2.4.1. ログメッセージへのメッセージ IDとプロジェクトコードの追加
logging-tools-qs
クイックスタートを参照してください。
前提条件
- 国際化されたログメッセージを持つプロジェクトが存在する必要があります。「国際化されたログメッセージの作成」 を参照してください。
- 使用するプロジェクトコードを認識する必要があります。プロジェクトコードを 1 つ使用することも、各インターフェースに異なるコードを定義することも可能です。
手順5.6 メッセージ ID とプロジェクトコードをログメッセージに追加する
インターフェースのプロジェクトコードを指定します。
カスタムのロガーインターフェースに付けられる@MessageLogger
アノテーションの projectCode 属性を使用してプロジェクトコードを指定します。インターフェースに定義されるすべてのメッセージがこのプロジェクトコードを使用します。@MessageLogger(projectCode=“ACCNTS”) interface AccountsLogger extends BasicLogger { }
メッセージ ID の指定
メッセージを定義するメソッドに付けられる @Message アノテーションの id 属性を使用して各メッセージに対してメッセージ ID を指定します。@LogMessage @Message(id=43, value = "Customer query failed, Database not available.") void customerQueryFailDBClosed();
10:55:50,638 INFO [com.company.accounts.ejb] (MSC service thread 1-4) ACCNTS000043: Customer query failed, Database not available.
5.2.4.2. メッセージのログレベル設定
INFO
です。ロギングメソッドに付けられた @LogMessage
アノテーションの level
属性を用いて異なるログレベルを指定することが可能です。
手順5.7 メッセージのログレベルの指定
level 属性の指定
ログメッセージメソッド定義の@LogMessage
アノテーションにlevel
属性を追加します。ログレベルの割り当て
このメッセージに対するログレベルの値をlevel
属性に割り当てます。level
に有効な値はorg.jboss.logging.Logger.Level
に定義される 6 つの列挙定数であるDEBUG
、ERROR
、FATAL
、INFO
、TRACE
、WARN
になります。Import org.jboss.logging.Logger.Level; @LogMessage(level=Level.ERROR) @Message(value = "Customer query failed, Database not available.") void customerQueryFailDBClosed();
ERROR
レベルのログメッセージが作成されます。
10:55:50,638 ERROR [com.company.app.Main] (MSC service thread 1-4) Customer query failed, Database not available.
5.2.4.3. パラメーターによるログメッセージのカスタマイズ
手順5.8 パラメーターによるログメッセージのカスタマイズ
メソッド定義へパラメーターを追加する
すべての型のパラメーターをメソッド定義に追加することができます。型に関係なくパラメーターの String 表現がメッセージに表示されます。ログメッセージへパラメーター参照を追加する
参照は明示的なインデックスか通常のインデックスを使用できます。- 通常のインデックスを使用するには、メッセージ文字列の各パラメーターを表示したい場所に
%s
文字を挿入します。%s
の最初のインスタンスが最初のパラメーターを挿入し、2 番目のインスタンスが 3 番目のパラメーターを挿入します。 - 明示的なインデックスを使用するには、文字
%{#}
をメッセージに挿入します。# は表示したいパラメーターの数に置き換えます。
重要
例5.1 通常のインデックスを使用したメッセージパラメーター
@LogMessage(level=Logger.Level.DEBUG) @Message(id=2, value="Customer query failed, customerid:%s, user:%s") void customerLookupFailed(Long customerid, String username);
例5.2 明示的なインデックスを使用したメッセージパラメーター
@LogMessage(level=Logger.Level.DEBUG) @Message(id=2, value=“Customer query failed, customerid:%{1}, user:%{2}”) void customerLookupFailed(Long customerid, String username);
5.2.4.4. ログメッセージの原因として例外を指定する
Throwable
型とするか、サブクラスのいずれかに @Cause
アノテーションを付ける必要があります。このパラメーターを他のパラメーターのようにログメッセージで参照することはできず、ログメッセージの後に表示されます。
手順5.9 ログメッセージの原因として例外を指定する
パラメーターの追加
Throwable
型のパラメーターまたはサブクラスをメソッドに追加します。@Message(id=404, value="Loading configuration failed. Config file:%s") void loadConfigFailed(Exception ex, File file);
アノテーションの追加
パラメーターに@Cause
アノテーションを追加します。import org.jboss.logging.Cause @Message(value = "Loading configuration failed. Config file: %s") void loadConfigFailed(@Cause Exception ex, File file);
メソッドの呼び出し
コードでメソッドが呼び出されると、正しい型のオブジェクトが渡され、ログメッセージの後に表示されます。try { confFile=new File(filename); props.load(new FileInputStream(confFile)); } catch(Exception ex) //in case properties file cannot be read { ConfigLogger.LOGGER.loadConfigFailed(ex, filename); }
コードがFileNotFoundException
型の例外をスローした場合、上記コード例の出力は次のようになります。10:50:14,675 INFO [com.company.app.Main] (MSC service thread 1-3) Loading configuration failed. Config file: customised.properties java.io.FileNotFoundException: customised.properties (No such file or directory) at java.io.FileInputStream.open(Native Method) at java.io.FileInputStream.<init>(FileInputStream.java:120) at com.company.app.demo.Main.openCustomProperties(Main.java:70) at com.company.app.Main.go(Main.java:53) at com.company.app.Main.main(Main.java:43)
5.2.5. 国際化された例外のカスタマイズ
5.2.5.1. メッセージ ID とプロジェクトコードを例外メッセージに追加する
手順5.10 メッセージ ID とプロジェクトコードを例外メッセージに追加する
プロジェクトコードの指定
例外バンドルインターフェースに付けられる@MessageBundle
アノテーションのprojectCode
属性を使用してプロジェクトコードを指定します。インターフェースに定義されるすべてのメッセージがこのプロジェクトコードを使用します。@MessageBundle(projectCode=“ACCTS”) interface ExceptionBundle { ExceptionBundle EXCEPTIONS = Messages.getBundle(ExceptionBundle.class); }
メッセージ ID の指定
例外を定義するメソッドに付けられる@Message
アノテーションのid
属性を使用して各例外に対してメッセージ ID を指定します。@Message(id=143, value = "The config file could not be opened.") IOException configFileAccessError();
重要
例5.3 国際化された例外の作成
@MessageBundle(projectCode=“ACCTS”) interface ExceptionBundle { ExceptionBundle EXCEPTIONS = Messages.getBundle(ExceptionBundle.class); @Message(id=143, value = "The config file could not be opened.") IOException configFileAccessError(); }
throw configFileAccessError();
Exception in thread "main" java.io.IOException: ACCTS000143: The config file could not be opened. at com.company.accounts.Main.openCustomProperties(Main.java:78) at com.company.accounts.Main.go(Main.java:53) at com.company.accounts.Main.main(Main.java:43)
5.2.5.2. パラメーターによる例外メッセージのカスタマイズ
手順5.11 パラメーターによる例外メッセージのカスタマイズ
メソッド定義へパラメーターを追加する
すべての型のパラメーターをメソッド定義に追加することができます。型に関係なくパラメーターのString
表現がメッセージに表示されます。例外メッセージへパラメーター参照を追加する
参照は明示的なインデックスか通常のインデックスを使用できます。- 通常のインデックスを使用するには、メッセージ文字列の各パラメーターを表示したい場所に
%s
文字を挿入します。%s
の最初のインスタンスが最初のパラメーターを挿入し、2 番目のインスタンスが 3 番目のパラメーターを挿入します。 - 明示的なインデックスを使用するには、文字
%{#}
をメッセージに挿入します。#
は表示したいパラメーターの数に置き換えます。
明示的なインデックスを使用すると、メッセージのパラメーター参照の順番がメソッドで定義される順番とは異なるようになります。これは、異なるパラメーターの順番が必要な翻訳メッセージで重要になります。
重要
@Cause
アノテーションが付けられたパラメーターはパラメーターの数には含まれません。
例5.4 通常のインデックスを使用
@Message(id=143, value = "The config file %s could not be opened.") IOException configFileAccessError(File config);
例5.5 明示的なインデックスを使用
@Message(id=143, value = "The config file %{1} could not be opened.") IOException configFileAccessError(File config);
5.2.5.3. 別の例外の原因として 1 つの例外を指定する
手順5.12 別の例外の原因として 1 つの例外を指定する
パラメーターの追加
Throwable
型のパラメーターまたはサブクラスをメソッドに追加します。@Message(id=328, value = "Error calculating: %s.") ArithmeticException calculationError(Throwable cause, String msg);
アノテーションの追加
パラメーターに@Cause
アノテーションを追加します。import org.jboss.logging.Cause @Message(id=328, value = "Error calculating: %s.") ArithmeticException calculationError(@Cause Throwable cause, String msg);
メソッドの呼び出し
例外オブジェクトを取得するためインターフェースメソッドを呼び出します。キャッチした例外を原因として使用し、キャッチブロックより新しい例外をスローするのが最も一般的なユースケースになります。try { ... } catch(Exception ex) { throw ExceptionBundle.EXCEPTIONS.calculationError( ex, "calculating payment due per day"); }
例5.6 別の例外の原因として 1 つの例外を指定する
@MessageBundle(projectCode = "TPS") interface CalcExceptionBundle { CalcExceptionBundle EXCEPTIONS = Messages.getBundle(CalcExceptionBundle.class); @Message(id=328, value = "Error calculating: %s.") ArithmeticException calcError(@Cause Throwable cause, String value); }
int totalDue = 5; int daysToPay = 0; int amountPerDay; try { amountPerDay = totalDue/daysToPay; } catch (Exception ex) { throw CalcExceptionBundle.EXCEPTIONS.calcError(ex, "payments per day"); }
Exception in thread "main" java.lang.ArithmeticException: TPS000328: Error calculating: payments per day. at com.company.accounts.Main.go(Main.java:58) at com.company.accounts.Main.main(Main.java:43) Caused by: java.lang.ArithmeticException: / by zero at com.company.accounts.Main.go(Main.java:54) ... 1 more
5.2.6. 参考資料
5.2.6.1. JBoss ロギングツールの Maven 設定
pom.xml
ファイルのプロジェクトの設定を次のように変更する必要があります。
pom.xml
ファイルの例は jboss-logging-tool-qs
クイックスタートを参照してください。
- プロジェクトに対して JBoss Maven リポジトリが有効になっている必要があります。「Maven 設定を使用した JBoss Enterprise Application Platform の Maven リポジトリの設定」 を参照してください。
jboss-logging
とjboss-logging-processor
の Maven 依存関係を追加する必要があります。これらの依存関係は両方 JBoss Enterprise Application Platform 6 で使用可能であるため、各依存関係の scope 要素を次のようにprovided
に設定します。<dependency> <groupId>org.jboss.logging</groupId> <artifactId>jboss-logging-processor</artifactId> <version>1.0.0.Final</version> <scope>provided</scope> </dependency> <dependency> <groupId>org.jboss.logging</groupId> <artifactId>jboss-logging</artifactId> <version>3.1.0.GA</version> <scope>provided</scope> </dependency>
maven-compiler-plugin
のバージョンは2.2
以上である必要があり、1.6
のターゲットソースおよび生成されたソースに対して設定されていなければなりません。<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>2.3.2</version> <configuration> <source>1.6</source> <target>1.6</target> </configuration> </plugin>
5.2.6.2. 翻訳プロパティーファイルの形式
java.util.Properties
クラスのドキュメントに記載されている単純な行指向の key=value
ペア形式です。
InterfaceName.i18n_locale_COUNTRY_VARIANT.properties
InterfaceName
は翻訳が適用されるインターフェースの名前です。locale
、COUNTRY
、VARIANT
は翻訳が適用される地域設定を識別します。locale
は ISO-639 言語コードを使用して言語を指定し、COUNTRY
は ISO-3166 国名コードを使用して国を指定します。COUNTRY
は任意です。VARIANT
は特定のオペレーティングシステムやブラウザーのみに適用される翻訳を識別するために使用される任意の識別子です。
例5.7 翻訳プロパティーファイルの例
GreeterService.i18n_fr_FR_POSIX.properties
。
# Level: Logger.Level.INFO # Message: Hello message sent. logHelloMessageSent=Bonjour message envoyé.
5.2.6.3. JBoss ロギングツールのアノテーションに関する参考資料
表5.1 JBoss ロギングツールのアノテーション
アノテーション | ターゲット | 詳細 | 属性 |
---|---|---|---|
@MessageBundle | インターフェース |
インターフェースをメッセージバンドルとして定義します。
| projectCode |
@MessageLogger | インターフェース |
インターフェースをメッセージロガーとして定義します。
| projectCode |
@Message | メソッド |
メソッドが存在する場所がメッセージバンドルであるかメッセージロガーであるかによって、 現地語化されたロガーとしてメソッドを定義したり現地語化された文字列や例外を返すメソッドとして定義したりします。
| value 、 id |
@LogMessage | メソッド |
メッセージロガーのメソッドをロギングメソッドのメソッドとして定義します。
| level (デフォルトは INFO ) |
@Cause | パラメーター |
ログメッセージまたは他の例外の原因として例外を渡すパラメーターとして定義します。
| - |
@Param | パラメーター |
例外のコンストラクターへ渡されるパラメーターとして定義します。
| - |
第6章 Enterprise JavaBeans
6.1. はじめに
6.1.1. Enterprise JavaBeans の概要
6.1.2. EJB 3.1 機能セット
- セッション Bean
- メッセージ駆動型 Bean
- ノーインターフェースビュー (No-interface view)
- ローカルインターフェース
- リモートインターフェース
- JAX-WS web サービス
- JAX-RS web サービス
- タイマーサービス
- 非同期呼び出し
- インターセプター
- RMI/IIOP 相互運用性
- トランザクションサポート
- セキュリティー
- 埋め込み API
- エンティティー Bean (コンテナおよび Bean 管理の永続性)
- EJB 2.1 エンティティー Bean のクライアントビュー
- EJB クエリ言語 (EJB QL)
- JAX-RPC ベースの Web サービス (エンドポイントおよびクライアントビュー)
6.1.3. EJB 3.1 Lite
- Web アプリケーションに適切な機能のみをサポートします。
- EJB を同じ WAR ファイルで Web アプリケーションとしてデプロイできます。
6.1.4. EJB 3.1 Lite の機能
- ステートレス、ステートフル、およびシングルトンセッション Bean
- ローカルビジネスインターフェースおよび「インターフェースなし」Bean
- インターセプター
- コンテナ管理および Bean 管理トランザクション
- 宣言およびプログラミング可能なセキュリティ
- 埋め込み API
- リモートインターフェース
- RMI と IIOP の相互運用性
- JAX-WS Web サービスエンドポイント
- EJB タイマーサービス
- 非同期セッション Bean 呼び出し
- メッセージ駆動 Bean
6.1.5. エンタープライズ Bean
6.1.6. エンタープライズ Bean の書き方
6.1.7. セッション Bean ビジネスインターフェース
6.1.7.1. エンタープライズ Bean のビジネスインターフェース
6.1.7.2. EJB ローカルビジネスインターフェース
6.1.7.3. EJB リモートビジネスインターフェース
6.1.7.4. EJB のインタフェース以外の Bean
6.2. エンタープライズ Bean プロジェクトの作成
6.2.1. JBoss Developer Studio を使用した EJB アーカイブプロジェクトの作成
タスクの前提条件
- JBoss Enterprise Application Platform 6 のサーバーとサーバーランタイムが設定されている必要があります。
手順6.1 JBoss Developer Studio での EJB プロジェクトの作成
新規プロジェクトの作成
New EJB Project ウィザードを開き、[File] メニューで [New] を選択してから [EJB Project] を選択します。図6.1 New EJB Project ウィザード
詳細の指定
次の詳細を入力します。- プロジェクト名JBoss Developer Studio で表示されるプロジェクト名ですが、デプロイされた JAR ファイルのデフォルトのファイル名にもなります。
- プロジェクトの場所プロジェクトのファイルが保存されるディレクトリです。現在のワークスペースのディレクトリがデフォルトになります。
- ターゲットランタイムプロジェクトに使用されるサーバーランタイムです。デプロイするサーバーによって使用される JBoss Enterprise Application Platform 6 のランタイムと同様に設定される必要があります。
- EJB モジュールバージョン。エンタープライズ Bean が準拠する EJB 仕様のバージョンになります。Red Hat は
3.1
の使用を推奨します。 - これでプロジェクトのサポート対象機能を調整できるようになります。選択したランタイムにデフォルト設定を使用します。
[Next] をクリックして作業を継続します。Java 構築設定
この画面では、Java ソースファイルが格納されるディレクトリや構築された出力が置かれるディレクトリをカスタマイズすることが可能です。この設定は変更せずに [Next] をクリックします。EJB モジュール設定
デプロイメント記述子が必要な場合は [Generate ejb-jar.xml deployment descriptor] チェックボックスにチェックマークを付けます。EJB 3.1 ではデプロイメント記述子は任意で、必要な場合は後で追加することが可能です。[Finish] をクリックするとプロジェクトが作成され、Project Explorer に表示されます。図6.2 Project Explorer の新規作成された EJB プロジェクト
デプロイメントに対して構築アーティファクトをサーバーに追加する
サーバータブにて、構築アーティファクトをデプロイしたいサーバーを右クリックし、 [Add and Remove] ダイアログを開きます。[Add and Remove] を選択します。[Available] カラムよりデプロイするリソースを選択し、 [Add] ボタンをクリックします。リソースが [Configured] カラムに移動します。[Finish] をクリックしてダイアログを閉じます。図6.3 ダイアログの追加と削除
6.2.2. Maven における EJB アーカイブプロジェクトの作成
前提条件
- Maven が既にインストールされている必要があります。
- Maven の基本的な使用法を理解している必要があります。
手順6.2 Maven における EJB アーカイブプロジェクトの作成
Maven プロジェクトの作成
Maven のアーキタイプシステムとejb-javaee6
アーキタイプを使用して EJB プロジェクトを作成することができます。作成するには、以下のパラメーターを用いてmvn
コマンドを実行します。mvn archetype:generate -DarchetypeGroupId=org.codehaus.mojo.archetypes -DarchetypeArtifactId=ejb-javaee6
プロジェクトのgroupId
、artifactId
、version
、package
を指定するよう要求されます。[localhost]$ mvn archetype:generate -DarchetypeGroupId=org.codehaus.mojo.archetypes -DarchetypeArtifactId=ejb-javaee6 [INFO] Scanning for projects... [INFO] [INFO] ------------------------------------------------------------------------ [INFO] Building Maven Stub Project (No POM) 1 [INFO] ------------------------------------------------------------------------ [INFO] [INFO] >>> maven-archetype-plugin:2.0:generate (default-cli) @ standalone-pom >>> [INFO] [INFO] <<< maven-archetype-plugin:2.0:generate (default-cli) @ standalone-pom <<< [INFO] [INFO] --- maven-archetype-plugin:2.0:generate (default-cli) @ standalone-pom --- [INFO] Generating project in Interactive mode [INFO] Archetype [org.codehaus.mojo.archetypes:ejb-javaee6:1.5] found in catalog remote Define value for property 'groupId': : com.shinysparkly Define value for property 'artifactId': : payment-arrangments Define value for property 'version': 1.0-SNAPSHOT: : Define value for property 'package': com.shinysparkly: : Confirm properties configuration: groupId: com.company artifactId: payment-arrangments version: 1.0-SNAPSHOT package: com.company.collections Y: : [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 32.440s [INFO] Finished at: Mon Oct 31 10:11:12 EST 2011 [INFO] Final Memory: 7M/81M [INFO] ------------------------------------------------------------------------ [localhost]$
エンタープライズ Bean の追加
エンタープライズ Bean を作成し、Bean のパッケージの適切なサブディレクトリにあるsrc/main/java
ディレクトリ下のプロジェクトに追加します。プロジェクトの構築
プロジェクトを構築するには、pom.xml
ファイルと同じディレクトリでmvn package
コマンドを実行します。このコマンドを実行すると、Java クラスがコンパイルされ、JAR ファイルがパッケージ化されます。ビルドされた JAR ファイルにはartifactId-version.jar
という名前が付けられ、target/
ディレクトリに置かれます。
6.2.3. EJB プロジェクトが含まれる EAR プロジェクトの作成
作業の前提条件
- JBoss Enterprise Application Platform 6 のサーバーとサーバーランタイムが設定されている必要があります。詳細は 「JBoss Enterprise Application Platform 6 サーバーの JBoss Developer Studio への追加」 を参照してください。
手順6.3 EJB プロジェクトが含まれる EAR プロジェクトの作成
新しい EAR アプリケーションプロジェクトウィザードを開く
[File] メニューより [New]、 [Project] の順に選択すると、[New Project] ウィザードが表示されます。[Java EE/Enterprise Application Project] を選択し、Next をクリックします。図6.4 新しい EAR アプリケーションウィザード
詳細の入力
次の詳細を入力します。- プロジェクト名JBoss Developer Studio で表示されるプロジェクト名ですが、デプロイされた EAR ファイルのデフォルトのファイル名にもなります。
- プロジェクトの場所プロジェクトのファイルが保存されるディレクトリです。現在のワークスペースのディレクトリがデフォルトになります。
- ターゲットランタイムプロジェクトに使用されるサーバーランタイムです。デプロイするサーバーによって使用される JBoss Enterprise Application Platform 6 のランタイムと同様に設定される必要があります。
- EAR バージョンプロジェクトが準拠する Java Enterprise Edition 仕様のバージョンになります。Red Hat は
6
の使用を推奨します。 - これでプロジェクトのサポート対象機能を調整できるようになります。選択したランタイムにデフォルト設定を使用します。
[Next] クリックして作業を継続します。新しい EJB モジュールの追加
新しいモジュールはウィザードの Enterprise Application ページより追加することができます。次の手順に従って新しい EJB プロジェクトをモジュールとして追加します。新しい EJB モジュールの追加
[New Module] をクリックし、 [Create Default Modules] チェックボックスのチェックを外します。[Enterprise Java Bean] を選択し、[Next] をクリックすると [New EJB Project] ウィザードが表示されます。EJB プロジェクトの作成
New EJB Project ウィザードは、新しいスタンドアローン EJB プロジェクトを作成するために使用するウィザードと同じで、「JBoss Developer Studio を使用した EJB アーカイブプロジェクトの作成」 に説明されています。プロジェクト作成のために最低限必要な情報は次の通りです。- プロジェクト名
- ターゲットランタイム
- EJB モジュールのバージョン
- 設定
ウィザードの他の手順はすべて任意の手順となります。[Finish] をクリックして EJB プロジェクトの作成を完了します。
新規作成された EJB プロジェクトは Java EE モジュールの依存関係に一覧表示され、チェックボックスにチェックが付けられます。任意の作業: application.xml デプロイメント記述子の追加
必要な場合は [Generate application.xml deployment descriptor] チェックボックスにチェックを付けます。Finish のクリック
EJB プロジェクトと EAR プロジェクトの 2 つの新しいプロジェクトが表示されます。デプロイメントに対して構築アーティファクトをサーバーに追加する
[Servers] タブにて、構築アーティファクトをデプロイしたいサーバーを右クリックし、 [Add and Remove] ダイアログを開きます。[Add and Remove] を選択します。[Available] カラムよりデプロイする EAR リソースを選択し、 [Add] ボタンをクリックします。リソースが [Configured] カラムに移動します。[Finish] をクリックしてダイアログを閉じます。図6.5 ダイアログの追加と削除
6.2.4. EJB プロジェクトへのデプロイメント記述子の追加
前提条件
- EJB デプロイメント記述子を追加したい EJB プロジェクトが JBoss Developer Studio に存在している必要があります。
手順6.4 EJB プロジェクトにデプロイメント記述子を追加する
プロジェクトを開く
JBoss Developer Studio でプロジェクトを開きます。デプロイメント記述子の追加
プロジェクトビューの Deployment Descriptor フォルダーを右クリックし、[Generate Deployment Descriptor Stub] を選択します。図6.6 デプロイメント記述子の追加
ejb-jar.xml
が ejbModule/META-INF/
に作成されます。
6.3. セッション Bean
6.3.1. セッション Bean
6.3.2. ステートレスセッション Bean
6.3.3. ステートフルセッション Bean
6.3.4. シングルトンセッション Bean
6.3.5. JBoss Developer Studio のプロジェクトにセッション Bean を追加する
前提要件
- 1 つ以上のセッション Bean を追加したい EJB または動的 Web プロジェクトが JBoss Developer Studio に存在する必要があります。
手順6.5 JBoss Developer Studio のプロジェクトにセッション Bean を追加する
プロジェクトを開く
JBoss Developer Studio でプロジェクトを開きます。「Create EJB 3.x Session Bean」ウィザードを開く
[Create EJB 3.x Session Bean] ウィザードを開くには、[File] メニューへ移動し、[New] を選択してから [EJB 3.x Session Bean] を選択します。図6.7 Create EJB 3.x Session Bean ウィザード
クラス情報の指定
次の詳細を入力します。- プロジェクト正しいプロジェクトが選択されているか検証します。
- ソースホルダーJava ソースファイルが作成されるフォルダーになります。通常、変更する必要はありません。
- パッケージクラスが属するパッケージを指定します。
- クラス名セッション Bean になるクラスの名前を指定します。
- スーパークラスセッション Bean クラスはスーパークラスより継承することができます。セッションにスーパークラスがあるかどうかをここに指定します。
- ステートタイプセッション Bean のステートタイプ (ステートレス、ステートフル、シングルトン) を指定します。
- ビジネスインターフェースデフォルトでは No-interface ボックスにチェックマークが付けられているため、インターフェースは作成されません。定義したいインターフェースのボックスにチェックマークを付け、必要な場合は名前を調整します。Web アーカイブ (WAR) のエンタープライズ Bean は EJB 3.1 Lite のみをサポートするため、リモートビジネスインターフェースは含まれません。
[Next] をクリックします。セッション Bean の特定情報
ここに追加情報を入力してセッション Bean を更にカスタマイズすることが可能です。ここで情報を変更する必要はありません。変更できる項目は次の通りです。- Bean 名。
- マッピングされた名前。
- トランザクションタイプ (コンテナ管理または Bean 管理)。
- Bean が実装しなければならない追加のインターフェースを入力できます。
- 必要な場合は、EJB 2.x のホームインターフェースやコンポーネントインターフェースを指定することもできます。
完了
[Finish] をクリックすると、新しいセッション Bean が作成され、プロジェクトに追加されます。指定された場合、新しいビジネスインターフェースのファイルも作成されます。
図6.8 JBoss Developer Studio の新しいセッション Bean
6.4. メッセージ駆動型 Bean
6.4.1. メッセージ駆動型 Bean
6.4.2. リソースアダプター
6.4.3. JBoss Developer Studio に JMS ベースのメッセージ駆動型 Bean を作成する
前提条件
- JBoss Developer Studio で既存のプロジェクトが開かれていなければなりません。
- Bean がリッスンする JMS 宛先の名前とタイプを認識している必要があります。
- Bean がデプロイされる JBoss Enterprise Application Platform の設定で Java メッセージングサービス (JMS) のサポートが有効になっている必要があります。
手順6.6 JBoss Developer Studio に JMS ベースのメッセージ駆動型 Bean を追加する
[Create EJB 3.x Message-Driven Bean] ウィザードを開く
[File] → [New] → [Other] と移動します。[EJB/Message-Driven Bean (EJB 3.x)] を選択し、 [Next] ボタンをクリックします。図6.9 Create EJB 3.x Message-Driven Bean ウィザード
クラスファイルの宛先詳細の指定
Bean クラスに対して指定する詳細のセットは、プロジェクト、Java クラス、メッセージの宛先の 3 つがあります。- プロジェクト
- [Workspace] に複数のプロジェクトが存在する場合は、[Project] メニューで正しいプロジェクトが選択されるようにしてください。
- 新しい Bean のソースファイルが作成されるフォルダーは、選択されたディレクトリ下の
ejbModule
に作成されます。特定の要件がある場合のみこのフォルダーを変更します。
- Java クラス
- 必須のフィールドは [Java package] と [class name] になります。
- アプリケーションのビジネスロジックがスーパークラスを必要とする場合を除き、[Superclass] を入力する必要はありません。
- メッセージの宛先
- JMS ベースのメッセージ駆動型 Bean に提供しなければならない詳細は次の通りです。
- [Destination name]。Bean が応答するメッセージに含まれるキューまたはトピック名です。
- デフォルトでは [JMS] チェックボックスが選択されます。これは変更しないでください。
- [Destination type] を必要に応じて [Queue] または [Topic] に設定します。
[Next] ボタンをクリックします。メッセージ駆動型 Bean に固有の情報の入力
以下のデフォルト値はコンテナ管理トランザクションを使用する JMS ベースのメッセージ駆動型 Bean に適するデフォルト値となります。- Bean が Bean 管理トランザクションを使用する場合はトランザクションタイプを Bean に変更します。
- クラス名とは異なる Bean 名が必要な場合は Bean 名を変更します。
- JMS メッセージリスナーインターフェースが表示されるはずです。インターフェースがアプリケーションのビジネスロジックに固有する場合を除き、インターフェースを追加したり削除したりする必要はありません。
- メソッドスタブ作成のチェックボックスはそのまま選択された状態にしてきます。
[Finish] ボタンをクリックします。
onMessage()
メソッドによってメッセージ駆動型 Bean が作成されます。JBoss Developer Studio のエディターウィンドウが対応するファイルによって開かれます。
6.5. セッション Bean の呼び出し
6.5.1. JNDI を使用したリモートでのセッション Bean の呼び出し
remote-ejb
クイックスタートには、この機能を実証する Maven プロジェクトが含まれています。デプロイするセッション Bean のプロジェクトとリモートクライアントのプロジェクトの両方が含まれています。下記のコード例はリモートクライアントのプロジェクトから引用されています。
前提条件
- Maven プロジェクトが作成され、使用できる状態である。
- JBoss Enterprise Application Platform 6 の Maven リポジトリが既に追加されている。
- 呼び出しするセッション Bean が既にデプロイされている。
- デプロイされたセッション Bean がリモートビジネスインターフェースを実装する。
- セッション Bean のリモートビジネスインターフェースは Maven 依存関係として使用できる。リモートビジネスインターフェースが JAR ファイルとしてのみ使用できる場合は、JAR をアーティファクトとして Maven リポジトリに追加することが推奨されます。http://maven.apache.org/plugins/maven-install-plugin/usage.html にある Maven ドキュメントの
install:install-file
ゴールを参照してください。 - セッション Bean をホストするサーバーのホスト名と JNDI ポートを覚えておく必要があります。
手順6.7 セッション Bean のリモート呼び出しに対する Maven プロジェクト設定の追加
必要なプロジェクト依存関係の追加
必要な依存関係が含まれるようにするため、プロジェクトのpom.xml
を更新する必要があります。jboss-ejb-client.properties
ファイルの追加JBoss EJB クライアント API は、JNDI サービスの接続情報が含まれるjboss-ejb-client.properties
という名前のプロジェクトのルートにファイルがあることを想定します。このファイルを以下の内容と共にプロジェクトのsrc/resources/
ディレクトリに追加します。# Set this to true for SSL remote.connectionprovider.create.options.org.xnio.Options.SSL_ENABLED=false remote.connections=default # Uncomment this for SSL # remote.connection.default.connect.options.org.xnio.Options.SSL_STARTTLS=true remote.connection.default.host=localhost remote.connection.default.port = 4447 remote.connection.default.connect.options.org.xnio.Options.SASL_POLICY_NOANONYMOUS=false # Add other SASL options if required # remote.connection.default.connect.options.org.xnio.Options.SASL_POLICY_NOANONYMOUS=false # remote.connection.default.connect.options.org.xnio.Options.SASL_POLICY_NOPLAINTEXT=false # remote.connection.default.connect.options.org.xnio.Options.SASL_DISALLOWED_MECHANISMS=JBOSS-LOCAL-USER
ホスト名とポートを変更してサーバーと一致するようにします。4447
がデフォルトのポート番号です。 安全な接続の場合、SSL_ENABLED
行をtrue
に設定し、SSL_STARTTLS
行をアンコメントします。コンテナ内のリモーティングインターフェースは同じポートを使用して安全な接続と安全でない接続をサポートします。リモートビジネスインターフェースの依存関係の追加
セッション Bean のリモートビジネスインターフェースに対するpom.xml
に Maven の依存関係を追加します。<dependency> <groupId>org.jboss.as.quickstarts</groupId> <artifactId>jboss-as-ejb-remote-server-side</artifactId> <type>ejb-client</type> <version>7.1.0.CR1-SNAPSHOT</version> </dependency>
手順6.8 JNDI を使用して Bean プロキシを取得し、Bean のメソッドを呼び出す
チェック例外の処理
次のコードに使用されるメソッドの 2 つ (InitialContext()
およびlookup()
) は、タイプjavax.naming.NamingException
のチェック例外を持っています。これらのメソッド呼び出しはNamingException
をキャッチする try/catch ブロックか、NamingException
のスローが宣言されたメソッドで囲まなければなりません。remote-ejb
クイックスタートではNamingException
のスローが宣言されたメソッドで囲む方法を使用します。JNDI コンテキストの作成
JNDI コンテキストオブジェクトはサーバーよりリソースを要求するメカニズムを提供します。次のコードを使用して JNDI コンテキストを作成します。final Hashtable jndiProperties = new Hashtable(); jndiProperties.put(Context.URL_PKG_PREFIXES, "org.jboss.ejb.client.naming"); final Context context = new InitialContext(jndiProperties);
JNDI サービスの接続プロパティーはjboss-ejb-client.properties
ファイルより読み取られます。JNDI コンテキストの lookup() メソッドを使用した Bean プロキシの取得
Bean プロキシのlookup()
メソッドを呼び出し、必要なセッション Bean の JNDI 名 へ渡します。これにより、呼び出したいメソッドが含まれるリモートビジネスインターフェースのタイプへキャストされなければならないオブジェクトが返されます。final RemoteCalculator statelessRemoteCalculator = (RemoteCalculator) context.lookup( "ejb:/jboss-as-ejb-remote-app/CalculatorBean!" + RemoteCalculator.class.getName() );
セッション Bean の JNDI 名は特別な構文によって定義されます。呼び出しメソッド
プロキシ Bean オブジェクトを取得したため、リモートビジネスインターフェースに含まれるすべてのメソッドを呼び出しすることができます。int a = 204; int b = 340; System.out.println("Adding " + a + " and " + b + " via the remote stateless calculator deployed on the server"); int sum = statelessRemoteCalculator.add(a, b); System.out.println("Remote calculator returned sum = " + sum);
メソッド呼び出し要求が実行されるサーバー上で、プロキシ Bean がメソッド呼び出し要求をセッション Bean へ渡します。結果はプロキシ Bean へ返され、プロキシ Bean によって結果が呼び出し側へ返されます。プロキシ Bean とリモートセッション Bean 間の通信は呼び出し側に透過的です。
6.6. クラスター化された Enterprise JavaBeans
6.6.1. EJB3 クラスタリング
6.7. 参考資料
6.7.1. EJB JNDI の名前に関する参考資料
ejb:<appName>/<moduleName>/<distinctName>/<beanName>!<viewClassName>?stateful
<appName>
- セッション Bean の JAR ファイルがエンタープライズアーカイブ (EAR) 内にデプロイされた場合、EAR の名前になります。デフォルトでは、ファイル名から
.ear
サフィックスを除いたものが EAR の名前になります。また、アプリケーション名をapplication.xml
ファイルで上書きすることも可能です。セッション Bean が EAR にデプロイされていない場合は空白のままにしておきます。 <moduleName>
- モジュール名はセッション Bean がデプロイされた JAR ファイルの名前になります。デフォルトでは、ファイル名から
.jar
サフィックスを除いたものが JAR ファイルの名前になります。また、モジュール名を JAR のejb-jar.xml
ファイルで上書きすることも可能です。 <distinctName>
- JBoss Enterprise Application Platform 6 では、各デプロイメントが任意の個別名を指定することができます。デプロイメントの個別名がない場合は空白のままにしておきます。
<beanName>
- Bean 名は呼び出されるセッション Bean のクラス名です。
<viewClassName>
- ビュークラス名はリモートインターフェースの完全修飾クラス名です。インターフェースのパッケージ名が含まれます。
?stateful
- JNDI 名がステートフルセッション Bean を参照する時に
?stateful
サフィックスが必要となります。他の Bean タイプでは含まれていません。
6.7.2. EJB 参照の解決
@EJB
や @Resource
を実装する方法について説明します。XML は常にアノテーションを上書きしますが、同じルールが適用されることに注意してください。
@EJB アノテーションのルール
@EJB
アノテーションはmappedName()
属性を持っています。仕様はこのベンダー固有のメタデータを無視しますが、 JBoss は参照しているEJBのグローバル JNDI 名としてmappedName()
を認識します。mappedName()
を指定した場合、他の属性はすべて無視され、このグローバル JNDI 名がバインディングに使用されます。- 以下のように属性を定義せずに
@EJB
を指定するとします。@EJB ProcessPayment myEjbref;
この場合、次のルールが適用されます。- 参照する Bean の EJB jar が、
@EJB
挿入に使用されるインターフェースを持つ EJB に対して検索されます。同じビジネスインターフェースをパブリッシュする EJB が複数ある場合、例外がスローされます。インターフェースを持つ Bean が 1 つのみである場合はその Bean が使用されます。 - そのインターフェースをパブリッシュする EJB に対する EAR を検索します。複製がある場合は例外がスローされます。それ以外の場合は、一致する Bean が返されます。
- JBoss でそのインターフェースの EJB に対してグローバルに検索が行われます。ここでも複製があると例外がスローされます。
@EJB.beanName()
は<ejb-link>
に対応します。beanName()
が定義されている場合、属性が定義されていない@EJB
として同じアルゴリズムが使用されますが、検索でbeanName()
がキーとして使用されます。ejb-link の # 構文を使用する場合、このルールの例外となります。# 構文は、参照する EJB が存在する EAR の jar への相対パスを指定できるようにします。詳細は EJB 3.1 仕様を参照してください。
6.7.3. リモート EJB クライアントのプロジェクト依存関係
表6.1 リモート EJB クライアントに対する Maven の依存関係
GroupID | ArtifactID | バージョン |
---|---|---|
org.jboss.spec | jboss-javaee-web-6.0 | 2.0.0.Final |
org.jboss.spec.javax.transaction | jboss-transaction-api_1.1_spec | - |
org.jboss.spec.javax.ejb | jboss-ejb-api_3.1_spec | - |
org.jboss | jboss-ejb-client | 1.0.0.Beta9 |
org.jboss.xnio | xnio-api | 3.0.0.CR5 |
org.jboss.xnio | xnio-nio | 3.0.0.CR5 |
org.jboss.remoting3 | jboss-remoting | 3.2.0.CR6 |
org.jboss.sasl | jboss-sasl | 1.0.0.Beta9 |
org.jboss.marshalling | jboss-marshalling-river | 1.3.0.GA |
jboss-javaee-web-6.0
を除き、これらの依存関係は pom.xml ファイルの <dependencies>
セクションに追加する必要があります。jboss-javaee-web-6.0
の依存関係は import
のスコープと共に pom.xml
の <dependencyManagement>
セクションに追加する必要があります。これにより、Java EE 6 API の完全セットに対する依存関係が含まれるようになります。
<dependencyManagement> <dependencies> <dependency> <groupId>org.jboss.spec</groupId> <artifactId>jboss-javaee-web-6.0</artifactId> <version>2.0.0.Final</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>
remote-ejb/client/pom.xml
を参照してください。
6.7.4. jboss-ejb3.xml デプロイメント記述子に関する参考文書
jboss-ejb3.xml
は EJB JAR または WAR アーカイブで使用できるカスタムのデプロイメント記述子です。EJB JAR アーカイブでは META-INF/
ディレクトリ、WAR アーカイブでは WEB-INF/
ディレクトリにある必要があります。
ejb-jar.xml
に似ていて、同じ名前空間を一部使用し、他の名前空間を一部提供します。jboss-ejb3.xml
の内容は ejb-jar.xml
の内容と結合されますが、jboss-ejb3.xml
の項目の方が優先されます。
jboss-ejb3.xml
によって使用される非標準の名前空間のみ取り上げます。標準的な名前空間については http://java.sun.com/xml/ns/javaee/ のドキュメントを参照してください。
http://www.jboss.com/xml/ns/javaee
です。
アセンブリ記述子の名前空間
<assembly-descriptor>
要素で使用されます。これらの名前空間の設定を 1 つの Bean に適用したり、 \*
を ejb-name
として使用してデプロイメントのすべての Bean に対して適用するために使用されます。
- クラスタリング名前空間:
urn:clustering:1.0
xmlns:c="urn:clustering:1.0"
これにより、EJB がクラスター化されているとマーク付けすることができます。これは@org.jboss.ejb3.annotation.Clustered
に相当するデプロイメント記述子です。<c:clustering> <ejb-name>DDBasedClusteredSFSB</ejb-name> <c:clustered>true</c:clustered> </c:clustering>
- セキュリティー名前空間 (
urn:security
) xmlns:s="urn:security"
これにより、EJB のセキュリティードメインと run-as プリンシパルを設定できます。<s:security> <ejb-name>*</ejb-name> <s:security-domain>myDomain</s:security-domain> <s:run-as-principal>myPrincipal</s:run-as-principal> </s:security>
- リソースアダプター名前空間:
urn:resource-adapter-binding
xmlns:r="urn:resource-adapter-binding"
これにより、メッセージ駆動 Bean にリソースアダプターを設定できます。<r:resource-adapter-binding> <ejb-name>*</ejb-name> <r:resource-adapter-name>myResourceAdaptor</r:resource-adapter-name> </r:resource-adapter-binding>
- IIOP 名前空間:
urn:iiop
xmlns:u="urn:iiop"
IIOP 名前空間には IIOP が設定されます。- プール名前空間:
urn:ejb-pool:1.0
xmlns:p="urn:ejb-pool:1.0"
これにより、含まれるステートレスセッション Bean やメッセージ駆動 Bean によって使用されるプールを選択できます。プールはサーバー設定で定義されます。<p:pool> <ejb-name>*</ejb-name> <p:bean-instance-pool-ref>my-pool</p:bean-instance-pool-ref> </p:pool>
- キャッシュ名前空間:
urn:ejb-cache:1.0
xmlns:c="urn:ejb-cache:1.0"
これにより、含まれるステートフルセッション Bean によって使用されるキャッシュを選択できます。キャッシュはサーバー設定で定義されます。<c:cache> <ejb-name>*</ejb-name> <c:cache-ref>my-cache</c:cache-ref> </c:cache>
例6.1 jboss-ejb3.xml ファイルの例
<jboss:ejb-jar xmlns:jboss="http://www.jboss.com/xml/ns/javaee" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:c="urn:clustering:1.0" xsi:schemaLocation="http://www.jboss.com/xml/ns/javaee http://www.jboss.org/j2ee/schema/jboss-ejb3-2_0.xsd http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/ejb-jar_3_1.xsd" version="3.1" impl-version="2.0"> <enterprise-beans> <message-driven> <ejb-name>ReplyingMDB</ejb-name> <ejb-class>org.jboss.as.test.integration.ejb.mdb.messagedestination.ReplyingMDB</ejb-class> <activation-config> <activation-config-property> <activation-config-property-name>destination</activation-config-property-name> <activation-config-property-value>java:jboss/mdbtest/messageDestinationQueue </activation-config-property-value> </activation-config-property> </activation-config> </message-driven> </enterprise-beans> <assembly-descriptor> <c:clustering> <ejb-name>DDBasedClusteredSFSB</ejb-name> <c:clustered>true</c:clustered> </c:clustering> </assembly-descriptor> </jboss:ejb-jar>
第7章 Web アプリケーションのクラスター化
7.1. セッションレプリケーション
7.1.1. セッションレプリケーション
7.1.2. [en-US] About the Web Session Cache
standalone-ha.xml
profile, or the managed domain profiles ha
or full-ha
. The most commonly configured elements are the cache mode and the number of cache owners for a distributed cache.
The cache mode can either be REPL
(the default) or DIST
.
- REPL
- The
REPL
mode replicates the entire cache to every other node in the cluster. This is the safest option, but introduces more overhead. - DIST
- The
DIST
mode is similar to the buddy mode provided in previous implementations. It reduces overhead by distributing the cache to the number of nodes specified in theowners
parameter. This number of owners defaults to2
.
The owners
parameter controls how many cluster nodes hold replicated copies of the session. The default is 2
.
7.1.3. [en-US] Configure the Web Session Cache
REPL
. If you wish to use DIST
mode, run the following two commands in the Management CLI. If you use a different profile, change the profile name in the commands. If you use a standalone server, remove the /profile=ha
portion of the commands.
手順7.1 Configure the Web Session Cache
Change the default cache mode to
DIST
./profile=ha/subsystem=infinispan/cache-container=web/:write-attribute(name=default-cache,value=dist)
Set the number of owners for a distributed cache.
The following command sets5
owners. The default is2
./profile=ha/subsystem=infinispan/cache-container=web/distributed-cache=dist/:write-attribute(name=owners,value=5)
Change the default cache mode back to
REPL
./profile=ha/subsystem=infinispan/cache-container=web/:write-attribute(name=default-cache,value=repl)
Restart the Server
After changing the web cache mode, you must restart the server.
Your server is configured for session replication. To use session replication in your own applications, refer to the following topic: 「アプリケーションにおけるセッションレプリケーションの有効化」.
7.1.4. アプリケーションにおけるセッションレプリケーションの有効化
Enterprise Application Platform の高可用性 (HA) 機能を利用するには、アプリケーションが配布可能になるよう設定する必要があります。ここでは配布可能にする手順を説明した後、使用可能な高度な設定オプションの一部について解説します。
手順7.2 タスク
要件: アプリケーションが配布可能であることを示します。
アプリケーションが配布可能になっていないとセッションが配布されません。アプリケーションのweb.xml
記述子ファイルの<web-app>
タグ内に<distributable />
要素を追加します。例は次の通りです。例7.1 配布可能なアプリケーションの最低限の設定
<web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" version="2.4"> <distributable/> </web-app>
希望する場合はデフォルトのレプリケーション動作を変更します。
セッションレプリケーションに影響する値を変更したい場合は、<jboss-web>
要素の子要素である<replication-config>
要素内で値を上書きします。デフォルトを上書きしたい場合のみ指定の要素が含まれるようにします。以下の例に、全デフォルト設定の一覧と、最も一般的に変更されるオプションを説明する表を示します。例7.2 デフォルトの
<replication-config>
値<jboss-web> <replication-config> <cache-name>custom-session-cache</cache-name> <replication-trigger>SET</replication-trigger> <replication-granularity>ATTRIBUTE</replication-granularity> <replication-field-batch-mode>true</replication-field-batch-mode> <use-jk>false</use-jk> <max-unreplicated-interval>30</max-unreplicated-interval> <snapshot-mode>INSTANT</snapshot-mode> <snapshot-interval>1000</snapshot-interval> <session-notification-policy>com.example.CustomSessionNotificationPolicy</session-notification-policy> </replication-config> </jboss-web>
表7.1 セッションレプリケーションの一般的なオプション
オプション
|
詳細
|
---|---|
<replication-trigger>
|
クラスター全体でセッションデータのレプリケーションが引き起こされるのはどのような状態であるか制御します。セッション属性として保存された可変オブジェクトがセッションからアクセスされた後、メソッド
setAttribute() が直接呼び出されない限り、オブジェクトが変更されレプリケーションが必要であるかをコンテナは明確に認識できないため、このオプションは必須となります。
設定に関係なく、
setAttribute() を呼び出すと常にセッションレプリケーションが引き起こされます。
|
<replication-granularity>
|
レプリケートされるデータの細かさを決定します。デフォルトは
SESSION ですが、ATTRIBUTE を設定すると、ほとんどの属性は変更されずにセッションのパフォーマンスを向上することができます。
|
表7.2 セッションレプリケーションの変更が稀なオプション
オプション
|
詳細
|
---|---|
<useJK>
| mod_cluster や mod_jk 、mod_proxy などのロードバランサーの使用を前提とするか指定します。デフォルトは false です。 true に設定すると、各要求に関連付けられているセッション ID がコンテナによって確認され、フェイルオーバーが発生するとセッション ID の jvmRoute の部分が置き換えられます。
|
<max-unreplicated-interval>
|
セッションのタイムスタンプのレプリケーションがトリガーされるまで、セッション後に待機する最大間隔 (秒単位) になります。変更がないと判断された場合でも適用されます。これにより、各セッションのタイムスタンプがクラスターノードによって認識されるようにし、フェイルオーバー中にレプリケートされなかったセッションが誤って期限切れにならないようにします。また、フェイルオーバー中に
HttpSession.getLastAccessedTime() への呼び出しに対する正しい値を信頼できるようにします。
デフォルトでは値は指定されません。値が指定されないと、コンテナの
jvmRoute 設定が JK フェイルオーバーが使用されているかを判断します。 0 を設定すると、セッションがアクセスされるたびにタイムスタンプがレプリケートされます。-1 を設定すると、要求中の他のアクティビティがレプリケーションをトリガーした場合のみタイムスタンプがレプリケートされます。 HttpSession.getMaxInactiveInterval() よりも大きい正の値を設定すると設定ミスとして扱われ、0 に変換されます。
|
<snapshot-mode>
|
セッションが他のノードへレプリケートされるタイミングを指定します。デフォルトは
INSTANT で、INTERVAL を使用することも可能です。
INSTANT モードでは要求処理スレッドが使用され、変更は要求の最後にレプリケートされます。<snapshot-interval> オプションは無視されます。
INTERVAL モードでは、バックグラウンドタスクは <snapshot-interval> によって指定される間隔で実行され、変更されたセッションがレプリケートされます。
|
<snapshot-interval>
| INTERVAL が <snapshot-mode> の値として使用された時に、変更されたセッションがレプリケートされる間隔 (ミリ秒単位) になります。
|
<session-notification-policy>
|
インターフェース
ClusteredSessionNotificationPolicy の実装の完全修飾クラス名です。登録された HttpSessionListener 、HttpSessionAttributeListener 、 HttpSessionBindingListener へサーブレット仕様の通知が発信されたかどうかを管理します。
|
7.2. HttpSession の非活性化および活性化
7.2.1. HttpSession のパッシベーションとアクティベーション
- コンテナが新規セッションの作成を要求する時に現在アクティブなセッションの数が設定上限を越えている場合、サーバーはセッションの一部をパッシベートして新規セッションを作成できるようにします。
- 設定された間隔で、定期的にバックグラウンドタスクがセッションをパッシベートすべきかチェックします。
- ある Web アプリケーションがデプロイされ、他のサーバーでアクティブなセッションのバックアップコピーが、新たにデプロイする Web アプリケーションのセッションマネージャーによって取得された場合、セッションはパッシベートされることがあります。
- セッションが設定した最大アイドル時間以上に利用されていない。
- アクティブなセッションの数が設定上限を越えず、セッションがアイドル時間の設定下限を超えていない。
7.2.2. アプリケーションにおける HttpSession パッシベーションの設定
HttpSession パッシベーションはアプリケーションの WEB_INF/jboss-web.xml
ファイルまたは META_INF/jboss-web.xml
ファイルで設定されます。
例7.3 jboss-web.xml
ファイルの例
<jboss-web> <max-active-sessions>20</max-active-sessions> <passivation-config> <use-session-passivation>true</use-session-passivation> <passivation-min-idle-time>60</passivation-min-idle-time> <passivation-max-idle-time>600</passivation-max-idle-time> </passivation-config> </jboss-web>
パッシベーション設定要素
<max-active-sessions>
- 許可されるアクティブセッションの最大数です。パッシベーションが有効になっている場合、セッションマネージャーによって管理されるセッション数がこの値を越えると、設定された
<passivation-min-idle-time>
を基に過剰なセッションがパッシベートされます。それでもアクティブセッションの数が制限を越える場合は、新しいセッションの作成に失敗します。デフォルト値は-1
で、アクティブセッションの最大数は制限されません。 <passivation-config>
- この要素は、子要素などの残りのパッシベーション設定パラメーターを保持します。
<passivation-config>
子要素
<use-session-passivation>
- セッションパッシベーションを使用するかどうか。デフォルト値は
false
です。 <passivation-min-idle-time>
- アクティブなセッションの数を減らし max-active-sessions によって定義された値に従うため、コンテナがパッシベーションの実行を考慮する前にセッションが非アクティブでなければならない最小期間。デフォルト値は
-1
で、<passivation-max-idle-time>
が経過する前のセッションのパッシベートを無効にします。<max-active-sessions>
が設定されている場合、-1 や大きな値は推奨されません。 <passivation-max-idle-time>
- メモリーを節約するため、コンテナがパッシベーションを実行しようとする前にセッションが非アクティブにならなければならない最大期間。アクティブセッションの数が
<max-active-sessions>
を越えるかどうかに関係なく、このようなセッションのパッシベーションは実行されます。この値はweb.xml
の<session-timeout>
設定よりも小さい値とする必要があります。デフォルト値は-1
で、非アクティブとなる最大期間を基にしたパッシベーションを無効にします。
注記
<max-active-sessions>
を設定してください。また、他のノードからレプリケートされるセッションの数は、バディーレプリケーションが有効になっているかどうかによっても左右されます。
numBuddies
にデフォルトの 1
が設定されている場合、各ノードはメモリーに 200 のセッションを保存します。
7.3. クッキードメイン
7.3.1. クッキードメイン
/
です。これは、発行ホストのみがクッキーの内容を読み取ることができます。特定のクッキードメインを設定すると、さまざまなホストがクッキーの内容を読み取ることができるようになります。クッキードメインの設定は 「クッキードメインの設定」 を参照してください。
7.3.2. クッキードメインの設定
http://app1.xyz.com
および http://app2.xyz.com
上のアプリケーションが SSO コンテキストを共有できるようにします。
例7.4 クッキードメインの設定例
<Valve className="org.jboss.web.tomcat.service.sso.ClusteredSingleSignOn" cookieDomain="xyz.com" />
7.4. HA シングルトンの実装
JBoss Enterprise Application Platform 5 では、HA シングルトンアーカイブは他のデプロイメントとは別に deploy-hasingleton/
ディレクトリにデプロイされていました。これは自動デプロイメントが発生しないようにするためで、また確実に HASingletonDeployer サービスがデプロイメントを制御し、クラスターのマスターノードのみにアーカイブがデプロイされるようにするための処置でした。ホットデプロイメント機能がなかったため、再デプロイメントにはサーバーの再起動が必要でした。また、マスターノードに障害が発生し、他のノードがマスターとして引き継ぐ必要がある場合、シングルトンサービスはサービスを提供するためデプロイメントプロセス全体を実行する必要がありました。
手順7.3 HA シングルトンサービスの実装
HA シングルトンサービスアプリケーションの作成
シングルトンサービスとしてデプロイされる SingletonService デコレーターでラッピングされたサービスの簡単な例は次の通りです。シングルトンサービスを作成します。
package com.mycompany.hasingleton.service.ejb; import java.util.concurrent.atomic.AtomicBoolean; import java.util.logging.Logger; import org.jboss.as.server.ServerEnvironment; import org.jboss.msc.inject.Injector; import org.jboss.msc.service.Service; import org.jboss.msc.service.ServiceName; import org.jboss.msc.service.StartContext; import org.jboss.msc.service.StartException; import org.jboss.msc.service.StopContext; import org.jboss.msc.value.InjectedValue; /** * @author <a href="mailto:wfink@redhat.com">Wolf-Dieter Fink</a> */ public class EnvironmentService implements Service<String> { private static final Logger LOGGER = Logger.getLogger(EnvironmentService.class.getCanonicalName()); public static final ServiceName SINGLETON_SERVICE_NAME = ServiceName.JBOSS.append("quickstart", "ha", "singleton"); /** * A flag whether the service is started. */ private final AtomicBoolean started = new AtomicBoolean(false); private String nodeName; private final InjectedValue<ServerEnvironment> env = new InjectedValue<ServerEnvironment>(); public Injector<ServerEnvironment> getEnvInjector() { return this.env; } /** * @return the name of the server node */ public String getValue() throws IllegalStateException, IllegalArgumentException { if (!started.get()) { throw new IllegalStateException("The service '" + this.getClass().getName() + "' is not ready!"); } return this.nodeName; } public void start(StartContext arg0) throws StartException { if (!started.compareAndSet(false, true)) { throw new StartException("The service is still started!"); } LOGGER.info("Start service '" + this.getClass().getName() + "'"); this.nodeName = this.env.getValue().getNodeName(); } public void stop(StopContext arg0) { if (!started.compareAndSet(true, false)) { LOGGER.warning("The service '" + this.getClass().getName() + "' is not active!"); } else { LOGGER.info("Stop service '" + this.getClass().getName() + "'"); } } }
- サーバー起動時にサービスを SingletonService として開始するシングルトン EJB を作成します。
package com.mycompany.hasingleton.service.ejb; import java.util.Collection; import java.util.EnumSet; import javax.annotation.PostConstruct; import javax.annotation.PreDestroy; import javax.ejb.Singleton; import javax.ejb.Startup; import org.jboss.as.clustering.singleton.SingletonService; import org.jboss.as.server.CurrentServiceContainer; import org.jboss.as.server.ServerEnvironment; import org.jboss.as.server.ServerEnvironmentService; import org.jboss.msc.service.AbstractServiceListener; import org.jboss.msc.service.ServiceController; import org.jboss.msc.service.ServiceController.Transition; import org.jboss.msc.service.ServiceListener; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * A Singleton EJB to create the SingletonService during startup. * * @author <a href="mailto:wfink@redhat.com">Wolf-Dieter Fink</a> */ @Singleton @Startup public class StartupSingleton { private static final Logger LOGGER = LoggerFactory.getLogger(StartupSingleton.class); /** * Create the Service and wait until it is started.<br/> * Will log a message if the service will not start in 10sec. */ @PostConstruct protected void startup() { LOGGER.info("StartupSingleton will be initialized!"); EnvironmentService service = new EnvironmentService(); SingletonService<String> singleton = new SingletonService<String>(service, EnvironmentService.SINGLETON_SERVICE_NAME); // if there is a node where the Singleton should deployed the election policy might set, // otherwise the JGroups coordinator will start it //singleton.setElectionPolicy(new PreferredSingletonElectionPolicy(new NamePreference("node2/cluster"), new SimpleSingletonElectionPolicy())); ServiceController<String> controller = singleton.build(CurrentServiceContainer.getServiceContainer()) .addDependency(ServerEnvironmentService.SERVICE_NAME, ServerEnvironment.class, service.getEnvInjector()) .install(); controller.setMode(ServiceController.Mode.ACTIVE); try { wait(controller, EnumSet.of(ServiceController.State.DOWN, ServiceController.State.STARTING), ServiceController.State.UP); LOGGER.info("StartupSingleton has started the Service"); } catch (IllegalStateException e) { LOGGER.warn("Singleton Service {} not started, are you sure to start in a cluster (HA) environment?",EnvironmentService.SINGLETON_SERVICE_NAME); } } /** * Remove the service during undeploy or shutdown */ @PreDestroy protected void destroy() { LOGGER.info("StartupSingleton will be removed!"); ServiceController<?> controller = CurrentServiceContainer.getServiceContainer().getRequiredService(EnvironmentService.SINGLETON_SERVICE_NAME); controller.setMode(ServiceController.Mode.REMOVE); try { wait(controller, EnumSet.of(ServiceController.State.UP, ServiceController.State.STOPPING, ServiceController.State.DOWN), ServiceController.State.REMOVED); } catch (IllegalStateException e) { LOGGER.warn("Singleton Service {} has not be stopped correctly!",EnvironmentService.SINGLETON_SERVICE_NAME); } } private static <T> void wait(ServiceController<T> controller, Collection<ServiceController.State> expectedStates, ServiceController.State targetState) { if (controller.getState() != targetState) { ServiceListener<T> listener = new NotifyingServiceListener<T>(); controller.addListener(listener); try { synchronized (controller) { int maxRetry = 2; while (expectedStates.contains(controller.getState()) && maxRetry > 0) { LOGGER.info("Service controller state is {}, waiting for transition to {}", new Object[] {controller.getState(), targetState}); controller.wait(5000); maxRetry--; } } } catch (InterruptedException e) { LOGGER.warn("Wait on startup is interrupted!"); Thread.currentThread().interrupt(); } controller.removeListener(listener); ServiceController.State state = controller.getState(); LOGGER.info("Service controller state is now {}",state); if (state != targetState) { throw new IllegalStateException(String.format("Failed to wait for state to transition to %s. Current state is %s", targetState, state), controller.getStartException()); } } } private static class NotifyingServiceListener<T> extends AbstractServiceListener<T> { @Override public void transition(ServiceController<? extends T> controller, Transition transition) { synchronized (controller) { controller.notify(); } } } }
クライアントよりサービスへアクセスするためステートレスセッション Bean を作成します。
package com.mycompany.hasingleton.service.ejb; import javax.ejb.Stateless; import org.jboss.as.server.CurrentServiceContainer; import org.jboss.msc.service.ServiceController; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * A simple SLSB to access the internal SingletonService. * * @author <a href="mailto:wfink@redhat.com">Wolf-Dieter Fink</a> */ @Stateless public class ServiceAccessBean implements ServiceAccess { private static final Logger LOGGER = LoggerFactory.getLogger(ServiceAccessBean.class); public String getNodeNameOfService() { LOGGER.info("getNodeNameOfService() is called()"); ServiceController<?> service = CurrentServiceContainer.getServiceContainer().getService( EnvironmentService.SINGLETON_SERVICE_NAME); LOGGER.debug("SERVICE {}", service); if (service != null) { return (String) service.getValue(); } else { throw new IllegalStateException("Service '" + EnvironmentService.SINGLETON_SERVICE_NAME + "' not found!"); } } }
SingletonService のビジネスロジックインターフェースを作成します。
package com.mycompany.hasingleton.service.ejb; import javax.ejb.Remote; /** * Business interface to access the SingletonService via this EJB * * @author <a href="mailto:wfink@redhat.com">Wolf-Dieter Fink</a> */ @Remote public interface ServiceAccess { public abstract String getNodeNameOfService(); }
クラスタリングが有効な状態で各 Jboss Enterprise Application Platform 6 インスタンスを起動する
クラスターを有効化する方法は、サーバーがスタンドアローンであるか管理ドメインで実行されているかによって異なります。管理ドメインで実行されているサーバーに対してクラスタリングを有効にする
ドメインコントローラーを使用して起動したサーバーに対してクラスタリングを有効にするには、domain.xml
を更新し、ha
プロファイルとha-sockets
ソケットバインディンググループを使用するようサーバーグループを指定します。例は次の通りです。<server-groups> <server-group name="main-server-group" profile="ha"> <jvm name="default"> <heap size="64m" max-size="512m"/> </jvm> <socket-binding-group ref="ha-sockets"/> </server-group> </server-groups>
次のようにhost.xml
ファイルを変更します。<servers> <server name="server-one" group="main-server-group" auto-start="false"/> <server name="server-two" group="distinct2"> <socket-bindings port-offset="100"/> </server> <servers>
その後、次のようにサーバーを起動します。- Linux では
EAP_HOME/bin/domain.sh
と入力します。 - Microsoft Windows では
EAP_HOME\bin\domain.bat
と入力します。
スタンドアローンサーバーに対してクラスタリングを有効にする
スタンドアローンサーバーに対してクラスタリングを有効にするには、次のようにノード名とstandalone-ha.xml
設定ファイルを使用してサーバーを起動します。- Linux では
EAP_HOME/bin/standalone.sh --server-config=standalone-ha.xml -Djboss.node.name=UNIQUE_NODE_NAME
と入力します。 - Microsoft Windows では
EAP_HOME\bin\standalone.bat --server-config=standalone-ha.xml -Djboss.node.name=UNIQUE_NODE_NAME
と入力します。
注記
1 つのマシン上で複数のサーバーが実行されている時にポートの競合が発生しないようにするため、別のインターフェースでバインドするように各サーバーインスタンスに対してstandalone-ha.xml
ファイルを設定します。または、コマンドラインで-Djboss.socket.binding.port-offset=100
のような引数を使用し、ポートオフセットを持つ後続のサーバーインスタンスを開始して対応することも可能です 。アプリケーションをサーバーにデプロイする
Maven を使用してアプリケーションをデプロイする場合は、次の Maven コマンドを使用してデフォルトのポートで稼働しているサーバーへデプロイします。mvn clean install jboss-as:deploy
追加のサーバーをデプロイするには、サーバー名とポート番号をコマンドラインに渡します。mvn clean package jboss-as:deploy -Ddeploy.hostname=localhost -Ddeploy.port=10099
第8章 CDI
8.1. CDI の概要
8.1.1. CDI の概要
8.1.2. Contexts and Dependency Injection (CDI) について
8.1.3. CDI の利点
- CDI を使用すると、多くのコードをアノテーションに置き換えることにより、コードベースが単純化および削減されます。
- CDI は柔軟であり、CDI を使用すると、挿入およびイベントを無効または有効にしたり、代替の Bean を使用したり、非 CDI オブジェクトを簡単に挿入したりできます。
- CDI で古いコードを使用することは簡単です。これを行うには
beans.xml
をMETA-INF/
またはWEB-INF/
ディレクトリーに配置します。このファイルは空白である場合があります。 - CDI を使用すると、パッケージ化とデプロイメントが簡略化され、デプロイメントに追加する必要がある XML の量が減少します。
- CDI により、コンテキストを使用したライフサイクル管理が提供されます。挿入を要求、セッション、会話、またはカスタムコンテキストに割り当てることができます。
- また、CDI により、文字列ベースの挿入よりも安全かつ簡単にデバッグを行える、タイプセーフな依存関係挿入が提供されます。
- CDI はインターセプターと Bean を切り離します。
- CDI では、複雑なイベント通知も提供されます。
8.1.4. タイプセーフ依存関係挿入について
8.1.5. Weld、Seam 2、Seam 3、および JavaServer Faces 間の関係
8.2. CDI の使用
8.2.1. 最初の手順
8.2.1.1. CDI の有効化
Contexts and Dependency Injection (CDI) は、Enterprise Application Platform の中核的なテクノロジーの 1 つであり、デフォルトで有効になります。何らかの理由で無効になっている場合は、以下の手順に従って有効にする必要があります。
手順8.1 タスク:
設定ファイルで、CDI サブシステムの詳細がコメントアウトされているかどうかを確認します。
サブシステムは、domain.xml
またはstandalone.xml
設定ファイルの該当するセクションをコメントアウトするか、該当するセクション全体を削除することにより、無効にできます。EAP_HOME/domain/configuration/domain.xml
またはEAP_HOME/standalone/configuration/standalone.xml
で CDI サブシステムを検索するには、これらのファイルで文字列<extension module="org.jboss.as.weld"/>
を検索します。検索候補が存在する場合、検索候補は <extensions> セクション内部に存在します。ファイルを編集する前に、Enterprise Application Platform を停止します。
Enterprise Application Platform により実行中に設定ファイルが変更されるため、設定ファイルを直接編集する前に Enterprise Application Platform を停止する必要があります。CDI サブシステムを復元するよう設定ファイルを編集します。
CDI サブシステムがコメントアウトされている場合は、コメントを削除します。CDI サブシステムが完全に削除されたら、次の行を、</extensions> タグのすぐ上にある新しい行に追加することにより、CDI サブシステムを復元します。<extension module="org.jboss.as.weld"/>
Enterprise Application Platform を再起動します。
更新された設定で Enterprise Application Platform を起動します。
Enterprise Application Platform は、CDI サブシステムが有効になった状態で起動します。
8.2.2. CDI を使用してアプリケーションを開発
8.2.2.1. CDI を使用したアプリケーションの開発
Contexts and Dependency Injection (CDI) を使用すると、アプリケーションの開発、コードの再利用、デプロイメント時または実行時のコードの調整、およびユニットテストを非常に柔軟に実行できます。Enterprise Application Platform には、CDI の参照実装である Weld が含まれます。これらのタスクは、エンタープライズアプリケーションで CDI を使用する方法を示しています。
8.2.2.2. 既存のコードでの CDI の使用
META-INF/
または WEB-INF/
ディレクトリーにある beans.xml
という名前のファイルです。このファイルは空白の場合があります。
手順8.2 CDI アプリケーションでのレガシー Bean の使用
Bean をアーカイブにパッケージ化します。
Bean を JAR または WAR アーカイブにパッケージ化します。beans.xml
ファイルをアーカイブに含めます。beans.xml
ファイルを JAR アーカイブのMETA-INF/
ディレクトリーまたは WAR アーカイブのWEB-INF/
ディレクトリーに配置します。このファイルは空白の場合があります。
これらの Bean を CDI で使用できます。コンテナは、Bean のインスタンスを作成および破棄し、指定されたコンテキストに関連付け、他の Bean に挿入し、EL 式で使用して、修飾子アノテーションで特殊化し、インターセプターとデコレーターをこれらに追加できます (既存のコードを変更しません)。状況によっては、いくつかのアノテーションを追加する必要がある場合があります。
8.2.2.3. スキャンプロセスからの Bean の除外
Weld の機能の 1 つである Enterprise Application Platform のCDI 実装は、スキャンからアーカイブのクラスを除外する機能であり、コンテナライフスタイルイベントを発生させ、Bean としてデプロイされます。これは、JSR-299 仕様の一部ではありません。
例8.1 Bean からのパッケージの除外
- 最初のタグでは、すべての Swing クラスが除外されます。
- 2 番目のタグでは、Google Web Toolkit がインストールされていない場合に Google Web Toolkit クラスが除外されます。
- 3 番目のタグでは、文字列
Blether
(通常の式を使用) で終了するクラスが除外されます (プロパティー verbosityがlow
に設定されている場合)。 - 4 番目のタグでは、Java Server Faces (JSF) クラスが除外されます (Wicket クラスが存在し、viewlayerシステムプロパティーが設定されてない場合)。
<beans xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:weld="http://jboss.org/schema/weld/beans" xsi:schemaLocation=" http://java.sun.com/xml/ns/javaee http://docs.jboss.org/cdi/beans_1_0.xsd http://jboss.org/schema/weld/beans http://jboss.org/schema/weld/beans_1_1.xsd"> <weld:scan> <!-- Don't deploy the classes for the swing app! --> <weld:exclude name="com.acme.swing.**" /> <!-- Don't include GWT support if GWT is not installed --> <weld:exclude name="com.acme.gwt.**"> <weld:if-class-available name="!com.google.GWT"/> </weld:exclude> <!-- Exclude classes which end in Blether if the system property verbosity is set to low i.e. java ... -Dverbosity=low --> <weld:exclude pattern="^(.*)Blether$"> <weld:if-system-property name="verbosity" value="low"/> </weld:exclude> <!-- Don't include JSF support if Wicket classes are present, and the viewlayer system property is not set --> <weld:exclude name="com.acme.jsf.**"> <weld:if-class-available name="org.apache.wicket.Wicket"/> <weld:if-system-property name="!viewlayer"/> </weld:exclude> </weld:scan> </beans>
8.2.2.4. 挿入を使用して実装を拡張
挿入を使用して、既存のコードの機能を追加または変更できます。この例は、クラスに翻訳機能を追加する方法を示しています。
クラスを記述します。
翻訳機能を持たいない基本クラスを記述します。例8.2 Welcome クラス
public class Welcome { public String buildPhrase(String city) { return "Welcome to " + city + "!"; } }
翻訳機能を追加する 2 番目の実装を作成します。
以下の擬似コードにより、最初のクラスに触れずに、Translator オブジェクトが挿入され、全体の挨拶が翻訳されます。例8.3 Welcome クラスの翻訳
public class TranslatingWelcome extends Welcome { @Inject Translator translator; public String buildPhrase(String city) { return translator.translate("Welcome to " + city + "!"); } ... }
Welcome
クラスの 2 つの実装があり、1 つは翻訳を行い、もう 1 つは翻訳を行いません。
8.2.3. あいまいな依存関係または満たされていない依存関係
8.2.3.1. 依存性があいまいな場合、あるいは満たされていない場合
- インジェクションポイントの Bean 型を実装する全 Bean にある修飾子アノテーションを解決します。
- 無効となっている Bean をフィルタリングします。無効な Bean とは、明示的に有効化されていない @Alternative Bean のことです。
8.2.3.2. 修飾子について
@Synchronous
と @Asynchronous
が修飾子です。
例8.4 修飾子
@Synchronous public class SynchronousPaymentProcessor implements PaymentProcessor { public void process(Payment payment) { ... } } @Asynchronous public class AsynchronousPaymentProcessor implements PaymentProcessor { public void process(Payment payment) { ... } }
8.2.3.3. 修飾子を使用して不明な挿入を解決
このタスクは、不明な挿入を示し、修飾子を使用して不明な挿入を削除します。不明な挿入の詳細については、「依存性があいまいな場合、あるいは満たされていない場合」 を参照してください。
例8.5 不明な挿入
Welcome
の 2 つの実装があり、1 つは翻訳を行い、もう 1 つは翻訳を行いません。このような場合は、以下の挿入が不明であり、翻訳を行う Welcome
を使用するよう指定する必要があります。
public class Greeter { private Welcome welcome; @Inject void init(Welcome welcome) { this.welcome = welcome; } ... }
手順8.3 タスク:
@Translating
という修飾子アノテーションを作成します。@Qualifier @Retention(RUNTIME) @Target({TYPE,METHOD,FIELD,PARAMETERS}) public @interface Translating{}
翻訳を行う
Welcome
を@Translating
アノテーションでアノテートします。@Translating public class TranslatingWelcome extends Welcome { @Inject GoogleTranslator translator; public String buildPhrase(String city) { return translator.translate("Welcome to " + city + "!"); } ... }
挿入の、翻訳を行う
Welcome
を要求します。ファクトリーメソッドパターンの場合と同様に、修飾された実装を明示的に要求する必要があります。不明な点は、挿入時に解決されます。public class Greeter { private Welcome welcome; @Inject void init(@Translating Welcome welcome) { this.welcome = welcome; } public void welcomeVisitors() { System.out.println(welcome.buildPhrase("San Francisco")); } }
@Translating
Welcome
が使用されます。不明な点はありません。
8.2.4. 管理 Bean
8.2.4.1. 管理対象 Beans について
8.2.4.2. Bean であるクラスのタイプ
@ManagedBean
をアノテートすることで明示的に管理対象 Bean を宣言できますが、CDI ではその必要はありません。この仕様によると、CDI コンテナでは、以下の条件を満たすクラスはすべて管理対象 Bean として扱われます。
- 非静的な内部クラスではないこと。
- 具象クラス、あるいは
@Decorator
でアノテートされていること。 - EJB コンポーネントを定義するアノテーションでアノテートされていないこと、あるいは
ejb-jar.xml
で EJB Bean クラスとして宣言されていること。 javax.enterprise.inject.spi.Extension
インターフェースを実装していないこと。- パラメーターのないコンストラクターか、
@Inject
でアノテートされたコンストラクターがあること。
8.2.4.3. CDI を使用してオブジェクトを Bean に挿入する
META-INF/beans.xml
または WEB-INF/beans.xml
ファイルが含まれる場合、CDI を使用してデプロイメントの各オブジェクト挿入することが可能です。
@Inject
アノテーションを用いてオブジェクトを Bean の一部に挿入します。Bean 内でクラスのインスタンスを取得するには、フィールドに@Inject
アノテーションを付けます。例8.6
TranslateController
へTextTranslator
インスタンスを挿入するpublic class TranslateController { @Inject TextTranslator textTranslator; ...
挿入したオブジェクトのメソッドを使用する
挿入したオブジェクトのメソッドを直接使用することが可能です。TextTranslator
に メソッドtranslate
があるとします。例8.7 挿入したオブジェクトのメソッドを使用する
// in TranslateController class public void translate() { translation = textTranslator.translate(inputText); }
Bean のコンストラクターで挿入を使用する
ファクトリーやサービスロケーターを使用して作成する代わりに、Bean のコンストラクターへオブジェクトを挿入することができます。例8.8 Bean のコンストラクターで挿入を使用する
public class TextTranslator { private SentenceParser sentenceParser; private Translator sentenceTranslator; @Inject TextTranslator(SentenceParser sentenceParser, Translator sentenceTranslator) { this.sentenceParser = sentenceParser; this.sentenceTranslator = sentenceTranslator; } // Methods of the TextTranslator class ... }
Instance(<T>)
インターフェースを使用し、プログラムを用いてインスタンスを取得します。Bean 型でパラメーター化されると、Instance
インターフェースは TextTranslator のインスタンスを返すことができます。例8.9 プログラムを用いてインスタンスを取得する
@Inject Instance<TextTranslator> textTranslatorInstance; ... public void translate() { textTranslatorInstance.get().translate(inputText); }
オブジェクトを Bean に挿入すると、Bean は全オブジェクトのメソッドとプロパティーを使用できるようになります。Bean のコンストラクターに挿入すると、挿入が既に存在するインスタンスを参照する場合以外は、Bean のコンストラクターが呼び出されると挿入されたオブジェクトのインスタンスが作成されます。例えば、セッションのライフタイムの間にセッションスコープ付けされた Bean を挿入しても、新しいインスタンスは作成されません。
8.2.5. コンテキスト、スコープ、依存関係
8.2.5.1. コンテキストおよびスコープ
@RequestScoped
、@SessionScoped
、および @ConversationScope
です。
8.2.5.2. 利用可能なコンテキスト
表8.1 利用可能なコンテキスト
コンテキスト | 説明 |
---|---|
@Dependent | Bean は、参照を保持する Bean のライフスタイルにバインドされます。 |
@ApplicationScoped | アプリケーションのライフスタイルにバインドされます。 |
@RequestScoped | 要求のライフスタイルにバインドされます。 |
@SessionScoped | セッションのライフスタイルにバインドされます。 |
@ConversationScoped | 会話のライフスタイルにバインドされます。会話スコープは、要求の長さとセッション長さの間にあり、アプリケーションによって制御されます。 |
カスタムスコープ | 上記のコンテキストがニーズを満たさない場合は、カスタムスコープを定義できます。 |
8.2.6. Bean ライフサイクル
8.2.6.1. Bean のライフスタイルの管理
このタスクは、要求の残存期間の間 Bean を保存する方法を示しています。他の複数のスコープが存在し、独自のスコープを定義できます。
@Dependent
です。つまり、Bean のライフスタイルは、参照を保持する Bean のライフスタイルに依存します。詳細については、「コンテキストおよびスコープ」 を参照してください。
必要なスコープに対応するスコープで Bean をアノテートします。
@RequestScoped @Named("greeter") public class GreeterBean { private Welcome welcome; private String city; // getter & setter not shown @Inject void init(Welcome welcome) { this.welcome = welcome; } public void welcomeVisitors() { System.out.println(welcome.buildPhrase(city)); } }
Bean が JSF ビューで使用される場合、Bean はステートを保持します。
<h:form> <h:inputText value="#{greeter.city}"/> <h:commandButton value="Welcome visitors" action="#{greeter.welcomeVisitors}"/> </h:form>
Bean は、指定するスコープに関連するコンテキストに保存され、スコープが適用される限り存続します。
8.2.6.2. プロデューサーメソッドの使用
このタスクは、挿入用の Bean ではないさまざまなオブジェクトを生成するプロデューサーメソッドを使用する方法を示しています。
例8.10 代替の代わりにプロデューサーメソッドを使用してデプロイメント後のポリモーフィズムを可能にします。
@SessionScoped public class Preferences implements Serializable { private PaymentStrategyType paymentStrategy; ... @Produces @Preferred public PaymentStrategy getPaymentStrategy() { switch (paymentStrategy) { case CREDIT_CARD: return new CreditCardPaymentStrategy(); case CHECK: return new CheckPaymentStrategy(); default: return null; } } }
@Inject @Preferred PaymentStrategy paymentStrategy;
例8.11 プロデューサーメソッドへのスコープの割り当て
@Produces @Preferred @SessionScoped public PaymentStrategy getPaymentStrategy() { ... }
例8.12 プロデューサーメソッド内部での挿入の使用
@Produces @Preferred @SessionScoped public PaymentStrategy getPaymentStrategy(CreditCardPaymentStrategy ccps, CheckPaymentStrategy cps ) { switch (paymentStrategy) { case CREDIT_CARD: return ccps; case CHEQUE: return cps; default: return null; } }
プロデューサーメソッドを使用して、非 Bean オブジェクトを挿入し、コードを動的に変更できます。
8.2.7. 名前付き Bean と代替の Bean
8.2.7.1. 名前付き Bean について
@Named
アノテーションを使用して名前が付けられます。Bean を命名することにより、Bean を Java Server Faces (JSF) で直接使用できるようになります。
@Named
アノテーションは、Bean 名であるオプションパラメーターを取ります。このパラメーターが省略された場合は、小文字の Bean 名が名前として使用されます。
8.2.7.2. 名前付き Bean の使用
@Named
アノテーションを使用して名前を Bean に割り当てます。@Named("greeter") public class GreeterBean { private Welcome welcome; @Inject void init (Welcome welcome) { this.welcome = welcome; } public void welcomeVisitors() { System.out.println(welcome.buildPhrase("San Francisco")); } }
Bean 名自体はオプションです。省略された場合、クラス名に基づいて Bean に名前が付けられます (最初の文字は小文字になります)。上記の例では、デフォルトの名前はgreeterBean
になります。JSF ビューで名前付き Bean を使用します。
<h:form> <h:commandButton value="Welcome visitors" action="#{greeter.welcomeVisitors}"/> </h:form>
名前付き Bean が、JSF ビューでアクションとしてコントロールに割り当てられ、コーディングが最小化されます。
8.2.7.3. 代替の Bean について
例8.13 代替の定義
@Alternative @Synchronous @Asynchronous public class MockPaymentProcessor implements PaymentProcessor { public void process(Payment payment) { ... } }
beans.xml
ファイルを編集することにより、特定の Bean アーカイブに対して有効になります。
8.2.7.4. 代替で挿入をオーバーライド
代替の Bean を使用すると、既存の Bean をオーバーライドできます。これらは、同じ役割を満たすクラスをプラグインする方法として考えることができますが、動作が異なります。これらはデフォルトで無効になります。このタスクは、代替を指定し、有効にする方法を示しています。
手順8.4 タスク:
TranslatingWelcome
クラスがすでにあることを前提としています。ただし、これは、特定のデプロイメントに対して以下のものでオーバーライドします。
代替を定義します。
@Alternative public class TranslatingWelcome extends Welcome { @Inject @Translating GoogleTranslator translator; public String buildPhrase(string city) { return translator.translate("Welcome to " + city "!"); } }
代替を置換します。
置換実装をアクティベートするために、完全修飾クラス名をMETA-INF/beans.xml
またはWEB-INF/beans.xml
ファイルに追加します。<beans> <alternatives> <class>com.acme.TranslatingWelcome</class> </alternatives> </beans>
元の実装の代わりに代替実装が使用されます。
8.2.8. ステレオタイプ
8.2.8.1. ステレオタイプについて
- デフォルトスコープ
- インターセプターバインディングのセット
- ステレオタイプを持つすべての Bean にデフォルトの Bean EL 名がある
- ステレオタイプを持つすべての Bean が代替である
@Named
アノテーションを持つ場合、配置された Bean はデフォルトの Bean 名を持ちます。この Bean は、@Named アノテーションが Bean で直接指定された場合に、この名前をオーバーライドできます。名前付き Bean の詳細については、「名前付き Bean について」 を参照してください。
8.2.8.2. ステレオタイプの使用
ステレオタイプがない場合は、アノテーションをクラスタリングできます。このタスクは、ステレオタイプを使用して煩雑さとコードを減らす方法を示しています。ステレオタイプの詳細については、「ステレオタイプについて」 を参照してください。
例8.14 アノテーションの煩雑さ
@Secure @Transactional @RequestScoped @Named public class AccountManager { public boolean transfer(Account a, Account b) { ... } }
手順8.5 タスク
ステレオタイプを定義します。
@Secure @Transactional @RequestScoped @Named @Stereotype @Retention(RUNTIME) @Target(TYPE) public @interface BusinessComponent { ... }
ステレオタイプを使用します。
@BusinessComponent public class AccountManager { public boolean transfer(Account a, Account b) { ... } }
ステレオタイプにより、コードが削減され、単純化されます。
8.2.9. オブザーバーメソッド
8.2.9.1. オブサーバーメソッドについて
8.2.9.2. イベントの発生と確認
例8.15 イベントの発生
public class AccountManager { @Inject Event<Withdrawal> event; public boolean transfer(Account a, Account b) { ... event.fire(new Withdrawal(a)); } }
例8.16 修飾子を使用したイベントの発生
public class AccountManager { @Inject @Suspicious Event <Withdrawal> event; public boolean transfer(Account a, Account b) { ... event.fire(new Withdrawal(a)); } }
例8.17 イベントの確認
@Observes
アノテーションを使用します。
public class AccountObserver { void checkTran(@Observes Withdrawal w) { ... } }
例8.18 修飾されたイベントの確認
public class AccountObserver { void checkTran(@Observes @Suspicious Withdrawal w) { ... } }
8.2.10. インターセプター
8.2.10.1. インターセプターについて
インターセプションポイント
- ビジネスメソッドのインターセプション
- ビジネスメソッドのインターセプターは、Bean のクライアントによる Bean のメソッド呼び出しに適用されます。
- ライフサイクルコールバックのインターセプション
- ライフサイクルのコールバックインターセプションは、コンテナによるライフサイクルコールバックの呼び出しに適用されます。
- タイムアウトメソッドのインターセプション
- タイムアウトメソッドのインターセプターは、コンテナによる EJB タイムアウトメソッドの呼び出しに適用されます。
8.2.10.2. CDI とのインターセプターの使用
例8.19 CDI なしのインターセプター
- Bean は、インターセプター実装を直接指定する必要があります。
- アプリケーションの各 Bean は、インターセプターの完全なセットを適切な順序で指定する必要があります。この場合、アプリケーション全体でインターセプターを追加または削除するには時間がかかり、エラーが発生する傾向があります。
@Interceptors({ SecurityInterceptor.class, TransactionInterceptor.class, LoggingInterceptor.class }) @Stateful public class BusinessComponent { ... }
手順8.6 CDI とのインターセプターの使用
インターセプターバインディングタイプを定義します。
@InterceptorBinding @Retention(RUNTIME) @Target({TYPE, METHOD}) public @interface Secure {}
インターセプター実装をマークします。
@Secure @Interceptor public class SecurityInterceptor { @AroundInvoke public Object aroundInvoke(InvocationContext ctx) throws Exception { // enforce security ... return ctx.proceed(); } }
ビジネスコードでインターセプターを使用します。
@Secure public class AccountManager { public boolean transfer(Account a, Account b) { ... } }
インターセプターを
META-INF/beans.xml
またはWEB-INF/beans.xml
に追加することにより、インターセプターをデプロイメントで有効にします。<beans> <interceptors> <class>com.acme.SecurityInterceptor</class> <class>com.acme.TransactionInterceptor</class> </interceptors> </beans>
インターセプターは、リストされた順序で適用されます。
CDI により、インターセプターコードが単純化され、ビジネスコードへの適用が簡単になります。
8.2.11. デコレーターについて
8.2.12. 移植可能な拡張機能について
- ビジネスプロセス管理エンジンとの統合
- Spring、Seam、GWT、Wicket などのサードパーティーフレームワークとの統合
- CDI プログラミングモデルに基づく新しいテクノロジー
- 独自の Bean、インターセプター、およびデコレーターをコンテナに提供します。
- 依存関係挿入サービスを使用して独自のオブジェクトに依存関係を挿入します。
- カスタムスコープのコンテキスト実装を提供します。
- アノテーションベースのメタデータを他のソースからのメタデータで拡大またはオーバーライドします。
8.2.13. Bean プロキシ
8.2.13.1. Bean プロキシ
プロキシを利用することで解決される依存関係挿入の問題
- パフォーマンス - プロキシは依存関係の挿入よりも速度が早いため、高パフォーマンスを必要とする Bean に利用することができます。
- スレッドセーフ - 複数のスレッドが同時に Bean にアクセスしている場合でも、プロキシは適切な Bean インスタンスにリクエストを転送します。依存関係の挿入はスレッドの安全性を保証しません。
プロキシ化できないクラス型
- プリミティブ型あるいはアレイ型
final
のクラスあるいはfinal
メソッドを持つクラス- プライベートではないデフォルトのコンストラクターを持つクラス
8.2.13.2. 挿入でプロキシを使用する
各 Bean のライフサイクルが異なる場合に挿入にプロキシが使用されます。プロキシはランタイム時に作成された Bean のサブクラスで、Bean クラスのプライベートメソッド以外のメソッドをすべて上書きします。プロキシは実際の Bean インスタンスへ呼び出しを転送します。
PaymentProcessor
インスタンスは直接 Shop
へ挿入されません。その代わりにプロキシが挿入され、processPayment()
メソッドが呼び出されるとプロキシが現在の PaymentProcessor
Bean インスタンスをルックアップし、processPayment()
メソッドを呼び出します。
例8.20 プロキシの挿入
@ConversationScoped class PaymentProcessor { public void processPayment(int amount) { System.out.println("I'm taking $" + amount); } } @ApplicationScoped public class Shop { @Inject PaymentProcessor paymentProcessor; public void buyStuff() { paymentProcessor.processPayment(100); } }
第9章 Java トランザクション API (JTA)
9.1. 概要
9.1.1. Java トランザクション API (JTA) の概要
これらのトピックは、 Java トランザクション API (JTA) の基礎的な内容について取り上げます。
9.2. トランザクションの概念
9.2.1. トランザクション
9.2.2. ACID プロパティー
Atomicity
)、一貫性 (Consistency
)、独立性 (Isolation
)、永続性 (Durability
) の略語です。この単語は通常データベースやトランザクション操作において使用されます。
ACID の定義
- 原子性 (Atomicity)
- トランザクションの原子性を保つには、トランザクション内の全メンバーが同じ決定する必要があります。すべてのメンバーがコミットまたはロールバックを行う必要があります。原子性が保たれない場合の結果をヒューリスティックな結果と言います。
- 一貫性 (Consistency)
- 一貫性とは、データベーススキーマの観点から、データベースに書き込まれたデータが有効なデータであることを保証するという意味です。データベースあるいは他のデータソースは常に一貫した状態でなければなりません。一貫性のない状態の例には、操作が中断される前にデータの半分が書き込みされてしまったフィールドなどがあります。すべてのデータが書き込まれた場合や、書き込みが完了しなかった時に書き込みがロールバックされた場合に、一貫した状態となります。
- 独立性 (Isolation)
- 独立性とは、トランザクションのスコープ外のプロセスがデータを変更できないように、トランザクションで操作されたデータが変更前にロックされる必要があることを意味します。
- 永続性 (Durability)
- 永続性とは、トランザクションのメンバーにコミットの指示を出してから外部で問題が発生した場合、問題が解決されると全メンバーがトランザクションのコミットを継続できるという意味です。ここで言う問題とは、ハードウェア、ソフトウェア、ネットワークなどのシステムが関係する問題のことです。
9.2.3. トラザクションコーディネーターあるいはトランザクションマネージャーについて
9.2.4. トランザクションの参加者
9.2.5. Java Transactions API (JTA)
9.2.6. Java Transaction Service (JTS)
注記
9.2.7. XA データソースおよび XA トランザクション
9.2.8. XA リカバリーについて
9.2.9. 2 相コミット
最初のフェーズでは、トランザクションをコミットできるか、あるいはロールバックする必要があるかをトランザクションの参加者がトランザクションコーディネーターに通知します。
2 番目のフェーズでは、トランザクションコーディネーターが全体のトランザクションをコミットするか、ロールバックするか決定します。参加者が 1 つでもコミットできない場合、トランザクションはロールバックしなければなりません。参加者がすべてコミットできる場合はトランザクションはコミットすることができます。コーディネーターは何を行うかをトランザクションに指示し、トランザクションは何を行ったかコーディネーターに通知します。この時点で、トランザクションが完了します。
9.2.10. トランザクションのタイムアウト
9.2.11. 分散トランザクション
9.2.12. ORB 移植性 API について
ORB 移植性 API のクラス
com.arjuna.orbportability.orb
com.arjuna.orbportability.oa
9.2.13. ネストされたトランザクション
9.2.14. ガベージコレクション
9.3. トランザクションの最適化
9.3.1. トランザクション最適化の概要
Enterprise Application Platform のトランザクションサブシステムには複数の最適化機能が含まれており、お使いのアプリケーションでご活用いただけます。
9.3.2. 1相コミット (1PC) の LRCO 最適化
9.3.3. 推定アボート (presumed-abort) 最適化
9.3.4. 読み取り専用の最適化
9.4. トランザクションの結果
9.4.1. トランザクションの結果
- ロールバック
- トランザクションの参加者のいずれかがコミットできなかったり、トランザクションコーディネーターが参加者にコミットを指示できない場合、トランザクションがロールバックされます。詳細は 「ロールバック」 を参照してください。
- コミット
- トランザクションの参加者すべてがコミットできる場合、トランザクションコーディネーターはコミットの実行を指示します。詳細は 「コミット」 を参照してください。
- ヒューリスティックな結果
- トランザクションの参加者の一部がコミットし、他の参加者がロールバックした場合をヒューリスティックな結果と呼びます。ヒューリスティックな結果が発生すると、人的な介入が必要になります。詳細は 「ヒューリスティックな結果」 を参照してください。
9.4.2. コミット
9.4.3. ロールバック
9.4.4. ヒューリスティックな結果
- ヒューリスティックロールバック
- 参加者の一部あるいはすべてが一方的にトランザクションをロールバックしたため、コミット操作に失敗します。
- ヒューリスティックコミット
- 参加者のすべてが一方的にコミットしたため、ロールバック操作に失敗します。例えば、コーディネーターが正常にトランザクションを準備したにも関わらず、ログ更新の失敗などコーディネーター側で障害が発生したためロールバックの実行を決定した場合などに発生します。暫定的に参加者がコミットの実行を決定する場合があります。
- ヒューリスティック混合
- 一部の参加者がコミットし、その他の参加者はロールバックした状態です。
- ヒューリスティックハザード
- 更新の一部の結果が不明な状態です。既知の更新結果はすべてコミットまたはロールバックします。
9.4.5. JBoss Transactions エラーと例外
UserTransaction
クラスのメソッドがスローする例外に関する詳細は、http://download.oracle.com/javaee/1.3/api/javax/transaction/UserTransaction.html の 『UserTransaction API』 の仕様を参照してください。
9.5. JTA トランザクションの概要
9.5.1. Java Transactions API (JTA)
9.5.2. JTA トランザクションのライフサイクル
アプリケーションが新しいトランザクションを開始する
トランザクションを開始するには、お使いのアプリケーションが JNDI から(または、EJB の場合はアノテーションから)UserTransaction
クラスのインスタンスを取得します。UserTransaction
インターフェースには、トップレベルのトランザクションを開始、コミット、ロールバックするメソッドが含まれています。新規作成されたトランザクションは、そのトランザクションを呼び出すスレッドと自動的に関連付けされます。ネストされたトランザクションは JTA ではサポートされないため、すべてのトランザクションがトップレベルのトランザクションとなります。UserTransaction
.begin()
を呼び出すと新しいトランザクションが開始されます。これ以降に使用されたリソースは、このトランザクションに関連付けされます。リソースが複数の場合、トランザクションは XA トランザクションになり、コミット時に 2 相コミットプロトコルに参加します。アプリケーションがステートを変更する
次に、トランザクションが作業を実行しステートを変更します。アプリケーションがコミットまたはロールバックを決定する
アプリケーションがステートの変更を終了すると、コミットまたはロールバックの実行を決定し、適切なメソッドを呼び出します。UserTransaction
.commit()
あるいはUserTransaction
.rollback()
を呼び出します。複数のリソースをエンリストした場合、ここで 2 相コミットプロトコル (2PC) が実行されます。「2 相コミット」トランザクションマネージャーが記録からトランザクションを削除する
コミットあるいはロールバックが完了すると、トランザクションマネージャーは記録を消去し、トランザクションに関する情報を削除します。
障害回復は自動的に行われます。リソース、トランザクションの参加者、アプリケーションサーバーが使用できなくなった場合、この問題が解決した時にトランザクションマネージャーがリカバリー処理を行います。
9.6. トランザクションサブシステムの設定
9.6.1. トランザクション設定の概要
次の手順は、Enterprise Application Platform のトランザクションサブシステムを設定する方法を示しています。
9.6.2. トランザクションデータソースの設定
9.6.2.1. JTA トランザクションを使用するようにデータソースを設定する
このタスクでは、Java Transaction API (JTA) をお使いのデータソースで有効化する方法を説明します。ここでの説明はアーリーアクセスプログラム用で、Enterprise Application Platform 6 では変更される予定です。
このタスクを行う前に、 次の条件を満たす必要があります。
- お使いのデータベースまたはその他のリソースが JTA をサポートしている必要があります。不明な場合は、データソースまたはリソースの文書を参照してください。
- データベースを作成する必要があります。「管理インターフェースによる非 XA データソースの作成」 を参照してください。
- JBoss Enterprise Application Platform を停止します。
- テキストエディターで設定ファイルを直接編集できる権限を持たなければなりません。
手順9.1 タスク
テキストエディターで設定ファイルを開きます。
Enterprise Application Platform を管理ドメインまたはスタンドアローンサーバーで実行するかどうかに応じて、設定ファイルの場所が異なります。管理対象ドメイン
管理ドメインのデフォルトの設定ファイルは、Red Hat Enterprise Linux の場合はEAP_HOME/domain/configuration/domain.xml
にあります。Microsoft Windows サーバーの場合はEAP_HOME\domain\configuration\domain.xml
にあります。スタンドアロンサーバー
スタンドアロンサーバーのデフォルトの設定ファイルは、Red Hat Enterprise Linux の場合はEAP_HOME/standalone/configuration/standalone.xml
にあります。Microsoft Windows サーバーの場合はEAP_HOME\standalone\configuration\standalone.xml
にあります。
お使いのデータソースに対応する
<datasource>
タグを探します。データソースのjndi-name
属性には作成時に指定した属性が設定されます。例えば、 ExampleDS データソースは次のようになります。<datasource jndi-name="java:jboss/datasources/ExampleDS" pool-name="H2DS" enabled="true" jta="true" use-java-context="true" use-ccm="true">
jta
属性をtrue
に設定します。上記のように、jta="true"
を<datasource>
タグの内容に追加します。設定ファイルを保存します。
設定ファイルを保存しテキストエディターを終了します。JBoss Enterprise Application Platform を起動します。
JBoss Enterprise Application Platform 6 サーバーを再起動します。
JBoss Enterprise Application Platform が起動し、データソースが JTA トランザクションを使用するように設定されます。
9.6.2.2. XA Datasource の設定
XA Datasource を追加するには、管理コンソールにログインする必要があります。詳細は 「管理コンソールへログイン」 を参照してください。
新規データソースの追加
新規データソースを Enterprise Application Platform に追加します。「管理インターフェースによる非 XA データソースの作成」 の手順に従いますが、上部の XA Datasource タブをクリックしてください。必要に応じて他のプロパティーを設定します。
データソースパラメーターの一覧は 「データソースのパラメーター」 にあります。
XA Datasource が設定され、使用する準備ができました。
9.6.2.3. 管理コンソールへログイン
前提条件
- JBoss Enterprise Application Platform 6 が稼働している必要があります。
手順9.2 タスク
管理コンソールのスタートページに移動
Web ブラウザーで管理コンソールに移動します。デフォルトの場所は http://localhost:9990/console/ です。ポート 9990 は管理コンソールのソケットバインディングとして事前定義されています。管理コンソールへログイン
以前作成したアカウントのユーザー名とパスワードを入力し、管理コンソールのログイン画面にログインします。図9.1 管理コンソールのログイン画面
結果
- 管理対象ドメイン
- スタンドアロンサーバー
9.6.2.4. 管理インターフェースによる非 XA データソースの作成
ここでは、管理コンソールまたは管理 CLI のいずれかを使用して非 XA データソースを作成する手順について取り上げます。
前提条件
- JBoss Enterprise Application Platform 6 サーバーが稼働している必要があります。
注記
手順9.3 タスク
管理 CLI
- CLI ツールを起動し、サーバーに接続します。
- 以下のコマンドを実行して非 XA データソースを作成し、適切に変数を設定します。
data-source add --name=DATASOURCE_NAME --jndi-name=JNDI_NAME --driver-name=DRIVER_NAME --connection-url=CONNECTION_URL
- データソースを有効にします。
data-source enable --name=DATASOURCE_NAME
管理コンソール
- 管理コンソールへログインします。
管理コンソールの Datasources パネルに移動します。
スタンドアロンモード
コンソールの右上より Profile タブを選択します。ドメインモード
- コンソールの右上より Profiles タブを選択します。
- 左上のドロップダウンボックスより該当するプロファイルを選択します。
- コンソールの左側にある Subsystems メニューを展開します。
- コンソールの左側にあるメニューより Connector → Datasources と選択します。
図9.2 データソースパネル
新しいデータソースの作成
- Datasources パネル上部にある Add ボタンを選択します。
- Create Datasource ウィザードで新しいデータソースの属性を入力し、Next ボタンを押します。
- Create Datasource ウィザードで JDBC ドライバーの詳細を入力し、Next ボタンを押します。
- Create Datasource ウィザードで接続設定を入力し、Done ボタンを押します。
非 XA データソースがサーバーに追加されます。standalone.xml
または domain.xml
ファイル、および管理インターフェースで追加を確認することができます。
9.6.2.5. データソースのパラメーター
表9.1 非 XA および XA データソースに共通のデータソースパラメーター
パラメーター | 説明 |
---|---|
jndi-name | データソースに対する一意の JNDI 名 |
pool-name | データソースの管理プール名 |
enabled | データソースが有効かどうか |
use-java-context |
データソースをグローバルの JNDI にバインドするかどうか
|
spy |
JDBC 層で
spy 機能を有効にします。これで全 JDBC トラフィックをデータソースにロギングします。logging-category パラメーターは org.jboss.jdbc に設定する必要があります。
|
use-ccm | キャッシュ接続マネージャーを有効化 |
new-connection-sql | 接続プールに接続が追加された場合に実行する SQL ステートメント |
transaction-isolation |
以下のいずれかになります。
|
url-delimiter | 高可用性 (HA) のクラスターデータベース に関する connection-url にある URL の区切り文字 |
url-selector-strategy-class-name | org.jboss.jca.adapters.jdbc.URLSelectorStrategy インターフェースを実装するクラス |
security |
セキュリティー設定である子要素が含まれます。表9.6「セキュリティパラメーター」 を参照してください。
|
validation |
検証設定である子要素が含まれます。表9.7「検証パラメーター」 を参照してください。
|
timeout |
タイムアウト設定である子要素が含まれます。表9.8「タイムアウトパラメーター」 を参照してください。
|
statement |
ステートメント設定である子要素が含まれます。表9.9「ステートメントのパラメーター」 を参照してください。
|
表9.2 非 XA データソースのパラメーター
パラメーター | 説明 |
---|---|
jta | 非 XA データソースの JTA 統合を有効にします。XA データソースには適用されません。 |
connection-url | JDBC ドライバーの接続 URL |
driver-class | JDBC ドライバークラスの完全修飾名 |
connection-property | Driver.connect(url,props) メソッドに渡される任意の接続プロパティー。各 connection-property は、文字列名と値のペアを指定します。プロパティー名は名前、値は要素の内容に基づいています。
|
pool |
プーリング設定である子要素が含まれます。表9.4「非 XA および XA データソースに共通のプールパラメーター」 を参照してください。
|
表9.3 XA データソースのパラメーター
パラメーター | 説明 |
---|---|
xa-datasource-property |
実装クラス
XADataSource に割り当てるプロパティー。name=value で指定。 setName という形式で setter メソッドが存在する場合、プロパティーは setName(value) という形式の setter メソッドを呼び出すことで設定されます。
|
xa-datasource-class |
実装クラス
javax.sql.XADataSource の完全修飾名
|
driver |
JDBC ドライバーを含むクラスローダーモジュールへの一意参照。driverName#majorVersion.minorVersion. の形式にのみ対応しています。
|
xa-pool |
プーリング設定である子要素が含まれます。表9.4「非 XA および XA データソースに共通のプールパラメーター」 および 表9.5「XA プールパラメーター」 を参照してください。
|
recovery |
リカバリー設定である子要素が含まれます。表9.10「リカバリーパラメーター」 を参照してください。
|
表9.4 非 XA および XA データソースに共通のプールパラメーター
パラメーター | 説明 |
---|---|
min-pool-size | プールが保持する最小接続数 |
max-pool-size | プールが保持可能な最大接続数 |
prefill | 接続プールのプレフィルを試行するかどうか。要素が空の場合は true を示します。デフォルトは、false です。 |
use-strict-min | pool-size が厳密かどうか。デフォルトは false に設定されています。 |
flush-strategy |
エラーがある場合にプールをフラッシュするかどうか。有効値は次の通りです。
デフォルトは
FailingConnectionOnly です。
|
allow-multiple-users | 複数のユーザーが getConnection (user, password) メソッドを使いデータソースへアクセスするか、また内部プールタイプがこの動作に対応するかを指定します。 |
表9.5 XA プールパラメーター
パラメーター | 説明 |
---|---|
is-same-rm-override | javax.transaction.xa.XAResource.isSameRM(XAResource) クラスが true あるいは false のどちらを返すか |
interleaving | XA 接続ファクトリのインターリービングを有効にするかどうか |
no-tx-separate-pools | コンテキスト毎に sub-pool を作成するかどうか。これには Oracle のデータソースが必要ですが、このデータソースは JTA トランザクションの内部、外部に関わらず、XA 接続の利用ができなくなります。 |
pad-xid | Xid のパディングを行うかどうか |
wrap-xa-resource | org.jboss.tm.XAResourceWrapper インスタンスの XAResource をラップするかどうか
|
表9.6 セキュリティパラメーター
パラメーター | 説明 |
---|---|
user-name | 新規接続の作成に使うユーザー名 |
password | 新規接続の作成に使うパスワード |
security-domain | 認証処理を行う JAAS security-manager 名が入ります。この名前は、JAAS ログイン設定のapplication-policy/name 属性を相関します。 |
reauth-plugin | 物理接続の再認証に使う再認証プラグインを定義します。 |
表9.7 検証パラメーター
パラメーター | 説明 |
---|---|
valid-connection-checker | SQLException.isValidConnection(Connection e) 設定を渡し接続の検証を行う org.jboss.jca.adaptors.jdbc.ValidConnectionChecker インターフェースの実装。接続が破棄されると例外となります。このパラメーターがある場合、check-valid-connection-sql よりもこのパラメーターが優先されます。
|
check-valid-connection-sql | プール接続の妥当性を確認する SQL ステートメント。これは、管理接続をプールから取得し利用する場合に呼び出される場合があります。 |
validate-on-match |
接続ファクトリが、指定セットと管理接続がマッチするか確認しようとした場合に、接続レベルの検証を実行するかを指定します。
background validation とは相互排他的です。
|
background-validation |
接続が利用前の認証ではなく、バッググラウンドのスレッドで認証済みであることを指定します。
validate-on-match とは相互排他的です。
|
background-validation-minutes | バックグラウンド認証を実行する時間数 (分)。 |
use-fast-fail |
true の場合、接続が無効であれば1回目の試行で接続割り当てを失敗させます。デフォルトは
false です。
|
stale-connection-checker | org.jboss.jca.adapters.jdbc.StaleConnectionChecker のインスタンスで、Boolean isStaleConnection(SQLException e) メソッドを渡します。このメソッドが true を返す場合、例外は、SQLException のサブクラスである、org.jboss.jca.adapters.jdbc.StaleConnectionException でラップされます。
|
exception-sorter | org.jboss.jca.adapters.jdbc.ExceptionSorter のインスタンスで、ブール変数 isExceptionFatal(SQLException e) メソッドを渡します。このメソッドは、例外が connectionErrorOccurred メッセージとして、javax.resource.spi.ConnectionEventListener のインスタンスすべてにブロードキャストされるべきかを検証します。
|
表9.8 タイムアウトパラメーター
パラメーター | 説明 |
---|---|
blocking-timeout-millis | 接続待機中にブロックする最大時間数 (ミリ秒)。この時間を超過すると、例外が送出されます。これは、接続許可の待機中にブロックするだけで、新規接続の作成に長時間要している場合は例外を送出しません。デフォルトは 30000 (3分) です。 |
idle-timeout-minutes |
アイドル接続が切断されるまでの最大時間 (分)。実際の最大時間は、idleRemover のスキャン時間 (プールの最小
idle-timeout-minutes の半分) に左右されます。
|
set-tx-query-timeout |
トランザクションがタイムアウトされるまでの残存時間数をもとにクエリのタイムアウトを設定するかどうか。トランザクションが存在しない場合は設定済みのクエリタイムアウトのいずれかを利用します。デフォルトは
false です。
|
query-timeout | クエリのタイムアウト (秒)。デフォルトはタイムアウトなしです。 |
allocation-retry | 例外を送出する前に接続割り当ての再試行をする回数。デフォルトは 0 で、初回の失敗後に例外が送出されます。 |
allocation-retry-wait-millis |
接続割り当てまで待機する時間数 (ミリ秒)。デフォルトは 5000 で、5秒です。
|
xa-resource-timeout |
ゼロ以外の場合、この値は
XAResource.setTransactionTimeout メソッドに渡されます。
|
表9.9 ステートメントのパラメーター
パラメーター | 説明 |
---|---|
track-statements |
接続がプールに返され、ステートメントが準備済みステートメントのキャッシュに返された時点で、ステートメントが閉じられていることを確認するかどうか。false の場合、ステートメントはトラッキングされません。
有効な値
|
prepared-statement-cache-size | Least Recently User (LRU) キャッシュ内の接続毎の準備済みステートメント数。 |
share-prepared-statements |
ステートメントを閉じずに同じステートメントを2回リクエストする場合に、基盤となる準備済みステートメントは同じものを使うのかどうか。デフォルトは
false です。
|
表9.10 リカバリーパラメーター
パラメーター | 説明 |
---|---|
recover-credential | リカバリーに利用するユーザー名とパスワードのペアあるいは、セキュリティドメイン。 |
recover-plugin |
リカバリーに利用する
org.jboss.jca.core.spi.recoveryRecoveryPlugin の実装クラス。
|
9.6.3. トランザクションロギング
9.6.3.1. トランザクションログメッセージについて
DEBUG
ログレベルを使用します。詳細なデバッグでは TRACE
ログレベルを使用します。トランザクションロガーの設定に関する詳細は 「トランザクションサブシステムのログ設定」 を参照してください。
TRACE
ログレベルに設定すると、トランザクションマネージャーは多くのロギング情報を生成できます。一般的に表示されるメッセージの一部は次の通りです。他のメッセージが表示されることもあります。
表9.11 トランザクションステートの変更
トランザクションの開始 |
トランザクションが開始されると、次のコードが実行されます。
com.arjuna.ats.arjuna.coordinator.BasicAction::Begin:1342 tsLogger.logger.trace("BasicAction::Begin() for action-id "+ get_uid()); |
トランザクションのコミット |
トランザクションがコミットすると次のコードが実行されます。
com.arjuna.ats.arjuna.coordinator.BasicAction::End:1342 tsLogger.logger.trace("BasicAction::End() for action-id "+ get_uid()); |
トランザクションのロールバック |
トランザクションがロールバックされると次のコードが実行されます。
com.arjuna.ats.arjuna.coordinator.BasicAction::Abort:1575 tsLogger.logger.trace("BasicAction::Abort() for action-id "+ get_uid()); |
トランザクションのタイムアウト |
トランザクションがタイムアウトすると次のコードが実行されます。
com.arjuna.ats.arjuna.coordinator.TransactionReaper::doCancellations:349 tsLogger.logger.trace("Reaper Worker " + Thread.currentThread() + " attempting to cancel " + e._control.get_uid()); You will then see the same thread rolling back the transaction as shown above |
9.6.3.2. トランザクションサブシステムのログ設定
Enterprise Application Platform の他のログ設定に依存せずにトランザクションログの情報量を制御する手順を説明します。主に Web ベースの管理コンソールを用いた手順を説明し、管理 CLI のコマンドはその説明の後で取り上げます。
手順9.4 管理コンソールを使用したトランザクションロガーの設定
ログ設定エリアへの移動
管理コンソールにて画面の左上にある Profiles タブをクリックします。管理ドメインを使用する場合は、右上の Profile 選択ボックスから設定したいサーバープロファイルを選択します。Core メニューを展開して、Logging ラベルをクリックします。com.arjuna
属性を編集します。ページの下の方にある Details セクションの Edit ボタンをクリックします。ここにクラス固有のログ情報を追加できます。com.arjuna
クラスはすでに存在しています。ログレベルと親ハンドラーを使用するかどうか変更できます。- ログレベル
- デフォルトのログレベルは
WARN
です。トランザクションはログを大量に出力できるため、標準的なログレベルの意味は、トランザクションロガーでは若干異なります。通常、選択したレベルより重要度が低いレベルでタグ付けされたメッセージは破棄されます。トランザクションログのレベル (詳細度が最高レベルから最低レベルまで)
- DEBUG
- INFO
- WARN
- ERROR
- FAILURE
- 親ハンドラーの使用
- ロガーがログ出力を親ロガーに送信するかどうか指定します。デフォルトの動作は
true
です。
- 変更は直ちに反映されます。
9.6.3.3. トランザクションの参照と管理
log-store
と呼ばれるリソースとして公開します。probe
と呼ばれる API 操作はトランザクションログを読み取り、各ログに対してノードを作成します。probe
コマンドは、log-store
を更新する必要があるときに、いつでも手動で呼び出すことができます。トランザクションログが現れて、すぐに消失されるのは通常のことです。
例9.1 ログストアの更新
default
を使用するサーバーグループに対してログストアを更新します。スタンドアローンサーバーの場合は、コマンドから profile=default
を削除します。
/profile=default/subsystem=transactions/log-store=log-store/:probe
例9.2 準備されたすべてのトランザクションの表示
ls
コマンドに類似した機能を持つ次のコマンドを実行します。
ls /profile=default/subsystem=transactions/log-store=log-store/transactions
トランザクションの管理
- トランザクションの属性を表示します。
- JNDI 名、EIS 製品名およびバージョン、ステータスなどのトランザクションに関する情報を表示するには、
:read-resource
CLIコマンドを使用します。/profile=default/subsystem=transactions/log-store=log-store/transactions=0\:ffff7f000001\:-b66efc2\:4f9e6f8f\:9:read-resource
- トランザクションの参加者を表示します。
- 各トランザクションログには、
参加者
と呼ばれる子要素が含まれます。トランザクションの参加者を確認するには、この要素に対してread-resource
CLI コマンドを使用します。参加者は、JNDI 名によって識別されます。/profile=default/subsystem=transactions/log-store=log-store/transactions=0\:ffff7f000001\:-b66efc2\:4f9e6f8f\:9/participants=java\:\/JmsXA:read-resource
結果は以下のようになります。{ "outcome" => "success", "result" => { "eis-product-name" => "HornetQ", "eis-product-version" => "2.0", "jndi-name" => "java:/JmsXA", "status" => "HEURISTIC", "type" => "/StateManager/AbstractRecord/XAResourceRecord" } }
ここで示された結果ステータスはHEURISTIC
であり、復元可能です。詳細については、トランザクションを復元します。 を参照してください。 - トランザクションを削除します。
- 各トランザクションログは、トランザクションを表すトランザクションログを削除するために、
:delete
操作をサポートします。/profile=default/subsystem=transactions/log-store=log-store/transactions=0\:ffff7f000001\:-b66efc2\:4f9e6f8f\:9:delete
- トランザクションを復元します。
- 各トランザクションログは、
:recover
CLI コマンドを使用した復元をサポートします。ヒューリスティックなトランザクションと参加者の復元
- トランザクションのステータスが
HEURISTIC
である場合は、復元操作によって、ステータスがPREPARE
に変わり、復元がトリガーされます。 - トランザクションの参加者の 1 つがヒューリスティックな場合、復元操作により、
commit
操作の応答が試行されます。成功した場合、トランザクションログから参加者が削除されます。これを確認するには、log-store
上で:probe
操作を再実行し、参加者がリストされていないことを確認します。これが最後の参加者の場合は、トランザクションも削除されます。
- 復元が必要なトランザクションのステータスを更新します。
- トランザクションを復元する必要がある場合は、復元を試行する前に、
:refresh
CLI コマンドを使用して、トランザクションで復元が必要であることを確認できます。/profile=default/subsystem=transactions/log-store=log-store/transactions=0\:ffff7f000001\:-b66efc2\:4f9e6f8f\:9:refresh
注記
use-hornetq-store
オプションの値を true
に設定します。トランザクションマネージャーの設定については、「JTA トランザクションを使用するようにデータソースを設定する」 を参照してください。
Web ベースの管理コンソールまたはコマンドライン管理 CLI のいずれかを使用して、トランザクションマネージャーとトランザクションサブシステムに関する統計情報を評できます。
表9.12 トランザクションサブシステム統計情報
統計 | 説明 | CLI コマンド |
---|---|---|
Total (合計) |
このサーバー上でトランザクションマネージャーにより処理されるトランザクションの合計数。
|
/host=master/server=server-one/subsystem=transactions/:read-attribute(name=number-of-transactions,include-defaults=true) |
Committed (コミット済み) |
このサーバー上でトランザクションマネージャーにより処理されるコミット済みトランザクションの数。
|
/host=master/server=server-one/subsystem=transactions/:read-attribute(name=number-of-committed-transactions,include-defaults=true) |
Aborted (異常終了) |
このサーバー上でトランザクションマネージャーにより処理される異常終了したトランザクションの数。
|
/host=master/server=server-one/subsystem=transactions/:read-attribute(name=number-of-aborted-transactions,include-defaults=true) |
Timed Out (タイムアウト) |
このサーバー上でトランザクションマネージャーにより処理されるタイムアウトのトランザクションの数。
|
/host=master/server=server-one/subsystem=transactions/:read-attribute(name=number-of-timed-out-transactions,include-defaults=true) |
Heuristics (ヒューリスティック) |
管理コンソールで利用不可です。ヒューリスティック状態のトランザクションの数。
|
/host=master/server=server-one/subsystem=transactions/:read-attribute(name=number-of-heuristics,include-defaults=true) |
In-Flight Transactions (フライト状態のトランザクション) |
管理コンソールでは使用できません。開始した未終了のトランザクションの数。
|
/host=master/server=server-one/subsystem=transactions/:read-attribute(name=number-of-inflight-transactions,include-defaults=true) |
Failure Origin - Applications (障害の原因 - アプリケーション) |
障害の原因がアプリケーションであった失敗トランザクションの数。
|
/host=master/server=server-one/subsystem=transactions/:read-attribute(name=number-of-application-rollbacks,include-defaults=true) |
Failure Origin - Resources (障害の原因 - リソース) |
障害の原因がリソースであった失敗トランザクションの数。
|
/host=master/server=server-one/subsystem=transactions/:read-attribute(name=number-of-resource-rollbacks,include-defaults=true) |
9.7. JTA トランザクションの使用
9.7.1. トランザクション JTA タスクの概要
次の手順は、アプリケーションでトランザクションを使用する必要がある場合に役に立ちます。
9.7.2. JTA トランザクションの制御
この手順のリストでは、JTA トランザクションを制御するさまざまな方法を概説します。
9.7.3. JTA トランザクションの開始
UserTransaction
のインスタンスを取得します。@TransactionManagement(TransactionManagementType.BEAN)
アノテーションを用いると、 JNDI やインジェクション (EJB が Bean 管理のトランザクションを使用する場合は EJB の EjbContext) を使用してインスタンスを取得できます。JNDI
new InitialContext().lookup("java:comp/UserTransaction")
インジェクション
@Resource UserTransaction userTransaction;
EjbContext
EjbContext.getUserTransaction()
データソースに接続後、
UserTransaction
.begin()
を呼び出します。... try { System.out.println("\nCreating connection to database: "+url); stmt = conn.createStatement(); // non-tx statement try { System.out.println("Starting top-level transaction."); UserTransaction.begin(); stmtx = conn.createStatement(); // will be a tx-statement ... } }
トランザクションが開始します。トランザクションをコミットまたはロールバックするまで、データソースのすべての使用はトランザクション可能です。
注記
9.7.4. トランザクションのネスト
ネストされたトランザクションは、JTS API による分散トランザクションを使用する場合のみサポートされます。JTS API については Enterprise Application Platform 6 の Early Access ドキュメントには記載されていませんが、今後のリリースで追加されます。
9.7.5. JTA トランザクションのコミット
トランザクションは開始されていないとコミットできません。トランザクションの開始については、「JTA トランザクションの開始」 を参照してください。
UserTransaction
.commit()
を呼び出します。UserTransaction
.commit()
メソッドを呼び出すと、トランザクションマネージャーはトランザクションのコミットを試行します。... UserTransaction.commit(); catch (Exception ex) { ex.printStackTrace(); System.exit(0); }
EJB を使用している場合は、手動でコミットする必要はありません。
EJB を使用する場合は、コンテナがトランザクションのライフサイクルを処理するためcommit()
を呼び出す必要はありません。
データソースがコミットし、トランザクションが終了します。そうでない場合は、例外がスローされます。
注記
9.7.6. JTA トランザクションのロールバック
トランザクションが開始されていないとロールバックできません。トランザクションの開始については、「JTA トランザクションの開始」 を参照してください。
UserTransaction
.rollback()
を呼び出します。UserTransaction
.rollback()
メソッドを呼び出すと、トランザクションマネージャーはトランザクションのロールバックを試行します。... UserTransaction.rollback(); catch (Exception ex) { ex.printStackTrace(); System.exit(0); }
EJB を使用している場合は、手動でロールバックする必要はありません。
EJB を使用する場合は、コンテナがトランザクションのライフサイクルを処理するためrollback()
を呼び出す必要はありません。
トランザクションマネージャーにより、トランザクションがロールバックされます。
注記
9.7.7. JTA トランザクションにおけるヒューリスティックな結果の処理方法
手順9.5 JTA トランザクションにおけるヒューリスティックな結果の処理方法
原因を突き止める
トランザクションのヒューリスティックな結果の全体的な原因は、リソースマネージャーがコミットまたはロールバックの実行を約束したにも関わらず、失敗したことにあります。原因としては、サードパーティーコンポーネント、サードパーティーコンポーネントと Enterprise Application Platform 間の統合レイヤー、Enterprise Application Platform 自体に問題がある可能性があります。ヒューリスティックなエラーの最も一般的な原因として圧倒的に多いのが、環境の一時的な障害とリソースマネージャーを扱うコードのコーディングエラーの 2 つです。環境内の一時的な障害を修正する
通常、環境内で一時的な障害が発生した場合は、ヒューリスティックなエラーを発見する前に気づきます。原因としては、ネットワークの停止、ハードウェア障害、データベース障害、電源異常、その他多くの可能性があります。ストレステストの実施中にテスト環境でヒューリスティックな結果が発生した場合は、使用している環境の脆弱性に関する情報が提供されます。警告
Enterprise Application Platform は、障害発生時に非ヒューリスティックな状態にあるトランザクションの自動回復を行いますが、ヒューリスティックなトランザクションの回復は試行しません。リソースマネージャーのベンダーに連絡する
明らかに使用している環境に障害がない場合や、ヒューリスティックな結果が容易に再現可能な場合は、コーディングエラーである可能性があります。サードパーティーのベンダーに連絡して、解決方法の有無を確認してください。Enterprise Application Platform のトランザクションマネージャー自体に問題があると思われる場合は、Red Hat グローバルサポートサービスにご連絡ください。テスト環境の場合は、ログを削除して Enterprise Application Platform を再起動する
テスト環境である場合や、データの整合性を気にしない場合は、トランザクションログを削除して Enterprise Application Platform を再起動すると、ヒューリスティックな結果はなくなります。デフォルトのトランザクションログの場所はスタンドアローンサーバーではEAP_HOME/standalone/data/tx-object-store/
、管理ドメインではEAP_HOME/domain/servers/SERVER_NAME/data/tx-object-store
になります。管理ドメインの SERVER_NAME は、サーバーグループに参加している個々のサーバー名になります。手作業で結果を解決する
トランザクションの結果を手作業で解決するプロセスは、障害の厳密な状況によって大きく左右されます。通常は、以下の手順に従い、それぞれの状況に適用してください。- 関連するリソースマネージャーを特定する。
- トランザクションマネージャーの状態とリソースマネージャーを調べる。
- 関与する 1 つ以上のコンポーネント内でログのクリーンアップとデータ調整を手動で強制する。
これらの手順を実行する方法の詳細は、本書の範囲外となります。
9.7.8. トランザクションのタイムアウト
9.7.8.1. トランザクションのタイムアウト
9.7.8.2. トランザクションマネージャーの設定
default
以外の異なるプロファイルを修正したい場合は、以下の方法で手順とコマンドを修正しなければならない場合があります。
例のコマンドに関する注意点
- 管理コンソールの場合、
default
プロファイルは最初のコンソールログイン時に選択されるものです。異なるプロファイルでトランザクションマネージャーの設定を修正する必要がある場合は、default
の代わりに使用しているプロファイルを選択してください。同様に、例の CLI コマンドのdefault
プロファイルを使用しているプロファイルに置き換えてください。 - スタンドアローンサーバーを使用する場合、存在するプロファイルは 1 つのみです。特定のプロファイルを選択する手順は無視してください。CLI コマンドでは、例のコマンドの
/profile=default
部分を削除してください。
注記
transactions
サブシステムが有効でなくてはなりません。これは、デフォルトで有効になっており、他の多くのサブシステムが適切に機能するために必要なため、無効にする可能性は大変低くなります。
Web ベースの管理コンソールを使用して TM を設定するには、管理コンソール画面の左上にある一覧から Runtime タブを選択します。管理ドメインを使用する場合、選択できるプロファイルがいくつかあります。プロファイル画面の右上にある Profile 選択ボックスから適切なプロファイルを選択してください。Container メニューを展開して、Transactions を選択します。
管理 CLI では、一連のコマンドを使用して TM を設定できます。プロファイル default
の管理ドメインの場合、コマンドはすべて /profile=default/subsystem=transactions/
で始まり、スタンドアローンサーバーの場合は /subsystem=transactions
で始まります。
表9.13 TM 設定オプション
オプション | 詳細 | CLI コマンド |
---|---|---|
Enable Statistics
|
トランザクションの統計を有効にするかどうか指定します。統計は Runtime タブの Subsystem Metrics セクションにある管理コンソールで閲覧できます。
| /profile=default/subsystem=transactions/:write-attribute(name=enable-statistics,value=true)
|
Enable TSM Status
|
トランザクションステータスマネージャー (TSM) のサービスを有効にするかどうか指定します。これは、アウトオブプロセスのリカバリに使用されます。
| /profile=default/subsystem=transactions/:write-attribute(name=enable-tsm-status,value=false)
|
Default Timeout
|
デフォルトのトランザクションタイムアウトです。デフォルトでは
300 秒に設定されています。トランザクションごとにプログラムで上書きできます。
| /profile=default/subsystem=transactions/:write-attribute(name=default-timeout,value=300)
|
Path
|
トランザクションマネージャーコアがデータを格納するファイルシステムの相対または絶対パスです。デフォルトの値は
relative-to 属性の値と相対的なパスです。
| /profile=default/subsystem=transactions/:write-attribute(name=path,value=var)
|
Relative To
|
ドメインモデルのグローバルなパス設定を参照します。デフォルト値は、JBoss Enterprise Application Platform 用のデータディレクトリで、
jboss.server.data.dir プロパティの値です。デフォルトでは、管理ドメインの場合は EAP_HOME/domain/data/ に、スタンドアローンサーバーの場合は EAP_HOME/standalone/data/ に設定されています。path TM 属性の値は、このパスに相対的です。空の文字列を使用して、デフォルト動作を無効にし、path 属性の値が絶対パスとして強制的に扱われるようにします。
| /profile=default/subsystem=transactions/:write-attribute(name=relative-to,value=jboss.server.data.dir)
|
Object Store Path
|
TM オブジェクトストアがデータを格納するファイルシステムの相対または絶対パスです。デフォルトでは、
object-store-relative-to パラメーターの値に相対的です。
| /profile=default/subsystem=transactions/:write-attribute(name=object-store-path,value=tx-object-store)
|
Object Store Path Relative To
|
ドメインモデルのグローバルなパス設定を参照します。デフォルト値は、JBoss Enterprise Application Platform 用のデータディレクトリで、
jboss.server.data.dir プロパティの値です。デフォルトでは、管理ドメインの場合は EAP_HOME/domain/data/ に、スタンドアローンサーバーの場合は EAP_HOME/standalone/data/ に設定されています。path TM 属性の値は、このパスに相対的です。空の文字列を使用して、デフォルト動作を無効にし、path 属性の値が絶対パスとして強制的に扱われるようにします。
| /profile=default/subsystem=transactions/:write-attribute(name=object-store-relative-to,value=jboss.server.data.dir)
|
Socket Binding
|
ソケットベースのメカニズムを使用する場合に、トランザクションマネージャーの回復およびトランザクション識別子の生成に使用するソケットバインディングの名前を指定します。一意の識別子を生成する詳しい情報は、
process-id-socket-max-ports を参照してください。ソケットバインディングは、管理コンソールの Server タブでサーバーグループごとに指定されます。
| /profile=default/subsystem=transactions/:write-attribute(name=socket-binding,value=txn-recovery-environment)
|
Status Socket Binding
|
トランザクションステータスマネージャーで使用するソケットバインディングを指定します。
| /profile=default/subsystem=transactions/:write-attribute(name=status-socket-binding,value=txn-status-manager)
|
Recovery Listener
|
トランザクション回復のプロセスがネットワークソケットをリッスンするかどうか指定します。デフォルトは
false です。
| /profile=default/subsystem=transactions/:write-attribute(name=recovery-listener,value=false)
|
表9.14 高度な TM 設定オプション
オプション | 詳細 | CLI コマンド |
---|---|---|
jts
|
Java Transaction Service (JTS) トランザクションを使用するかどうか指定します。デフォルトは
false で、JTA トランザクションのみ使用します。
| /profile=default/subsystem=transactions/:write-attribute(name=jts,value=false)
|
node-identifier
|
JTS サービスのノード識別子です。トランザクションマネージャーが回復時にこれを使用するため、JTS サービスごとに一意でなければなりません。
| /profile=default/subsystem=transactions/:write-attribute(name=node-identifier,value=1)
|
process-id-socket-max-ports
|
トランザクションマネージャーは、各トランザクションログに対し一意の識別子を作成します。一意の識別子を生成するメカニズムは 2 種類あります。ソケットベースのメカニズムとプロセスのプロセス識別子をベースにしたメカニズムです。
ソケットベースの識別子の場合、あるソケットを開くと、そのポート番号が識別子用に使用されます。ポートがすでに使用されている場合は、空きのポートが見つかるまで次のポートがプローブされます。
process-id-socket-max-ports は、TM が失敗するまでに試行するソケットの最大値を意味します。デフォルト値は 10 です。
| /profile=default/subsystem=transactions/:write-attribute(name=process-id-socket-max-ports,value=10)
|
process-id-uuid
| true に設定すると、プロセス識別子を使用して各トランザクションに一意の識別子を作成します。そうでない場合は、ソケットベースのメカニズムが使用されます。デフォルトは true です。詳細は process-id-socket-max-ports を参照してください。
| /profile=default/subsystem=transactions/:write-attribute(name=process-id-uuid,value=true)
|
use-hornetq-store
|
トランザクションログ用に、ファイルベースのストレージの代わりに HornetQ のジャーナルストレージメカニズムを使用します。デフォルトでは無効になっていますが、I/O パフォーマンスが向上します。別々のトランザクションマネージャーで JTS トランザクションを使用することは推奨されません。これを有効にした場合は、
log-store 値も hornetq に変更してください。
| /profile=default/subsystem=transactions/:write-attribute(name=use-hornetq-store,value=false)
|
log-store
|
ファイルシステムベースのオブジェクトストアを使用する場合は
default に、HornetQ のジャーナリングストレージメカニズムを使用する場合は hornetq に設定します。これを hornetq に設定した場合は、use-hornetq-store も true に変更してください。
| /profile=default/subsystem=transactions/log-store=log-store/:write-attribute(name=type,value=default)
|
9.7.9. JTA トランザクションのエラー処理
9.7.9.1. トランザクションエラーの処理
注記
多くの場合、このようなエラーは、Hibernate がレイジーロードのためにデータベース接続を取得できない場合に発生します。頻繁に発生する場合は、タイムアウト値を大きくできます。「トランザクションマネージャーの設定」 を参照してください。
NotSupportedException
例外が発生します。
NotSupportedException
例外は、通常、JTA トランザクションをネストしようとし、ネストがサポートされていないことを示します。トランザクションをネストしようとしないときは、多くの場合、スレッドプールタスクで別のトランザクションが開始されますが、トランザクションを中断または終了せずにタスクが終了します。
UserTransaction
を使用します。その場合は、フレームワークに問題があることがあります。
TransactionManager
または Transaction
メソッドを直接使用する場合は、トランザクションをコミットまたはロールバックするときに次の動作に注意してください。コードで TransactionManager
メソッドを使用してトランザクションを制御する場合は、トランザクションをコミットまたはロールバックすると、現在のスレッドからトランザクションの関連付けが解除されます。ただし、コードで Transaction
メソッドを使用する場合は、トランザクションを、実行中のスレッドに関連付けることができず、スレッドプールにスレッドを返す前にスレッドからトランザクションの関連付けを解除する必要があります。
このエラーは、2 番目の非 XA リソースをトランザクションに登録しようとした場合に、発生します。1 つのトランザクションで複数のリソースが必要な場合、それらは XA である必要があります。
9.8. ORB Configuration
9.8.1. Common Object Request Broker Architecture (CORBA) について
9.8.2. JTS トランザクション用 ORB の設定
注記
full
および full-ha
プロファイルでのみ利用可能です。スタンドアロンサーバーでは、standalone-full.xml
または standalone-full-ha.xml
設定で利用可能です。
手順9.6 管理コンソールを使用した ORB の設定
プロファイル設定を表示します。
管理コンソールの右上から Profiles (管理対象ドメイン) または Profile (スタンドアロンサーバー) を選択します。管理対象ドメインを使用する場合は、左上にある選択ボックスから full または full-ha プロファイルを選択します。Initializers 設定の変更
必要な場合は、左側にある Subsystems メニューを展開します。Container サブメニューを展開し、JacORB をクリックします。メイン画面に表示されるフォームで、Initializers タブを選択し、Edit ボタンをクリックします。Security の値をon
に設定して、セキュリティーインターセプターを有効にします。JTS 用 ORB を有効にするには、Transaction Interceptors 値をデフォルトのspec
ではなくon
に設定します。これらの値に関する詳細な説明については、フォームの Need Help? リンクを参照してください。値の編集が完了したら、Save をクリックします。高度な ORB 設定
高度な設定オプションについては、フォームの他のセクションを参照してください。各セクションには、パラメーターに関する詳細な情報とともに Need Help? リンクが含まれます。
管理 CLI を使用して ORB の各側面を設定できます。以下のコマンドは、管理コンソールに対するイニシャライザーに上記の手順と同じ値を設定します。これは、JTS と使用する ORB の最小設定です。
/profile=full
部分を省略します。
例9.3 セキュリティーインターセプターの有効化
/profile=full/subsystem=jacorb/:write-attribute(name=security,value=on)
例9.4 JTS 用 ORB の有効化
/profile=full/subsystem=jacorb/:write-attribute(name=transactions,value=on)
9.9. トランザクションに関する参考資料
9.9.1. JBoss Transactions エラーと例外
UserTransaction
クラスのメソッドがスローする例外に関する詳細は、http://download.oracle.com/javaee/1.3/api/javax/transaction/UserTransaction.html の 『UserTransaction API』 の仕様を参照してください。
9.9.2. JTA クラスタリングの制限事項
注記
9.9.3. JTA トランザクションの例
例9.5 JTA トランザクションの例
public class JDBCExample { public static void main (String[] args) { Context ctx = new InitialContext(); // Change these two lines to suit your environment. DataSource ds = (DataSource)ctx.lookup("jdbc/ExampleDS"); Connection conn = ds.getConnection("testuser", "testpwd"); Statement stmt = null; // Non-transactional statement Statement stmtx = null; // Transactional statement Properties dbProperties = new Properties(); // Get a UserTransaction UserTransaction txn = new InitialContext().lookup("java:comp/UserTransaction"); try { stmt = conn.createStatement(); // non-tx statement // Check the database connection. try { stmt.executeUpdate("DROP TABLE test_table"); stmt.executeUpdate("DROP TABLE test_table2"); } catch (Exception e) { // assume not in database. } try { stmt.executeUpdate("CREATE TABLE test_table (a INTEGER,b INTEGER)"); stmt.executeUpdate("CREATE TABLE test_table2 (a INTEGER,b INTEGER)"); } catch (Exception e) { } try { System.out.println("Starting top-level transaction."); txn.begin(); stmtx = conn.createStatement(); // will be a tx-statement // First, we try to roll back changes System.out.println("\nAdding entries to table 1."); stmtx.executeUpdate("INSERT INTO test_table (a, b) VALUES (1,2)"); ResultSet res1 = null; System.out.println("\nInspecting table 1."); res1 = stmtx.executeQuery("SELECT * FROM test_table"); while (res1.next()) { System.out.println("Column 1: "+res1.getInt(1)); System.out.println("Column 2: "+res1.getInt(2)); } System.out.println("\nAdding entries to table 2."); stmtx.executeUpdate("INSERT INTO test_table2 (a, b) VALUES (3,4)"); res1 = stmtx.executeQuery("SELECT * FROM test_table2"); System.out.println("\nInspecting table 2."); while (res1.next()) { System.out.println("Column 1: "+res1.getInt(1)); System.out.println("Column 2: "+res1.getInt(2)); } System.out.print("\nNow attempting to rollback changes."); txn.rollback(); // Next, we try to commit changes txn.begin(); stmtx = conn.createStatement(); ResultSet res2 = null; System.out.println("\nNow checking state of table 1."); res2 = stmtx.executeQuery("SELECT * FROM test_table"); while (res2.next()) { System.out.println("Column 1: "+res2.getInt(1)); System.out.println("Column 2: "+res2.getInt(2)); } System.out.println("\nNow checking state of table 2."); stmtx = conn.createStatement(); res2 = stmtx.executeQuery("SELECT * FROM test_table2"); while (res2.next()) { System.out.println("Column 1: "+res2.getInt(1)); System.out.println("Column 2: "+res2.getInt(2)); } txn.commit(); } catch (Exception ex) { ex.printStackTrace(); System.exit(0); } } catch (Exception sysEx) { sysEx.printStackTrace(); System.exit(0); } } }
9.9.4. JBoss トランザクション JTA 向け API ドキュメンテーション
第10章 Hibernate
10.1. Hibernate Core について
10.2. Java 永続 API (JPA)
10.2.1. JPA について
SecurityContext
に文書でまとめられている Java Persistence 2.0 仕様を利用します。
bean-validation
、greeter
、kitchensink
クイックスタート: 「Java EE クイックスタートの例へのアクセス」 を参照してくだい。
10.2.2. Hibernate EntityManager
10.2.3. 使用の開始
10.2.3.1. JBoss Developer Studio における JPA プロジェクトの作成
この例では、JBoss Developer Studio で JPA プロジェクトを作成するために必要な手順について取り上げます。
手順10.1 タスク
- JBoss Developer Studio のウインドウで [File] → [New] → [JPA Project] と選択します。
- プロジェクトダイアログにプロジェクト名を入力します。
- ドロップダウンボックスよりターゲットランタイムを選択します。
- ターゲットランタイムがない場合は [Target Runtime] をクリックします。
- リストで JBoss Community Folder を探します。
- JBoss Enterprise Application Platform 6.x ランタイムの選択
- [Next] をクリックします。
- Home Directory フィールドで [Browse] をクリックし、JBoss EAP ソースフォルダーを Home Directory として設定します。
- [Finish] をクリックします。
- [Next] をクリックします。
- ビルドパスウインドウのソースフォルダーはデフォルトのままにし、[Next] をクリックします。
- Platform ドロップダウンで必ず Hibernate (JPA 2.x) が選択されているようにしてください。
- [Finish] をクリックします。
- 要求されたら、JPA パースペクティブウインドウを開くかどうかを選択します。
10.2.3.2. JBoss Developer Studio での永続設定ファイルの作成
このトピックでは、JBoss Developer Studio を使用して Java プロジェクトで persistence.xml
ファイルを作成するプロセスについて説明します。
手順10.2 タスク
- JBoss Developer Studio で EJB 3.x プロジェクトを開きます。
- [Project Explorer] パネルのプロジェクトのルートディレクトリーを右クリックします。
- [New] → [Other...] を選択します。
- XML フォルダーから [XML File] を選択し、[Next] をクリックします。
- 親ディレクトリとして
ejbModule/META-INF
フォルダーを選択します。 persistence.xml
ファイルに名前を付け、[Next] をクリックします。- [Create XML file from an XML schema file] を選択し、[Next] をクリックします。
- [Select XML Catalog entry] リストから http://java.sun.com/xml/ns/persistence/persistence_2.0.xsd を選択し、[Next] をクリックします。
- [Finish] をクリックし、ファイルを作成します。
- 結果
10.2.3.3. 永続設定ファイルの例
例10.1 persistence.xml
<persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd" version="2.0"> <persistence-unit name="example" transaction-type="JTA"> <provider>org.hibernate.ejb.HibernatePersistence</provider> <jta-data-source>java:/ExampleDS</jta-data-source> <mapping-file>ormap.xml</mapping-file> <jar-file>TestApp.jar</jar-file> <class>org.test.Test</class> <shared-cache-mode>NONE</shared-cache-mode> <validation-mode>CALLBACK</validation-mode> <properties> <property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect"/> <property name="hibernate.hbm2ddl.auto" value="create-drop"/> </properties> </persistence-unit> </persistence>
10.2.3.4. JBoss Developer Studio の Hibernate 設定ファイルの作成
本トピックでは、JBoss Developer Studio を使用して Java プロジェクトに hibernate.cfg.xml
ファイルを作成するプロセスについて説明します。
手順10.3 タスク
- JBoss Developer Studio で Java プロジェクトを開きます。
- [Project Explorer] パネルのプロジェクトのルートディレクトリーを右クリックします。
- [New] → [Other...] を選択します。
- Hibernate フォルダーから [Hibernate Configuration File] を選択し、[Next] をクリックします。
src/
ディレクトリを選択し、[Next] をクリックします。- 以下を設定します。
- セッションファクトリー名
- データベースの方言
- ドライバークラス
- 接続 URL
- ユーザー名
- パスワード
- [Finish] をクリックし、ファイルを作成します。
- 結果
10.2.3.5. Hibernate 設定ファイルの例
例10.2 hibernate.cfg.xml
<hibernate-configuration> <session-factory> <!-- Datasource Name --> <property name="connection.datasource">ExampleDS</property> <!-- SQL dialect --> <property name="dialect">org.hibernate.dialect.H2Dialect</property> <!-- Enable Hibernate's automatic session context management --> <property name="current_session_context_class">thread</property> <!-- Disable the second-level cache --> <property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property> <!-- Echo all executed SQL to stdout --> <property name="show_sql">true</property> <!-- Drop and re-create the database schema on startup --> <property name="hbm2ddl.auto">update</property> <mapping resource="org/hibernate/tutorial/domain/Event.hbm.xml"/> </session-factory> </hibernate-configuration>
10.2.4. 設定
10.2.4.1. Hibernate 設定プロパティー
表10.1 プロパティー
プロパティー名 | 説明 |
---|---|
hibernate.dialect |
Hibernate の
org.hibernate.dialect.Dialect のクラス名です。特定のリレーショナルデータベースに対して最適化された SQL を Hibernate が生成できるようにします。
ほとんどの場合で、Hibernate は JDBC ドライバーより返された
JDBC metadata を基にして適切な org.hibernate.dialect.Dialect 実装を選択することができます。
|
hibernate.show_sql |
ブール変数です。SQL ステートメントをすべてコンソールに書き込みます。ログカテゴリー
org.hibernate.SQL を debug に設定する代わりとなります。
|
hibernate.format_sql |
ブール変数です。SQL をログとコンソールにプリティプリントします。
|
hibernate.default_schema |
修飾されていないテーブル名を生成された SQL の指定のスキーマ/テーブルスペースで修飾します。
|
hibernate.default_catalog |
修飾されていないテーブル名を生成された SQL の指定カタログで修飾します。
|
hibernate.session_factory_name |
作成後、
org.hibernate.SessionFactory は JNDI のこの名前に自動的にバインドされます。例: jndi/composite/name
|
hibernate.max_fetch_depth |
シングルエンドの関連 (1 対 1 や多対 1 など) に対して外部結合によるフェッチツリーの最大の「深さ」を設定します。
0 を設定するとデフォルトの外部結合フェッチが無効になります。0 から 3 までの値が推奨されます。
|
hibernate.default_batch_fetch_size |
関連付けの Hibernate 一括フェッチに対するデフォルトサイズを設定します。推奨される値は
4 、 8 、16 です。
|
hibernate.default_entity_mode | SessionFactory より開かれたすべてのセッションに対するエンティティー表現のデフォルトモードを設定します。値には dynamic-map 、 dom4j 、 pojo などが含まれます。
|
hibernate.order_updates |
ブール変数です。更新されたアイテムの主キー値によって Hibernate による SQL 更新の順番付けを強制します。これにより、高度な並列システムにおけるトランザクションデッドロックが軽減されます。
|
hibernate.generate_statistics |
ブール変数です。有効にすると、Hibernate はパフォーマンスのチューニングに便利な統計を収集します。
|
hibernate.use_identifier_rollback |
ブール変数です。有効にすると、オブジェクトが削除された時に生成された識別子プロパティーがデフォルト値にリセットされます。
|
hibernate.use_sql_comments |
ブール変数です。有効にすると、デバッグを簡単にするため Hibernate は SQL 内にコメントを生成します。デフォルト値は
false です。
|
hibernate.id.new_generator_mappings |
ブール変数です。
@GeneratedValue を使用する場合に関係するプロパティーです。新しい IdentifierGenerator 実装が javax.persistence.GenerationType.AUTO や javax.persistence.GenerationType.TABLE 、 javax.persistence.GenerationType.SEQUENCE に対して使用されるかどうかを示します。後方互換性を維持するため、デフォルト値は false になっています。
|
重要
@GeneratedValue
を使用する新しいプロジェクトは hibernate.id.new_generator_mappings=true
も設定することが推奨されます。これは、新しいジェネレーターはより効率的で JPA 2 仕様のセマンティックに近いためです。
10.2.4.2. Hibernate JDBC と接続プロパティー
表10.2 プロパティー
プロパティー名 | 説明 |
---|---|
hibernate.jdbc.fetch_size |
JDBC のフェッチサイズを判断するゼロでない値です (
Statement.setFetchSize() を呼び出します)。
|
hibernate.jdbc.batch_size |
Hibernate による JDBC2 バッチ更新の使用を有効にするゼロでない値です。
5 から 30 までの値が推奨されます。
|
hibernate.jdbc.batch_versioned_data |
ブール変数です。JDBC ドライバーが
executeBatch() より正しい行数を返す場合はこのプロパティーを true に設定します。Hibernate は自動バージョン化されたデータにバッチ処理された DML を使用します。デフォルト値は false です。
|
hibernate.jdbc.factory_class |
カスタム
org.hibernate.jdbc.Batcher を選択します。ほとんどのアプリケーションにはこの設定プロパティーは必要ありません。
|
hibernate.jdbc.use_scrollable_resultset |
ブール変数。Hibernate による JDBC2 のスクロール可能な結果セットの使用を有効にします。このプロパティーはユーザー提供による JDBC 接続を使用する場合のみ必要です。その他の場合、Hibernate は接続メタデータを使用します。
|
hibernate.jdbc.use_streams_for_binary |
ブール変数です。システムレベルのプロパティーです。
binary または serializable 型を JDBC へ読み書きしたり、JDBC より読み書きする場合にストリームを使用します。
|
hibernate.jdbc.use_get_generated_keys |
ブール変数です。JDBC3
PreparedStatement.getGeneratedKeys() を使用して、挿入後にネイティブに生成された鍵を読み出します。JDBC3+ ドライバーと JRE1.4+ が必要です。JDBC ドライバーに Hibernate 識別子ジェネレーターの問題がある場合は false に設定します。デフォルトでは、接続メタデータを使用してドライバーの機能を判断しようとします。
|
hibernate.connection.provider_class |
JDBC 接続を Hibernate に提供するカスタム
org.hibernate.connection.ConnectionProvider のクラス名です。
|
hibernate.connection.isolation |
JDBC トランザクションの分離レベルを設定します。意味のある値は
java.sql.Connection をチェックしますが、データベースのほとんどは分離レベルをすべてサポートせず、非標準的な分離を追加的に定義するものもあります。標準的な値は 1, 2, 4, 8 です。
|
hibernate.connection.autocommit |
ブール変数です。このプロパティーの使用は推奨されません。JDBC でプールされた接続に対して自動コミットを有効にします。
|
hibernate.connection.release_mode |
Hibernate が JDBC 接続を開放しなければならない場合に指定します。デフォルトでは、セッションが明示的に閉じられるか切断されるまで JDBC 接続が保持されます。デフォルト値である
auto は JTA および CMT トランザクションストラテジー対して after_statement を選択し、JDBC トランザクションストラテジーには after_transaction を選択します。
使用可能な値は
auto (デフォルト) | on_close | after_transaction | after_statement です。
この設定は
SessionFactory.openSession より返された Session のみに影響します。SessionFactory.getCurrentSession より取得された Session では、使用するため設定されたCurrentSessionContext 実装がこれら Session の接続開放モードを制御します。
|
hibernate.connection. <propertyName> |
JDBC プロパティー <propertyName> を
DriverManager.getConnection() に渡します。
|
hibernate.jndi. <propertyName> |
プロパティー <propertyName> を JNDI
InitialContextFactory に渡します。
|
10.2.4.3. Hibernate キャッシュプロパティー
表10.3 プロパティー
プロパティー名 | 説明 |
---|---|
hibernate.cache.provider_class |
カスタム
CacheProvider のクラス名。
|
hibernate.cache.use_minimal_puts |
ブール変数です。2 次キャッシュの操作を最適化し、読み取りの回数を増やして書き込みを最小限にします。これはクラスター化されたキャッシュで最も便利な設定で、Hibernate 3 ではクラスター化されたキャッシュの実装に対してデフォルトで有効になっています。
|
hibernate.cache.use_query_cache |
ブール変数です。クエリキャッシュを有効にします。各クエリをキャッシュ可能に設定する必要があります。
|
hibernate.cache.use_second_level_cache |
ブール変数です。
<cache> マッピングを指定するクラスに対してデフォルトで有効になっている 2 次 キャッシュを完全に無効にするため使用されます。
|
hibernate.cache.query_cache_factory |
カスタム
QueryCache インターフェースのクラス名です。デフォルトの値はビルトイン StandardQueryCache です。
|
hibernate.cache.region_prefix |
2 次キャッシュのリージョン名に使用するプレフィックスです。
|
hibernate.cache.use_structured_entries |
ブール変数です。人間が解読可能な形式でデータを 2 次キャッシュに保存するよう Hibernate を強制します。
|
hibernate.cache.default_cache_concurrency_strategy | @Cacheable か @Cache が使用される場合に使用するデフォルトの org.hibernate.annotations.CacheConcurrencyStrategy の名前を付与するため使用される設定です。@Cache(strategy="..") を使用してこのデフォルトが上書きされます。
|
10.2.4.4. Hibernate トランザクションプロパティー
表10.4 プロパティー
プロパティー名 | 説明 |
---|---|
hibernate.transaction.factory_class |
Hibernate
Transaction API と使用する TransactionFactory のクラス名です。デフォルトは JDBCTransactionFactory ) です。
|
jta.UserTransaction |
アプリケーションサーバーより JTA
UserTransaction を取得するため使用される JNDI 名。
|
hibernate.transaction.manager_lookup_class | TransactionManagerLookup のクラス名。JVM レベルのキャッシングが有効になっている場合や、JTA 環境の hilo ジェネレーターを使用する場合に必要となります。
|
hibernate.transaction.flush_before_completion |
ブール変数です。有効な場合、トランザクションの完了前フェーズの間にセッションが自動的にフラッシュされます。ビルトインおよび自動セッションコンテキスト管理が推奨されます。
|
hibernate.transaction.auto_close_session |
ブール変数です。有効な場合、トランザクションの完了前フェーズの間にセッションが自動的に閉じられます。ビルトインおよび自動セッションコンテキスト管理が推奨されます。
|
10.2.4.5. その他の Hibernate プロパティー
表10.5 プロパティー
プロパティー名 | 説明 |
---|---|
hibernate.current_session_context_class |
「現在」の
Session の範囲付けに対するカスタムストラテジーを提供します。値には jta | thread | managed | custom.Class があります。
|
hibernate.query.factory_class |
HQL パーサー実装を選択します。
org.hibernate.hql.internal.ast.ASTQueryTranslatorFactory か org.hibernate.hql.internal.classic.ClassicQueryTranslatorFactory を選択します。
|
hibernate.query.substitutions |
Hibernate クエリのトークンから SQL トークンへのマッピングに使用します (トークンは関数やリテラル名である場合があります)。 例:
hqlLiteral=SQL_LITERAL, hqlFunction=SQLFUNC
|
hibernate.hbm2ddl.auto | SessionFactory が作成されると、スキーマ DDL をデータベースへ検証またはエクスポートします。create-drop を使用すると、 SessionFactory が明示的に閉じられた時にデータベーススキーマがドロップされます。プロパティー値のオプションは validate | update | create | create-drop になります。
|
hibernate.hbm2ddl.import_files | SessionFactory 作成中に実行される SQL DML ステートメントが含まれる任意ファイルの名前 (コンマ区切り) です。テストやデモに便利です。例えば、INSERT ステートメントを追加すると、デプロイされた時にデータベースに最小限のデータセットが投入されます。/humans.sql,/dogs.sql が値の例の 1 つ になります。
特定ファイルのステートメントは後続ファイルのステートメントの前に実行されるため、ファイルの順番に注意する必要があります。これらのステートメントはスキーマが作成された場合のみ実行されます (
hibernate.hbm2ddl.auto が create または create-drop に設定された場合など)。
|
hibernate.hbm2ddl.import_files_sql_extractor |
カスタム
ImportSqlCommandExtractor のクラス名です。デフォルトはビルトインの SingleLineSqlCommandExtractor です。各インポートファイルより単一の SQL ステートメントを抽出する専用のパーサーを実装する時に便利です。Hibernate は複数行にまたがる指示/コメントや引用符で囲まれた文字列をサポートする MultipleLinesSqlCommandExtractor も提供します (各ステートメントの最後にセミコロンが必要です)。
|
hibernate.bytecode.use_reflection_optimizer |
ブール変数です。
hibernate.cfg.xml ファイルには設定できないシステムレベルのプロパティーです。ランタイムリフレクションの代わりにバイトコード操作の使用を有効にします。リフレクションはトラブルシューティングを行う時に便利な場合があります。オプティマイザーが off の場合でも Hibernate には CGLIB か javassist が常に必要になります。
|
hibernate.bytecode.provider |
javassist または cglib をバイト操作エンジンとして使用することができます。デフォルトは
javassist です。プロパティー値は javassist か cglib になります。
|
10.2.4.6. Hibernate SQL 方言
重要
hibernate.dialect
プロパティーをアプリケーションデータベースの適切な org.hibernate.dialect.Dialect
サブクラスに設定する必要があります。方言が指定されている場合、Hibernate は他のプロパティーの一部に実用的なデフォルトを使用します。そのため、これらのプロパティーを手作業で指定する必要はありません。
表10.6 SQL 方言 (hibernate.dialect
)
RDBMS | 方言 |
---|---|
DB2 | org.hibernate.dialect.DB2Dialect |
DB2 AS/400 | org.hibernate.dialect.DB2400Dialect |
DB2 OS390 | org.hibernate.dialect.DB2390Dialect |
PostgreSQL | org.hibernate.dialect.PostgreSQLDialect |
MySQL5 | org.hibernate.dialect.MySQL5Dialect |
InnoDB を用いる MYSQL5 | org.hibernate.dialect.MySQL5InnoDBDialect |
MyISAM を用いる MySQL | org.hibernate.dialect.MySQLMyISAMDialect |
Oracle (全バージョン) | org.hibernate.dialect.OracleDialect |
Oracle 9i | org.hibernate.dialect.Oracle9iDialect |
Oracle 10g | org.hibernate.dialect.Oracle10gDialect |
Oracle 11g | org.hibernate.dialect.Oracle10gDialect |
Sybase | org.hibernate.dialect.SybaseASE15Dialect |
Sybase Anywhere | org.hibernate.dialect.SybaseAnywhereDialect |
Microsoft SQL Server 2000 | org.hibernate.dialect.SQLServerDialect |
Microsoft SQL Server 2005 | org.hibernate.dialect.SQLServer2005Dialect |
Microsoft SQL Server 2008 | org.hibernate.dialect.SQLServer2008Dialect |
SAP DB | org.hibernate.dialect.SAPDBDialect |
Informix | org.hibernate.dialect.InformixDialect |
HypersonicSQL | org.hibernate.dialect.HSQLDialect |
H2 Database | org.hibernate.dialect.H2Dialect |
Ingres | org.hibernate.dialect.IngresDialect |
Progress | org.hibernate.dialect.ProgressDialect |
Mckoi SQL | org.hibernate.dialect.MckoiDialect |
Interbase | org.hibernate.dialect.InterbaseDialect |
Pointbase | org.hibernate.dialect.PointbaseDialect |
FrontBase | org.hibernate.dialect.FrontbaseDialect |
Firebird | org.hibernate.dialect.FirebirdDialect |
10.2.5. 2 次キャッシュ
10.2.5.1. 2 次キャッシュについて
- Web セッションのクラスタリング
- ステートフルセッション Bean のクラスタリング
- SSO クラスタリング
- Hibernate 2 次キャッシュ
10.2.5.2. Hibernate が 2 次レベルキャッシュとして Infinispan を使用するよう設定します。
- タスクの概要
- このトピックでは、Hibernate の 2 次レベルキャッシュとして動作するよう Infinispan を有効にする場合の設定要件について説明します。
手順10.4 タスク
hibernate.cfg.xml ファイルを作成します。
デプロイメントのクラスパスでhibernate.cfg.xml
を作成します。詳細については、「JBoss Developer Studio の Hibernate 設定ファイルの作成」 を参照してください。- XML の次の行をアプリケーションの
hibernate.cfg.xml
ファイルに追加します。この XML は <session-factory> タグ内部にある必要があります。<property name="hibernate.cache.use_second_level_cache">true</property> <property name="hibernate.cache.use_query_cache">true</property>
- 以下のいずれかを
hibernate.cfg.xml
ファイルの <session-factory> セクションに追加します。Infinispan CacheManager が JNDI にバインドされる場合:
<property name="hibernate.cache.region.factory_class"> org.hibernate.cache.infinispan.JndiInfinispanRegionFactory </property> <property name="hibernate.cache.infinispan.cachemanager"> java:CacheManager </property>
Infinispan CacheManager がスタンドアローンである場合:
<property name="hibernate.cache.region.factory_class"> org.hibernate.cache.infinispan.InfinispanRegionFactory </property>
Infinispan が Hibernate の 2 次レベルキャッシュとして設定されます。
10.3. Hibernate アノテーション
10.3.1. Hibernate アノテーション
表10.7 Hibernate によって定義されるアノテーション
アノテーション | 説明 |
---|---|
AccessType | プロパティーのアクセスタイプ。 |
Any | 複数のエンティティータイプを示す ToOne 関連を定義します。 メタデータ弁別子カラムより according エンティティータイプを一致します。このようなマッピングは最低限にするべきです。 |
AnyMetaDef | @Any および @manyToAny メタデータを定義します。 |
AnyMedaDefs | @Any および @ManyToAny のメタデータセットを定義します。エンティティーレベルまたはパッケージレベルで定義が可能です。 |
BatchSize | SQL ローディングのバッチサイズ。 |
Cache | ルートエンティティーまたはコレクションにキャッシングストラテジーを追加します。 |
Cascade | 関連付けにカスケードストラテジーを適用します。 |
Check | クラス、プロパティー、コレクションのいずれかのレベルで定義できる任意の SQL チェック制約です。 |
Columns | カラムのアレイをサポートします。コンポーネントユーザータイプのマッピングに便利です。 |
ColumnTransformer | カラムからの値の読み取りやカラムへの値の書き込みに使用されるカスタム SQL 表現です。直接的なオブジェクトのロードや保存、クエリに使用されます。write 表現には必ず値に対して 1 つの 「?」 プレースホルダーが含まれなければなりません。 |
ColumnTransformers | @ColumnTransformer の複数アノテーションです。複数のカラムがこの挙動を使用する場合に便利です。 |
DiscriminatorFormula | ルートエントリーに置かれる弁別子の公式です。 |
DiscriminatorOptions | Hibernate 固有の弁別子プロパティーを表現する任意のアノテーションです。 |
Entity | Hibernate の機能でエンティティーを拡張します。 |
Fetch | 特定の関連に使用されるフェッチングストラテジーを定義します。 |
FetchProfile | フェッチングストラテジープロファイルを定義します。 |
FetchProfiles | @FetchProfile の複数アノテーション。 |
Filter | エンティティーまたはコレクションのターゲットエンティティーにフィルターを追加します。 |
FilterDef | フィルター定義。 |
FilterDefs | フィルター定義のアレイ。 |
FilterJoinTable | 結合テーブルのコレクションへフィルターを追加します。 |
FilterJoinTables | 複数の @FilterJoinTable をコレクションへ追加します。 |
Filters | 複数の @Filters を追加します。 |
Formula | ほとんどの場所で @Column の代替として使用されます。公式は有効な SQL フラグメントである必要があります。 |
Generated | このアノテーション付けされたプロパティーはデータベースによって生成されます。 |
GenericGenerator | Hibernate ジェネレーターをデタイプを用いて記述するジェネレーターアノテーションです。 |
GenericGenerators | 汎用ジェネレーター定義のアレイ。 |
Immutable |
エンティティーまたはコレクションを不変としてマーク付けします。アノテーションがない場合、要素は可変となります。
不変のエンティティーはアプリケーションによって更新されないことがあります。不変エンティティーへの更新は無視されますが、例外はスローされません。
@Immutable をコレクションに付けるとコレクションは不変になるため、コレクションからの追加や削除およびコレクションへの追加や削除は許可されません。よって HibernateException がスローされます。
|
Index | データベースのインデックスを定義します。 |
JoinFormula | ほとんどの場所で @JoinColumn の代替として使用されます。公式は有効な SQL フラグメントである必要があります。 |
LazyCollection | コレクションのレイジー状態を定義します。 |
LazyToOne | ToOne 関連のレイジー状態を定義します (OneToOne や ManyToOne など)。 |
Loader | Hibernate のデフォルトである FIND メソッドを上書きします。 |
ManyToAny | 異なるエンティティー型を示す ToMany 関連を定義します。 メタデータ弁別子カラムより according エンティティータイプを一致します。このようなマッピングは最低限にするべきです。 |
MapKeyType | 永続マップのキータイプを定義します。 |
MetaValue | 特定のエンティティータイプへ関連付けられる弁別子の値を表します。 |
NamedNativeQueries | Hibernate NamedNativeQuery オブジェクトを保持するよう NamedNativeQueries を拡張します。 |
NamedNativeQuery | Hibernate の機能で NamedNativeQuery を拡張します。 |
NamedQueries | Hibernate NamedQuery オブジェクトを保持するよう NamedQuery を拡張します。 |
NamedQuery | Hibernate の機能で NamedQuery を拡張します。 |
NaturalId | プロパティーがエンティティーのナチュラル ID の一部であることを指定します。 |
NotFound | 関連上で要素が見つからなかった時に実行するアクションです。 |
OnDelete | コレクションやアレイ、結合されたサブクラスの削除に使用されるストラテジーです。OnDelete の 2 次テーブルはサポートされていません。 |
OptimisticLock | アノテーション付けされたプロパティーの変更によってエンティティーのバージョン番号が増加するかどうか。アノテーション付けされていない場合、プロパティーは楽観的ロックストラテジー (デフォルト) に関与します。 |
OptimisticLocking | エンティティーに適用される楽観的ロックのスタイルを定義するため使用されます。階層ではルートエンティティーのみに有効です。 |
OrderBy | SQL の順序付け (HQL の順序付けではない) を使用してコレクションの順序を付けます。 |
ParamDef | パラメーターの定義。 |
Parameter | キーと値のパターン。 |
Parent | 所有者 (通常は所有するエンティティー) へ戻るポインターとしてプロパティーを参照します。 |
Persister | カスタムパーシスターを指定します。 |
Polymorphism | Hibernate がエンティティーの階層に適用する多様性タイプを定義するため使用されます。 |
Proxy | 特定クラスのレイジーおよびプロキシ設定。 |
RowId | Hibernate の ROWID マッピング機能をサポートします。 |
Sort | コレクションのソート (Java レベルのソート)。 |
Source | バージョンおよびタイムスタンプバージョンプロパティーと併用するのに最適なアノテーションです。アノテーション値はタイムスタンプが生成される場所を決定します。 |
SQLDelete | Hibernate のデフォルトである DELETE メソッドを上書きします。 |
SQLDeleteAll | Hibernate のデフォルトである DELETE ALL メソッドを上書きします。 |
SQLInsert | Hibernate のデフォルトである INSERT INFO メソッドを上書きします。 |
SQLUpdate | Hibernate のデフォルトである UPDATE メソッドを上書きします。 |
Subselect | 不変の読み取り専用エンティティーを指定のサブセレクト表現へマッピングします。 |
Synchronize | 自動フラッシュが適切に行われ、派生したエンティティーに対するクエリが陳腐データを返さないようにします。ほとんどの場合でサブセレクトと共に使用されます。 |
Table | 1 次または 2 次テーブルへの補足情報。 |
Tables | Table の複数アノテーション。 |
Target | 明示的なターゲットを定義し、リフレクションやジェネリクスで解決しないようにします。 |
Tuplizer | 1 つのエンティティーまたはコンポーネントに対して単一の tuplizer を定義します。 |
Tuplizers | 1 つのエンティティーまたはコンポーネントに対して tuplizer のセットを定義します。 |
Type | Hibernate のタイプ。 |
TypeDef | Hibernate タイプの定義。 |
TypeDefs | Hibernate タイプ定義のアレイ。 |
Where | 要素エンティティーまたはコレクションのターゲットエンティティーへ追加する where 節。この節は SQL で書かれます。 |
WhereJoinTable | コレクション結合テーブルへ追加する where 節。この節は SQL で書かれます。 |
10.4. Hibernate クエリ言語
10.4.1. Hibernate クエリ言語
10.4.2. HQL ステートメント
SELECT
、 UPDATE
、 DELETE
、および INSERT
ステートメントを許可します。JPQL には HQL の INSERT
ステートメントに相当するステートメントはありません。
重要
UPDATE
または DELETE
ステートメントを実行する場合は注意してください。
表10.8 HQL ステートメント
ステートメント | 説明 |
---|---|
SELECT |
HQL の
SELECT ステートメントの BNF は次の通りです。
select_statement :: = [select_clause] from_clause [where_clause] [groupby_clause] [having_clause] [orderby_clause]
最も簡単な HQL の
SELECT ステートメントは次のような形式になります。
from com.acme.Cat |
UDPATE | HQL の UPDATE ステートメントの BNF は JPQL と同じです。 |
DELETE | HQL の DELETE ステートメントの BNF は JPQL と同じです。 |
10.4.3. INSERT ステートメントについて
INSERT
ステートメントを定義する機能を追加します。これに相当するステートメントは JPQL にはありません。HQL の INSERT
ステートメントの BNF は次の通りです。
insert_statement ::= insert_clause select_statement insert_clause ::= INSERT INTO entity_name (attribute_list) attribute_list ::= state_field[, state_field ]*
attribute_list
は、SQL INSERT
ステートメントの column specification
と似ています。マップされた継承に関係するエンティティーでは、名前付きエンティティー上で直接定義された属性のみを attribute_list
で使用することが可能です。スーパークラスプロパティーは許可されず、サブクラスプロパティーは意味がありません。よって、 INSERT
ステートメントは本質的に非多形となります。
警告
select_statement
はあらゆる有効な HQL select クエリになりえますが、戻り型は挿入が想定する型と一致しなければなりません。現在、型の一致はクエリのコンパイル中にチェックされ、チェックはデータベースへ委譲されません。そのため、同じ Hibernate タイプではなく相当 する Hibernate タイプの間で問題が生じる可能性があります。例えば、データベースによって区別されず、変換処理を行える可能性があっても、org.hibernate.type.DateType
としてマップされた属性と、 org.hibernate.type.TimestampType
として定義された属性との不一致が問題となる可能性があります。
attribute_list
に明示的に指定するオプションで、この場合、値は対応する select 式から取得されます。2 つ目は attribute_list
に指定しないオプションで、この場合生成された値が使用されます。2 つ目のオプションは、「データベース内」で操作する id ジェネレーターを使用する場合のみ選択可能です。このオプションを「インメモリ」タイプのジェネレーターで使用すると構文解析中に例外が生じます。
attribute_list
に属性を指定するオプションで、この場合、値は対応する select 式から取得されます。2 つ目は attribute_list
に指定しないオプションで、この場合、対応する org.hibernate.type.VersionType
によって定義される seed value
が使用されます。
例10.3 INSERT クエリステートメントの例
String hqlInsert = "insert into DelinquentAccount (id, name) select c.id, c.name from Customer c where ..."; int createdEntities = s.createQuery( hqlInsert ).executeUpdate();
10.4.4. FROM 節について
FROM
節の役割は、他のクエリが使用できるオブジェクトモデルタイプの範囲を定義することです。また、他のクエリが使用できる「ID 変数」もすべて定義します。
10.4.5. WITH 節について
WITH
節を定義し、結合条件を限定します。これは HQL に固有の機能で、JPQL はこの機能を定義しません。
例10.4 with-clause 結合の例
select distinct c from Customer c left join c.orders o with o.value > 5000.00
with clause
の条件が生成された SQL の on clause
の一部となりますが、本項の他のクエリでは HQL/JPQL の条件が生成された SQL の where clause
の一部となることが重要な違いです。この例に特有の違いは重要ではないでしょう。さらに複雑なクエリでは、with clause
が必要になることがあります。
10.4.6. コレクションメンバーの参照について
例10.5 コレクション参照の例
select c from Customer c join c.orders o join o.lineItems l join l.product p where o.status = 'pending' and p.status = 'backorder' // alternate syntax select c from Customer c, in(c.orders) o, in(o.lineItems) l join l.product p where o.status = 'pending' and p.status = 'backorder'
Customer#orders
アソシエーションの要素タイプであるオブジェクトモデルタイプ Order
を ID 変数 o
が実際に参照します。
IN
構文を使用してコレクションアソシエーション結合を指定する代替の構文があります。構文は両方同等です。アプリケーションは好きな構文を選択します。
10.4.7. 限定パス式について
表10.9 限定パス式
式 | 説明 |
---|---|
VALUE |
コレクション値を参照します。限定子を指定しないことと同じです。目的を明示的に表す場合に便利です。コレクション値 (collection-valued) の参照のすべてのタイプに対して有効です。
|
INDEX |
HQL ルールによると、マップキーまたはリストの場所 (OrderColumn の値) へ参照するよう
javax.persistence.OrderColumn を指定するマップとリストに対して有効です。JPQL では List の使用に対して確保され、MAP に対して KEY を追加します。JPA プロバイダーの移植性に関心があるアプリケーションは、この違いに注意する必要があります。
|
KEY |
マップに対してのみ有効です。マップのキーを参照します。キー自体がエンティティーである場合、更にナビゲートすることが可能です。
|
ENTRY |
マップに対してのみ有効です。マップの論理
java.util.Map.Entry タプル (キーと値の組み合わせ) を参照します。ENTRY は終端パスとしてのみ有効で、select 節のみで有効になります。
|
例10.6 限定コレクション参照の例
// Product.images is a Map<String,String> : key = a name, value = file path // select all the image file paths (the map value) for Product#123 select i from Product p join p.images i where p.id = 123 // same as above select value(i) from Product p join p.images i where p.id = 123 // select all the image names (the map key) for Product#123 select key(i) from Product p join p.images i where p.id = 123 // select all the image names and file paths (the 'Map.Entry') for Product#123 select entry(i) from Product p join p.images i where p.id = 123 // total the value of the initial line items for all orders for a customer select sum( li.amount ) from Customer c join c.orders o join o.lineItems li where c.id = 123 and index(li) = 1
10.4.8. スカラー関数について
10.4.9. HQL の標準化された関数
表10.10 HQL の標準化された関数
関数 | 説明 |
---|---|
BIT_LENGTH |
バイナリデータの長さを返します。
|
CAST |
SQL キャストを実行します。キャストターゲットが使用する Hibernate マッピングタイプの名前を付けるはずです。詳細はデータタイプに関する章を参照してください。
|
EXTRACT |
datetime 値で SQL の抽出を実行します。抽出により、datetime 値の一部が抽出されます (年など)。以下の省略形を参照してください。
|
SECOND |
秒を抽出する抽出の省略形。
|
MINUTE |
分を抽出する抽出の省略形。
|
HOUR |
時間を抽出する抽出の省略形。
|
DAY |
日を抽出する抽出の省略形。
|
MONTH |
月を抽出する抽出の省略形。
|
YEAR |
年を抽出する抽出の省略形。
|
STR |
値を文字データとしてキャストする省略形
|
org.hibernate.cfg.Configuration
の addSqlFunction
メソッドを使用して宣言します。
10.4.10. 連結演算について
CONCAT
) 関数をサポートするだけでなく、連結演算子も定義します。連結演算子は JPQL によっては定義されないため、移植可能なアプリケーションでは使用しない方がよいでしょう。連結演算子は SQL の連結演算子である ||
用います。
例10.7 連結演算の例
select 'Mr. ' || c.name.first || ' ' || c.name.last from Customer c where c.gender = Gender.MALE
10.4.11. 動的インスタンス化について
例10.8 動的インスタンス化の例 - コンストラクター
select new Family( mother, mate, offspr ) from DomesticCat as mother join mother.mate as mate left join mother.kittens as offspr
例10.9 動的インスタンス化の例 - リスト
select new list(mother, offspr, mate.name) from DomesticCat as mother inner join mother.mate as mate left outer join mother.kittens as offspr
例10.10 動的インスタンス化の例 - マップ
select new map( mother as mother, offspr as offspr, mate as mate ) from DomesticCat as mother inner join mother.mate as mate left outer join mother.kittens as offspr select new map( max(c.bodyWeight) as max, min(c.bodyWeight) as min, count(*) as n ) from Cat cxt"/>
10.4.12. HQL 述語について
TRUE
または FALSE
の真理値で解決しますが、NULL が関係するブール値の比較は UNKNOWN
で解決します。
HQL 述語
- NULL 述語
- NULL の値をチェックします。基本的な属性参照、エンティティー参照、およびパラメーターへ適用できます。HQL はコンポーネント/埋め込み可能タイプへの適用も許可します。
例10.11 NULL チェックの例
// select everyone with an associated address select p from Person p where p.address is not null // select everyone without an associated address select p from Person p where p.address is null
- LIKE 述語
- 文字列値で LIKE 比較を実行します。構文は次の通りです。
like_expression ::= string_expression [NOT] LIKE pattern_value [ESCAPE escape_character]
セマンティックは SQL の LIKE 式に従います。pattern_value
は、string_expression
で一致を試みるパターンです。SQL と同様に、pattern_value
に「_」や「%」をワイルドカードとして使用できます。意味も同じで、「_」はあらゆる 1 つの文字と一致し、「%」はあらゆる数の文字と一致します。任意のescape_character
は、pattern_value
の「_」や「%」をエスケープするために使用するエスケープ文字を指定するために使用されます。「_」や「%」が含まれるパターンを検索する必要がある場合に役立ちます。例10.12 LIKE 述語の例
select p from Person p where p.name like '%Schmidt' select p from Person p where p.name not like 'Jingleheimmer%' // find any with name starting with "sp_" select sp from StoredProcedureMetadata sp where sp.name like 'sp|_%' escape '|'
- BETWEEN 述語
- SQL の
BETWEEN
式と同様です。値が他の 2 つの値の間にあることを評価するため実行します。演算対象はすべて比較可能な型を持つ必要があります。例10.13 BETWEEN 述語の例
select p from Customer c join c.paymentHistory p where c.id = 123 and index(p) between 0 and 9 select c from Customer c where c.president.dateOfBirth between {d '1945-01-01'} and {d '1965-01-01'} select o from Order o where o.total between 500 and 5000 select p from Person p where p.name between 'A' and 'E'
10.4.13. 関係比較について
例10.14 関係比較の例
// numeric comparison select c from Customer c where c.chiefExecutive.age < 30 // string comparison select c from Customer c where c.name = 'Acme' // datetime comparison select c from Customer c where c.inceptionDate < {d '2000-01-01'} // enum comparison select c from Customer c where c.chiefExecutive.gender = com.acme.Gender.MALE // boolean comparison select c from Customer c where c.sendEmail = true // entity type comparison select p from Payment p where type(p) = WireTransferPayment // entity value comparison select c from Customer c where c.chiefExecutive = c.chiefTechnologist
ALL
、 ANY
、 SOME
も関与します。SOME
と ANY
は同義です。
ALL
限定子は true に解決されます。サブクエリの結果が空の場合は false に解決されます。
例10.15 ALL サブクエリ比較限定子の例
// select all players that scored at least 3 points // in every game. select p from Player p where 3 > all ( select spg.points from StatsPerGame spg where spg.player = p )
ANY
または SOME
限定子は true に解決されます。サブクエリの結果が空である場合、false に解決されます。
10.4.14. IN 述語
IN
述語は、値のリストに特定の値があることを確認するチェックを行います。構文は次の通りです。
in_expression ::= single_valued_expression [NOT] IN single_valued_list single_valued_list ::= constructor_expression | (subquery) | collection_valued_input_parameter constructor_expression ::= (expression[, expression]*)
single_valued_expression
のタイプと single_valued_list
の各値は一致しなければなりません。JPQL は有効なタイプを文字列、数字、日付、時間、タイムスタンプ、列挙型に限定します。JPQL では、 single_valued_expression
は下記のみを参照できます。
- 簡単な属性を表す「ステートフィールド」。アソシエーションとコンポーネント/埋め込み属性を明確に除外します。
- エンティティータイプの式。
single_valued_expression
はさらに広範囲の式タイプを参照することが可能です。単一値のアソシエーションは許可されます。コンポーネント/埋め込み属性も許可されますが、この機能は、基礎となるデータベースのタプルまたは「行値コンストラクター構文」へのサポートのレベルに依存します。また、HQL は値タイプを制限しませんが、基礎となるデータベースのべンダーによってはサポートが制限されるタイプがあることをアプリケーション開発者は認識しておいたほうがよいでしょう。これが JPQL の制限の主な原因となります。
constructor_expression
と collection_valued_input_parameter
では、空の値のリストは許可されず、最低でも 1 つの値が含まれなければなりません。
例10.16 IN 述語の例
select p from Payment p where type(p) in (CreditCardPayment, WireTransferPayment) select c from Customer c where c.hqAddress.state in ('TX', 'OK', 'LA', 'NM') select c from Customer c where c.hqAddress.state in ? select c from Customer c where c.hqAddress.state in ( select dm.state from DeliveryMetadata dm where dm.salesTax is not null ) // Not JPQL compliant! select c from Customer c where c.name in ( ('John','Doe'), ('Jane','Doe') ) // Not JPQL compliant! select c from Customer c where c.chiefExecutive in ( select p from Person p where ... )
10.4.15. HQL の順序付けについて
ORDER BY
節を使用して、結果を順序付けするために使用される選択値を指定します。order-by 節の一部として有効な式タイプには以下が含まれます。
- ステートフィールド
- コンポーネント/埋め込み可能属性
- 算術演算や関数などのスカラー式。
- 前述の式タイプのいずれかに対する select 節に宣言された ID 変数。
ASC
(昇順) または DESC
(降順) で希望の順序を示し限定することができます。
例10.17 ORDER BY の例
// legal because p.name is implicitly part of p select p from Person p order by p.name select c.id, sum( o.total ) as t from Order o inner join o.customer c group by c.id order by t
10.5. Hibernate サービス
10.5.1. Hibernate サービスについて
10.5.2. サービスコントラクトについて
org.hibernate.service.Service
を実装することがサービスの基本的な要件になります。Hibernate は基本的なタイプセーフのために内部でこのインターフェースを使用します。
org.hibernate.service.spi.Startable
および org.hibernate.service.spi.Stoppable
インターフェースを任意で実装することもできます。その他に、JMX 統合が有効になっている場合に JMX でサービスを管理可能としてマーク付けする org.hibernate.service.spi.Manageable
という任意のサービスコントラクトがあります。
10.5.3. サービス依存関係のタイプ
- @
org.hibernate.service.spi.InjectService
- 単一のパラメーターを許可するサービス実装上のすべてのメソッドと、@
InjectService
アノテーションが付けられているメソッドは、他のサービスの挿入を要求していると見なされます。デフォルトではメソッドパラメーターのタイプは、挿入されるサービスロールであると想定されます。パラメータータイプがサービスロールではない場合、InjectService
のserviceRole
属性を使用してロールを明示的に指定する必要があります。デフォルトでは、挿入されたサービスは必須のサービスであると見なされます。そのため、名前付けされた依存サービスがない場合、起動に失敗します。挿入されるサービスが任意のサービスである場合、InjectService
のrequired
属性をfalse
として宣言する必要があります (デフォルトはtrue
です)。 org.hibernate.service.spi.ServiceRegistryAwareService
- 2 つ目の方法は、単一の
injectServices
メソッドを宣言する任意のサービスインターフェースorg.hibernate.service.spi.ServiceRegistryAwareService
をサービスが実装する方法です。起動中、Hibernate はorg.hibernate.service.ServiceRegistry
自体をこのインターフェースが実装するサービスに挿入します。その後、サービスはServiceRegistry
参照を使用して、必要な他のサービスを見つけることができます。
10.5.4. ServiceRegistry
10.5.4.1. ServiceRegistry について
org.hibernate.service.ServiceRegistry
インターフェースです。サービスレジストリーの主な目的は、サービスを保持管理し、サービスへのアクセスを提供することです。
org.hibernate.service.ServiceRegistryBuilder
を使用して org.hibernate.service.ServiceRegistry
インスタンスをビルドします。
例10.18 ServiceRegistryBuilder を使用した ServiceRegistry の作成
ServiceRegistryBuilder registryBuilder = new ServiceRegistryBuilder( bootstrapServiceRegistry ); ServiceRegistry serviceRegistry = registryBuilder.buildServiceRegistry();
10.5.5. カスタムサービス
10.5.5.1. カスタムサービスについて
org.hibernate.service.ServiceRegistry
は不変であると見なされます。サービス自体は再設定を許可することもありますが、ここで言う不変とはサービスの追加や置換を意味します。そのため org.hibernate.service.ServiceRegistryBuilder
によって提供される別のロールは、生成された org.hibernate.service.ServiceRegistry
に格納されるサービスを微調整できるようにします。
org.hibernate.service.ServiceRegistryBuilder
に通知する方法は 2 つあります。
org.hibernate.service.spi.BasicServiceInitiator
クラスを実装してサービスクラスの要求に応じた構築を制御し、addInitiator
メソッドよりorg.hibernate.service.ServiceRegistryBuilder
へ追加します。- サービスクラスをインスタンス化し、
addService
メソッドよりorg.hibernate.service.ServiceRegistryBuilder
へ追加します。
例10.19 ServiceRegistryBuilder を用いた既存サービスのカスタマーサービスへの置き換え
ServiceRegistryBuilder registryBuilder = new ServiceRegistryBuilder( bootstrapServiceRegistry ); serviceRegistryBuilder.addService( JdbcServices.class, new FakeJdbcService() ); ServiceRegistry serviceRegistry = registryBuilder.buildServiceRegistry(); public class FakeJdbcService implements JdbcServices{ @Override public ConnectionProvider getConnectionProvider() { return null; } @Override public Dialect getDialect() { return null; } @Override public SqlStatementLogger getSqlStatementLogger() { return null; } @Override public SqlExceptionHelper getSqlExceptionHelper() { return null; } @Override public ExtractedDatabaseMetaData getExtractedMetaDataSupport() { return null; } @Override public LobCreator getLobCreator(LobCreationContext lobCreationContext) { return null; } @Override public ResultSetWrapper getResultSetWrapper() { return null; } @Override public JdbcEnvironment getJdbcEnvironment() { return null; } }
10.5.6. ブートストラップレジストリ
10.5.6.1. ブートストラップレジストリーについて
ClassLoaderService
で、代表的な例になります。設定ファイルの解決にもクラスローディングサービス (リソースのルックアップ) へのアクセスが必要になります。通常の使用ではこれがルートレジストリーになります。
org.hibernate.service.BootstrapServiceRegistryBuilder
クラスを使用して構築されます。
10.5.6.2. BootstrapServiceRegistryBuilder の使用
例10.20 BootstrapServiceRegistryBuilder の使用
BootstrapServiceRegistry bootstrapServiceRegistry = new BootstrapServiceRegistryBuilder() // pass in org.hibernate.integrator.spi.Integrator instances which are not // auto-discovered (for whatever reason) but which should be included .with( anExplicitIntegrator ) // pass in a class-loader Hibernate should use to load application classes .withApplicationClassLoader( anExplicitClassLoaderForApplicationClasses ) // pass in a class-loader Hibernate should use to load resources .withResourceClassLoader( anExplicitClassLoaderForResources ) // see BootstrapServiceRegistryBuilder for rest of available methods ... // finally, build the bootstrap registry with all the above options .build();
10.5.6.3. BootstrapRegistry サービス
org.hibernate.service.classloading.spi.ClassLoaderService
- アプリケーションクラスを見つける機能
- 統合クラスを見つける機能
- リソース (プロパティーファイル、xml ファイルなど) を見つける機能
java.util.ServiceLoader
をロードする機能
注記
org.hibernate.integrator.spi.IntegratorService
org.hibernate.service.classloading.spi.ClassLoaderService
によって提供される標準の Java java.util.ServiceLoader
機能を使用して、org.hibernate.integrator.spi.Integrator
コントラクトの実装をディスカバリします。
/META-INF/services/org.hibernate.integrator.spi.Integrator
という名前のファイルを定義し、クラスパス上で使用できるようにします。java.util.ServiceLoader
は詳細にこのファイルの形式をカバーしますが、本質的に org.hibernate.integrator.spi.Integrator
を行ごとに実装する FQN によるクラスを一覧表示します。
10.5.7. SessionFactory レジストリ
10.5.7.1. SessionFactory レジストリ
org.hibernate.SessionFactory
のターゲットとして扱うことが最良の方法ですが、このグループのサービスのインスタンスは明示的に 1 つの org.hibernate.SessionFactory
に属します。
org.hibernate.SessionFactory
にアクセスする必要があります。この特別なレジストリは org.hibernate.service.spi.SessionFactoryServiceRegistry
です。
10.5.7.2. SessionFactory サービス
org.hibernate.event.service.spi.EventListenerRegistry
- 説明
- イベントリスナーを管理するサービス。
- イニシエーター
org.hibernate.event.service.internal.EventListenerServiceInitiator
- 実装
org.hibernate.event.service.internal.EventListenerRegistryImpl
10.5.8. インテグレーター
10.5.8.1. インテグレーター
org.hibernate.integrator.spi.Integrator
の目的は、機能する SessionFactory のビルドプロセスを開発者がフックできるようにする簡単な手段を提供することです。org.hibernate.integrator.spi.Integrator
インターフェースは、ビルドプロセスをフックできるようにする integrate
と、終了する SessionFactory をフックできるようにする disintegrate
の 2 つのメソッドを定義します。
注記
org.hibernate.cfg.Configuration
の代わりに org.hibernate.metamodel.source.MetadataImplementor
を許可するオーバーロードした形式の integrate
は、org.hibernate.integrator.spi.Integrator
で定義される 3 つ目のメソッドになります。
10.5.8.2. インテグレーターのユースケース
org.hibernate.integrator.spi.Integrator
の主なユースケースは、イベントリスナーの登録とサービスの提供になります (org.hibernate.integrator.spi.ServiceContributingIntegrator
を参照)。5.0 では、オブジェクトとリレーショナルモデルとの間のマッピングを記述するメタモデルを変更可能するための拡張を計画しています。
例10.21 イベントリスナーの登録
public class MyIntegrator implements org.hibernate.integrator.spi.Integrator { public void integrate( Configuration configuration, SessionFactoryImplementor sessionFactory, SessionFactoryServiceRegistry serviceRegistry) { // As you might expect, an EventListenerRegistry is the thing with which event listeners are registered It is a // service so we look it up using the service registry final EventListenerRegistry eventListenerRegistry = serviceRegistry.getService( EventListenerRegistry.class ); // If you wish to have custom determination and handling of "duplicate" listeners, you would have to add an // implementation of the org.hibernate.event.service.spi.DuplicationStrategy contract like this eventListenerRegistry.addDuplicationStrategy( myDuplicationStrategy ); // EventListenerRegistry defines 3 ways to register listeners: // 1) This form overrides any existing registrations with eventListenerRegistry.setListeners( EventType.AUTO_FLUSH, myCompleteSetOfListeners ); // 2) This form adds the specified listener(s) to the beginning of the listener chain eventListenerRegistry.prependListeners( EventType.AUTO_FLUSH, myListenersToBeCalledFirst ); // 3) This form adds the specified listener(s) to the end of the listener chain eventListenerRegistry.appendListeners( EventType.AUTO_FLUSH, myListenersToBeCalledLast ); } }
10.6. Bean Validation
10.6.1. Bean 検証について
bean-validation
クイックスタートの例: 「Java EE クイックスタートの例へのアクセス」 を参照してください。
10.6.2. Hibernate バリデーター
10.6.3. バリデーション制約
10.6.3.1. バリデーション制約について
10.6.3.2. JBoss Developer Studio で制約アノテーションを作成
このタスクでは、Java アプリケーションで利用できるように、JBoss Developer Studio で制約アノテーションを作成するプロセスを説明します。
手順10.5 タスク
- JBoss Developer Studio で Java プロジェクトを開きます。
データセットの作成
制約アノテーションには、許容値を定義するデータセットが必要です。- [Project Explorer] パネルのプロジェクトのルートフォルダーを右クリックします。
- [New] → [Enum] を選択します。
- 以下の要素を設定してください。
- [Package:]
- [Name:]
- [Add...] ボタンをクリックし必要なインターフェースを追加します。
- [Finish] をクリックしファイルを作成します。
- データセットに値を追加し[Save] をクリックします。
例10.22 データセットの例
package com.example; public enum CaseMode { UPPER, LOWER; }
アノテーションファイルの作成
新しい Java クラスを作成します。具体的には 「JBoss Developer Studio での新しい Java クラスの作成」 を参照してください。- 制約アノテーションを設定し [Save] をクリックします。
例10.23 制約アノテーションファイルの例
package com.mycompany; import static java.lang.annotation.ElementType.*; import static java.lang.annotation.RetentionPolicy.*; import java.lang.annotation.Documented; import java.lang.annotation.Retention; import java.lang.annotation.Target; import javax.validation.Constraint; import javax.validation.Payload; @Target( { METHOD, FIELD, ANNOTATION_TYPE }) @Retention(RUNTIME) @Constraint(validatedBy = CheckCaseValidator.class) @Documented public @interface CheckCase { String message() default "{com.mycompany.constraints.checkcase}"; Class<?>[] groups() default {}; Class<? extends Payload>[] payload() default {}; CaseMode value(); }
- 結果:
- 許容値のあるカスタムの制約アノテーションが作成され、Java プロジェクトで使用することができます。
10.6.3.3. JBoss Developer Studio での新しい Java クラスの作成
本トピックでは、JBoss Developer Studio を使用して既存の Java プロジェクトに対して Java クラスを作成する手順について説明します。
手順10.6 タスク
- [Project Explorer] パネルのプロジェクトの root フォルダーを右クリックします。
- [New] → [Class] と選択します。
- 以下の要素を設定してください。
- Package:
- Name:
任意: インターフェースの追加
- [Add...] をクリックします。
- インターフェース名の検索
- 正しいインターフェースの選択
- 必要なインターフェースごとに手順 2 と 3 を繰り返す
- [Add] をクリックします。
- [Finish] をクリックし、ファイルを作成します。
- 結果
- 設定の準備が整った新しい Java クラスがプロジェクト内に作成されます。
10.6.3.4. 同梱の制約
表10.11
アノテーション | 適用先 | ランタイムチェック | Hibernate Metadata の影響 |
---|---|---|---|
@Length(min=, max=) | プロパティ (文字列) | 文字列の長さが指定の範囲とマッチしているか確認 | カラムの長さを最大に設定 |
@Max(value=) | プロパティ (数字あるいは数字の文字列表現) | 値が最大値以下であるか確認 | カラムに check 制約を追加 |
@Min(value=) | プロパティ (数字あるいは数字の文字列表現) | 値が最小値以上であるか確認 | カラムに check 制約を追加 |
@NotNull | プロパティ | 値が null でないか確認 | カラムが null でないか確認 |
@NotEmpty | プロパティ | 文字列が null あるいは空でないか確認。接続が null あるいは空でないか確認 | カラムが (文字列に対し) null でないか確認 |
@Past | プロパティ (日付あるいはカレンダー) | 日付が過去のものかを確認 | カラムに check 制約を追加 |
@Future | プロパティ (日付あるいはカレンダー) | 日付が未来のものかを確認 | なし |
@Pattern(regex="regexp", flag=) or @Patterns( {@Pattern(...)} ) | プロパティ (文字列) | プロパティが一致フラグを渡す正規表現に一致しているか確認 (java.util.regex.Pattern 参照) | なし |
@Range(min=, max=) | プロパティ (数字あるいは数字の文字列表現) | 最小値以上、最大値以下であるか確認 | カラムに check 制約を追加 |
@Size(min=, max=) | プロパティ (アレイ、コレクション、マップ) | 要素サイズが最小値以上、最大値以下であるかを確認 | なし |
@AssertFalse | プロパティ | メソッドが false と評価しているよう確認 (アノテーションでなくコードで制約が表現されている場合に便利) | なし |
@AssertTrue | プロパティ | メソッドが true と評価しているよう確認 (アノテーションでなくコードで制約が表現されている場合に便利) | なし |
@Valid | プロパティ (オブジェクト) | 紐付けされたオブジェクトに再帰的にバリデーションを行う。オブジェクトがコレクションかアレイの場合は、要素は再帰的に検証されます。また、オブジェクトがマップの場合、値要素が再帰的に検証されます。 | なし |
プロパティ (文字列) | 文字列が e-メールアドレスの仕様に対応しているか確認 | なし | |
@CreditCardNumber | プロパティ (文字列) | 文字列がクレジットカード番号用に適切にフォーマットされているか確認 (Luhn アルゴリズムの派生) | なし |
@Digits(integerDigits=1) | プロパティ (数字あるいは数字の文字列表現) | プロパティが最大 integerDigits の整数桁と fractionalDigits 少数点以下の桁数を持つ数字であるか確認 | カラムの制度とスケールを定義 |
@EAN | プロパティ (文字列) | 文字列が正しくフォーマットされた EAN あるいは UPC-A コードであるか確認 | なし |
10.6.4. 設定
10.6.4.1. 検証設定ファイルの例
例10.24 validation.xml
<validation-config xmlns="http://jboss.org/xml/ns/javax/validation/configuration" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://jboss.org/xml/ns/javax/validation/configuration"> <default-provider> org.hibernate.validator.HibernateValidator </default-provider> <message-interpolator> org.hibernate.validator.messageinterpolation.ResourceBundleMessageInterpolator </message-interpolator> <constraint-validator-factory> org.hibernate.validator.engine.ConstraintValidatorFactoryImpl </constraint-validator-factory> <constraint-mapping> /constraints-example.xml </constraint-mapping> <property name="prop1">value1</property> <property name="prop2">value2</property> </validation-config>
10.7. Envers
10.7.1. Hibernate Envers について
@Audited
アノテーションが付けられたエンティティーに対して監査テーブルが作成されます。その後、データの読み出しやクエリが可能になります。
- JPA 仕様によって定義されるすべてのマッピングの監査
- JPA 仕様を拡張するすべての Hibernate マッピングの監査
- リビジョンエンティティーを用いて各リビジョンのデータをログに記録
- 履歴データのクエリ
10.7.2. 永続クラスの監査について
@Auditing
アノテーションを用いて永続クラスの監査を行います。クラスにアノテーションが付けられると、エンティティーのリビジョン履歴が保存されるテーブルが作成されます。
10.7.3. 監査ストラテジー
10.7.3.1. 監査ストラテジーについて
- デフォルトの監査ストラテジー
- このストラテジーは監査データと開始リビジョンを共に永続化します。監査テーブルで挿入、更新、削除された各行については、開始リビジョンの有効性と合わせて、1 つ以上の行が監査テーブルに挿入されます。監査テーブルの行は挿入後には更新されません。監査情報のクエリはサブクエリを使い監査テーブルの該当行を選択します (これは時間がかかり、インデックス化が困難です)。
- 妥当性監査ストラテジー
- このストラテジーは監査情報の開始リビジョンと最終リビジョンの両方を格納します。監査テーブルで挿入、更新、削除された各行については、開始リビジョンの有効性とあわせて、1 つ以上の行が監査テーブルに挿入されます。同時に、以前の監査行 (利用可能な場合) の最終リビジョンフィールドがこのリビジョンに設定されます。監査情報に対するクエリが、サブクエリの代わりに 開始 と 最終 リビジョンのいずれかを利用します。つまり、更新の数が増えるため監査情報の永続化には少し時間がかかりますが、監査情報の取得ははるかに早くなります。インデックスを増やすことで改善することも可能です。
10.7.3.2. 監査ストラテジーの設定
JBoss Enterprise Application Platform 6 によってサポートされる監査ストラテジーにはデフォルト監査ストラテジーと妥当性監査ストラテジーの 2 つがあります。本タスクでは、アプリケーションに対して監査ストラテジーを定義するために必要な手順について取り上げます。
手順10.7 タスク
- アプリケーションの
persistence.xml
ファイルにorg.hibernate.envers.audit_strategy
を設定します。例10.25 妥当性監査ストラテジーの設定
<property name="org.hibernate.envers.audit_strategy" value="org.hibernate.envers.strategy.ValidityAuditStrategy"/>
10.7.4. エンティティー監査の開始
10.7.4.1. JPA エンティティーへの監査サポートの追加
- タスクの概要
- JBoss Enterprise Application Platform 6 は、「Hibernate Envers について」 を行ってエンティティーの監査を使用し、永続クラスの変更履歴を追跡します。本トピックでは、JPA エンティティーへの監査サポートを追加する方法について取り上げます。
手順10.8 JPA エンティティーへの監査サポートの追加
- 「Envers パラメーターの設定」 に従って、デプロイメントに適した使用可能な監査パラメーターを設定します。
- 監査対象となる JPA エンティティーを開きます。
org.hibernate.envers.Audited
インターフェースをインポートします。- 監査対象となる各フィールドまたはプロパティーに
@Audited
アノテーションを付けます。または、1 度にクラス全体へアノテーションを付けます。例10.26 2 つのフィールドの監査
import org.hibernate.envers.Audited; import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.GeneratedValue; import javax.persistence.Column; @Entity public class Person { @Id @GeneratedValue private int id; @Audited private String name; private String surname; @ManyToOne @Audited private Address address; // add getters, setters, constructors, equals and hashCode here }
例10.27 クラス全体の監査
import org.hibernate.envers.Audited; import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.GeneratedValue; import javax.persistence.Column; @Entity @Audited public class Person { @Id @GeneratedValue private int id; private String name; private String surname; @ManyToOne private Address address; // add getters, setters, constructors, equals and hashCode here }
- 結果
- JPA エンティティーの監査が設定されました。変更履歴を保存するため
Entity_AUD
と呼ばれるテーブルが作成されます。
10.7.5. 設定
10.7.5.1. Envers パラメーターの設定
- タスクの概要
- JBoss Enterprise Application Platform 6 は、Hibernate Envers よりエンティティーの監査を使用し、永続クラスの変更履歴を追跡します。ここでは、使用可能な Envers パラメーターの設定について取り上げます。
手順10.9 Envers パラメーターの設定
- アプリケーションの
persistence.xml
ファイルを開きます。 - 必要に応じて Envers プロパティーを追加、削除、設定します。使用可能なプロパティーの一覧は 「Envers の設定プロパティー」 を参照してください。
例10.28 Envers パラメーターの例
<persistence-unit ...> <provider>org.hibernate.ejb.HibernatePersistence</provider> <class>...</class> <properties> <property name="hibernate.dialect" ... /> <!-- other hibernate properties --> <property name="hibernate.ejb.event.post-insert" value="org.hibernate.ejb.event.EJB3PostInsertEventListener,org.hibernate.envers.event.AuditEventListener" /> <property name="hibernate.ejb.event.post-update" value="org.hibernate.ejb.event.EJB3PostUpdateEventListener,org.hibernate.envers.event.AuditEventListener" /> <property name="hibernate.ejb.event.post-delete" value="org.hibernate.ejb.event.EJB3PostDeleteEventListener,org.hibernate.envers.event.AuditEventListener" /> <property name="hibernate.ejb.event.pre-collection-update" value="org.hibernate.envers.event.AuditEventListener" /> <property name="hibernate.ejb.event.pre-collection-remove" value="org.hibernate.envers.event.AuditEventListener" /> <property name="hibernate.ejb.event.post-collection-recreate" value="org.hibernate.envers.event.AuditEventListener" /> <property name="org.hibernate.envers.versionsTableSuffix" value="_V" /> <property name="org.hibernate.envers.revisionFieldName" value="ver_rev" /> <!-- other envers properties --> </properties> </persistence-unit>
- 結果
- アプリケーションのすべての JPA エンティティーに対して監査の設定が行われます。
10.7.5.2. ランタイム時に監査を有効または無効にする
このタスクでは、ランタイム時にエンティティーバージョン監査を有効または無効にするために必要な設定手順について取り上げます。
手順10.10 タスク
AuditEventListener
クラスをサブクラス化します。- Hibernate イベント上で呼び出される次のメソッドを上書きします。
- onPostInsert
- onPostUpdate
- onPostDelete
- onPreUpdateCollection
- onPreRemoveCollection
- onPostRecreateCollection
- イベントのリスナーとしてサブクラスを指定します。
- 変更を監査すべきであるか判断します。
- 変更を監査する必要がある場合は、呼び出しをスーパークラスへ渡します。
10.7.5.3. 条件付き監査の設定
Hibernate Envers は多くのイベントリスナーを使用して、さまざまな Hibernate イベントに対して監査データを永続化します。Envers jar がクラスパスにある場合、これらのリスナーは自動的に登録されます。このタスクでは、Envers イベントリスナーの一部を上書きして条件付き監査を実装するために必要な手順について取り上げます。
手順10.11 タスク
persistence.xml
ファイルでhibernate.listeners.envers.autoRegister
の Hibernate プロパティーを false に設定します。- 上書きする各イベントリスナーをサブクラス化します。条件付き監査の論理をサブクラスに置き、監査の実行が必要な場合はスーパーメソッドを呼び出します。
org.hibernate.envers.event.EnversIntegrator
と似ているorg.hibernate.integrator.spi.Integrator
のカスタム実装を作成します。デフォルトのクラスではなく、手順の 2 で作成したイベントリスナーサブクラスを使用します。- jar に
META-INF/services/org.hibernate.integrator.spi.Integrator
ファイルを追加します。このファイルにはインターフェースを実装するクラスの完全修飾名が含まれなければなりません。
10.7.5.4. Envers の設定プロパティー
表10.12 エンティティーデータのバージョニング設定パラメーター
プロパティー名 | デフォルト値 | 詳細 |
---|---|---|
org.hibernate.envers.audit_table_prefix
| |
監査エンティティーの名前の前に付けられた文字列で、監査情報を保持するエンティティーの名前を作成します。
|
org.hibernate.envers.audit_table_suffix
|
_AUD
|
監査エンティティーの名前に追加された文字列で、監査情報を保持するエンティティーの名前を作成します。例えば、
Person のテーブル名を持つエンティティーが監査される場合、Envers は Person_AUD と呼ばれるテーブルを作成し履歴データを格納します。
|
org.hibernate.envers.revision_field_name
|
REV
|
リビジョン番号を保持する監査エンティティーの中にあるフィールド名
|
org.hibernate.envers.revision_type_field_name
|
REVTYPE
|
リビジョンタイプを保持する監査エンティティの中にあるフィールド名。現在のリビジョンタイプでは、
add 、mod 、 del があります。
|
org.hibernate.envers.revision_on_collection_change
|
true
|
このプロパティーは、所有されていない関係フィールドが変更されるとリビジョンを生成するか決定します。これは一対多関係のコレクションか、一対一関係の
mappedBy 属性を使ったフィールドのいずれかになります。
|
org.hibernate.envers.do_not_audit_optimistic_locking_field
|
true
|
True の場合、楽観的ロックに使用されたプロパティー (
@Version アノテーションが付いたプロパティー) は自動的に監査から除外されます。
|
org.hibernate.envers.store_data_at_delete
|
false
|
このプロパティは、エンティティーを削除する場合に ID のみではなく、他の全プロパティーを null と印付けしたエンティティデーターをリビジョンに保存すべきか定義します。最終の 1 つのリビジョンのみにこのデータが存在するため、通常必要はありませんが、最終リビジョンにアクセスする方が簡単で効率的なことがあります。この場合、削除前にエンティティーに含まれていたデータは 2 回保存されることになります。
|
org.hibernate.envers.default_schema
|
null (通常のテーブルと同じ)
|
監査テーブルに使用されるデフォルトのスキーマ名。
@AuditTable(schema="...") アノテーションを使用してオーバーライドすることができます。これがない場合は、スキーマは通常のテーブルのスキーマと同じになります。
|
org.hibernate.envers.default_catalog
|
null (通常のテーブルと同じ)
|
監査テーブルに使用されるべきであるデフォルトのカタログ名。
@AuditTable(catalog="...") アノテーションを使ってオーバーライド可能です。ない場合、このカタログは通常のテーブルのカタログと同じになります。
|
org.hibernate.envers.audit_strategy
|
org.hibernate.envers.strategy.DefaultAuditStrategy
|
このプロパティーは監査データを永続化する際に使用する監査ストラテジーを定義します。デフォルトでは、エンティティーを変更したリビジョンのみ保存されます。
org.hibernate.envers.strategy.ValidityAuditStrategy は、開始のリビジョンと最後のリビジョンの両方を保存します。これらのリビジョンは監査行が有効であった期間を定義します。
|
org.hibernate.envers.audit_strategy_validity_end_rev_field_name
|
REVEND
|
監査エントリーの最終リビジョン番号を保持するカラム名。このプロパティーは妥当性監査ストラテジーが使用されている場合にのみ有効です。
|
org.hibernate.envers.audit_strategy_validity_store_revend_timestamp
|
false
|
このプロパティーは、データが最後に有効となっている最終リビジョンのタイムスタンプを最終リビジョンと共に保存するかどうかを定義します。これは、テーブルパーティショニングを使用し、リレーショナルデータベースから以前の監査レコードをパージできるので便利です。パーティショニングには、テーブル内に存在するカラムが必要です。このプロパティーは、
ValidityAuditStrategy が使用される場合にのみ評価されます。
|
org.hibernate.envers.audit_strategy_validity_revend_timestamp_field_name
|
REVEND_TSTMP
|
データが有効であった最終リビジョンのタイムスタンプのカラム名。
ValidityAuditStrategy が使用され、 org.hibernate.envers.audit_strategy_validity_store_revend_timestamp が true と評価した場合のみ使用されます。
|
10.7.6. クエリ
10.7.6.1. 監査情報の読み出し
Hibernate Envers はクエリより監査情報を読み出しする機能を提供します。このトピックではクエリの例を取り上げます。
注記
live
データの対応するクエリよりも大幅に処理が遅くなります。
例10.29 特定のリビジョンでクラスのエンティティーをクエリする
AuditQuery query = getAuditReader() .createQuery() .forEntitiesAtRevision(MyEntity.class, revisionNumber);
AuditEntity
ファクトリクラスを使用して制約を指定することができます。以下のクエリは、name
プロパティーが John
と同等である場合のみエンティティーを選択します。
query.add(AuditEntity.property("name").eq("John"));
query.add(AuditEntity.property("address").eq(relatedEntityInstance)); // or query.add(AuditEntity.relatedId("address").eq(relatedEntityId));
List personsAtAddress = getAuditReader().createQuery() .forEntitiesAtRevision(Person.class, 12) .addOrder(AuditEntity.property("surname").desc()) .add(AuditEntity.relatedId("address").eq(addressId)) .setFirstResult(4) .setMaxResults(2) .getResultList();
例10.30 特定クラスのエンティティーが変更された場合のクエリリビジョン
AuditQuery query = getAuditReader().createQuery() .forRevisionsOfEntity(MyEntity.class, false, true);
AuditEntity.revisionNumber()
- 監査されたエンティティーが修正されたリビジョン番号の制約や射影、順序付けを指定します。
AuditEntity.revisionProperty(propertyName)
- 監査されたエンティティーが修正されたリビジョンに対応するリビジョンエンティティーのプロパティーの制約や射影、順序付けを指定します。
AuditEntity.revisionType()
- リビジョンのタイプ (ADD、MOD、DEL) へのアクセスを提供します。
entityId
ID を持つ MyEntity
クラスのエンティティーが変更された最小のリビジョン番号を選択します。
Number revision = (Number) getAuditReader().createQuery() .forRevisionsOfEntity(MyEntity.class, false, true) .setProjection(AuditEntity.revisionNumber().min()) .add(AuditEntity.id().eq(entityId)) .add(AuditEntity.revisionNumber().gt(42)) .getSingleResult();
actualDate
値が指定の値よりは大きく、可能な限り小さいリビジョンを選択します。
Number revision = (Number) getAuditReader().createQuery() .forRevisionsOfEntity(MyEntity.class, false, true) // We are only interested in the first revision .setProjection(AuditEntity.revisionNumber().min()) .add(AuditEntity.property("actualDate").minimize() .add(AuditEntity.property("actualDate").ge(givenDate)) .add(AuditEntity.id().eq(givenEntityId))) .getSingleResult();
minimize()
および maximize()
メソッドは制約を追加できる基準を返します。最大化または最小化されたプロパティーを持つエンティティーはこの基準を満たさなければなりません。
selectEntitiesOnly
- このパラメーターは明示的な射影が設定されていない場合のみ有効です。true の場合、クエリの結果は指定された制約を満たすリビジョンで変更されたエンティティーの一覧になります。false の場合、結果は 3 つの要素アレイの一覧になります。最初の要素は変更されたエンティティーインスタンスになります。2 番目の要素はリビジョンデータが含まれるエンティティーになります。カスタムエンティティーが使用されていない場合は
DefaultRevisionEntity
のインスタンスになります。3 つ目の要素アレイはリビジョンのタイプ (ADD、MOD、DEL) になります。 selectDeletedEntities
- このパラメーターは、エンティティーが削除されたリビジョンが結果に含まれなければならない場合に指定されます。true の場合、エンティティーのリビジョンタイプが
DEL
になり、id 以外のすべてのフィールドの値がnull
になります。
例10.31 特定のプロパティーを修正したエンティティーのクエリリビジョン
actualDate
プロパティーが変更された、指定の ID を持つ MyEntity
のすべてのリビジョンを返します。
AuditQuery query = getAuditReader().createQuery() .forRevisionsOfEntity(MyEntity.class, false, true) .add(AuditEntity.id().eq(id)); .add(AuditEntity.property("actualDate").hasChanged())
hasChanged
条件を他の基準と組み合わせることができます。次のクエリは、revisionNumber 生成時に MyEntity
の水平スライスを返します。これは、prop1
は修正され、prop2
は修正されなかったリビジョンに限定されます。
AuditQuery query = getAuditReader().createQuery() .forEntitiesAtRevision(MyEntity.class, revisionNumber) .add(AuditEntity.property("prop1").hasChanged()) .add(AuditEntity.property("prop2").hasNotChanged());
prop1
は修正され、prop2
はそのままの revisionNumber で変更された MyEntities
をすべて返す」とは読み取られないことを意味します。
forEntitiesModifiedAtRevision
を使用してこの結果がどのように返されるか表しています。
AuditQuery query = getAuditReader().createQuery() .forEntitiesModifiedAtRevision(MyEntity.class, revisionNumber) .add(AuditEntity.property("prop1").hasChanged()) .add(AuditEntity.property("prop2").hasNotChanged());
例10.32 特定のリビジョンで修正されたクエリエンティティー
Set<Pair<String, Class>> modifiedEntityTypes = getAuditReader() .getCrossTypeRevisionChangesReader().findEntityTypes(revisionNumber);
org.hibernate.envers.CrossTypeRevisionChangesReader
よりアクセス可能なクエリは他にも複数あります。
List<Object> findEntities(Number)
- 特定のリビジョンで変更 (追加、更新、削除)されたすべての監査されたエンティティーのスナップショットを返します。
n+1
個の SQL クエリを実行します (n
は指定のリビジョン内で変更された異なるエンティティークラスの数になります)。 List<Object> findEntities(Number, RevisionType)
- 変更タイプによってフィルターされた特定のリビジョンで変更 (追加、更新、削除) されたすべての監査されたエンティティーのスナップショットを返します。
n+1
個の SQL クエリを実行します (n
は指定のリビジョン内で変更された異なるエンティティークラスの数になります)。 Map<RevisionType, List<Object>> findEntitiesGroupByRevisionType(Number)
- 修正操作 (追加、更新、削除など) によってグループ化されたエンティティースナップショットの一覧が含まれるマップを返します。
3n+1
個の SQL クエリを実行します (n
は指定のリビジョン内で変更された異なるエンティティークラスの数になります)。
第11章 JAX-RS Web サービス
11.1. JAX-RS について
helloworld-rs
、jax-rs-client
、kitchensink
クイックスタート: 「Java EE クイックスタートの例へのアクセス」 を参照してくだい。
11.2. RESTEasy について
11.3. RESTful Web サービスについて
11.4. RESTEasy JAX-RS 固有のアノテーション
表11.1 JAX-RS/RESTEasy アノテーション
アノテーション | 使用方法 |
---|---|
@Consumes | リソースクラスのメソッドあるいは MessageBodyReader が受け入れ可能なメディアタイプを定義します。 |
@Context | クラスフィールドや Bean プロパティー、メソッドパラメーターへ情報を挿入するため使用されます。 |
@CookieParam | HTTP クッキーの値をリソースメソッドパラメーターやリソースクラスフィールド、リソースクラス Bean プロパティーへバインドします。 |
@DefaultValue | PathParam、QueryParam、MatrixParam、CookieParam、FormParam、HeaderParam といったアノテーションの 1 つを使用してバインドされるリクエストメタデータのデフォルト値を定義します。 |
@Delete | アノテーションが付けられたメソッドが HTTP DELETE リクエストへ応答することを示します。 |
@Encoded | QueryParam、PathParam、FormParam、MatrixParam のいずれかを使用してバインドしたパラメーター値の自動復号化を無効にします。 |
@Form | RESTEasy 固有のアノテーション。@*Param アノテーションは挿入されたクラスで再使用されます。RESTEasy はクラスのインスタンス化を行い、@*Param または @Context アノテーションが付けられたプロパティーに値を挿入します。 |
@FormParam | リクエストエンティティーボディー内に含まれるフォームパラメーターの値をリソースメソッドパラメーターにバインドします。 |
@GET | アノテーションが付けられたメソッドが HTTP GET リクエストに応答することを示します。 |
@HEAD | アノテーションが付けられたメソッドが HTTP HEAD リクエストに応答することを示します。 |
@HeaderParam | リソースメソッドパラメーターやリソースクラスフィールド、リソースクラス Bean プロパティーにHTTP ヘッダーの値をバインドします。 |
@HttpMethod | HTTP メソッド名をアノテーションに関連付けます。 |
@MatrixParam | リソースメソッドパラメーターやリソースクラスフィールド、リソースクラスの Bean プロパティーへURI マトリックスパラメーターの値をバインドします。 |
@Path | リソースクラスあるいはクラスメソッドがリクエストに対応する URI パスを特定します。 |
@PathParam | URI テンプレートパラメーターの値またはテンプレートパラメーターが含まれるパスセグメントの値をリソースメソッドパラメーター、リソースクラスフィールド、リソースクラス Bean プロパティーへバインドします。 |
@POST | アノテーションが付けられたメソッドが HTTP POST リクエストに応答することを示します。 |
@Produces | リソースクラスのメソッドあるいは MessageBodyWriter が作成可能なメディアタイプを定義します。 |
@Provider | 拡張インターフェースの実装をマーク付けします。 |
@PUT | アノテーションが付けられたメソッドが HTTP PUT リクエストに応答することを示します。 |
@QueryParam | URI クエリパラメーターの値をリソースメソッドパラメーターやリソースクラスフィールド、リソースクラス Bean プロパティーへバインドします。 |
11.5. RESTEasy 設定
11.5.1. RESTEasy 設定パラメーター
表11.2 要素
オプション名 | デフォルト値 | 詳細 |
---|---|---|
resteasy.servlet.mapping.prefix | デフォルトなし | Resteasy servlet-mapping の url-pattern が /* でない場合 |
resteasy.scan | false | WEB-INF/lib jar および WEB-INF/classes ディレクトリを自動的にスキャンして @Provider と JAX-RS の両方のリソースクラス (@Path、@GET、@POST など) を探し、それらを登録します。 |
resteasy.scan.providers | false | @Provider クラスをスキャンし、それらを登録します。 |
resteasy.scan.resources | false | JAX-RS リソースクラスをスキャンします。 |
resteasy.providers | デフォルトなし | 登録する完全修飾 @Provider クラス名のコンマ区切りのリスト |
resteasy.use.builtin.providers | true | デフォルトを登録するか否かに関わらず、ビルトイン @Provider クラス。 |
resteasy.resources | デフォルトなし | 登録する完全修飾 JAX-RS リソースクラス名のコンマ区切りのリスト |
resteasy.jndi.resources | デフォルトなし | JAX-RS リソースとして登録するオブジェクトを参照する JNDI 名のコンマ区切りのリスト。 |
javax.ws.rs.Application | デフォルトなし | 仕様の移植可能な方法でブートストラップを行うアプリケーションクラスの完全修飾名。 |
resteasy.media.type.mappings | デフォルトなし | ファイル名の拡張子 (例: .xml、.txt など) をメディアタイプにマッピングすることにより、Accept ヘッダーが必要なくなります。クライアントで Accept ヘッダーを使用して表現を選択することができない場合に使用します (ブラウザーなど)。 |
resteasy.language.mappings | デフォルトなし | ファイル名の拡張子 (例: .en、.fr など) を言語にマッピングすることにより、Accept-Language ヘッダーの必要がなくなります。クライアントで Accept-Language ヘッダーを使用して言語を選択することができない場合に使用します (ブラウザーなど)。 |
11.6. JAX-RS Web サービスセキュリティー
11.6.1. RESTEasy JAX-RS Web アプリケーションのロールベースのセキュリティーを有効にする
RESTEasy は JAX-RS メソッドの @RolesAllowed、@PermitAll、@DenyAll アノテーションをサポートしますが、デフォルトではこれらのアノテーションを認識しません。次の手順に従って web.xml
ファイルを設定し、ロールベースセキュリティーを有効にします。
警告
手順11.1 タスク
- テキストエディターでアプリケーションの
web.xml
ファイルを開きます。 - 以下のコンテキストパラメーターをファイルの
web-app
タグ内に追加します。<context-param> <param-name>resteasy.role.based.security</param-name> <param-value>true</param-value> </context-param>
- <security-role> タグを使用して RESTEasy JAX-RS WAR ファイル内で使用されるすべてのロールを宣言します。
<security-role> <role-name>ROLE_NAME</role-name> </security-role> <security-role> <role-name>ROLE_NAME</role-name> </security-role>
- すべてのロールに対して JAX-RS ランタイムが対応する全 URL へのアクセスを承認します。
<security-constraint> <web-resource-collection> <web-resource-name>Resteasy</web-resource-name> <url-pattern>/PATH%lt;/url-pattern> </web-resource-collection> <auth-constraint> <role-name>ROLE_NAME</role-name> <role-name>ROLE_NAME</role-name> </auth-constraint> </security-constraint>
ロールベースセキュリティーが定義されたロールのセットによりアプリケーション内で有効になります。
例11.1 ロールベースセキュリティーの設定例
<web-app> <context-param> <param-name>resteasy.role.based.security</param-name> <param-value>true</param-value> </context-param> <servlet-mapping> <servlet-name>Resteasy</servlet-name> <url-pattern>/*</url-pattern> </servlet-mapping> <security-constraint> <web-resource-collection> <web-resource-name>Resteasy</web-resource-name> <url-pattern>/security</url-pattern> </web-resource-collection> <auth-constraint> <role-name>admin</role-name> <role-name>user</role-name> </auth-constraint> </security-constraint> <security-role> <role-name>admin</role-name> </security-role> <security-role> <role-name>user</role-name> </security-role> </web-app>
11.6.2. アノテーションを使用した JAX-RS Web サービスの保護
サポート対象のセキュリティーアノテーションを使用して JAX-RS Web サービスを保護する手順を取り上げます。
手順11.2 タスク
- ロールベースセキュリティーを有効にします。詳細は 「RESTEasy JAX-RS Web アプリケーションのロールベースのセキュリティーを有効にする」 を参照してください。
- JAX-RS Web サービスにセキュリティーアノテーションを追加します。RESTEasy は次のアノテーションをサポートします。
- @RolesAllowed
- メソッドにアクセスできるロールを定義します。ロールはすべて
web.xml
ファイルに定義する必要があります。 - @PermitAll
web.xml
ファイルに定義されている全ロールによるメソッドへのアクセスを許可します。- @DenyAll
- メソッドへのアクセスをすべて拒否します。
11.7. RESTEasy ロギング
11.7.1. JAX-RS Web サービスロギングについて
- log4j がアプリケーションのクラスパスにある場合、log4j が使用されます。
- slf4j がアプリケーションのクラスパスにある場合、slf4j が使用されます。
- log4j と slf4j がいずれもクラスパスにない場合、java.util.logging がデフォルトで使用されます。
- サーバーコンテキストパラメーター resteasy.logger.type が JUL、LOG4J、SLF4J のいずれかに設定されている場合、デフォルトの挙動が上書きされます。
11.7.2. 管理コンソールのログカテゴリーの設定
重要
サーバーの停止
JBoss Enterprise Application Platform 6 のサーバーが稼動している場合は停止します。テキストエディターで設定ファイルを開きます。
Enterprise Application Platform を管理ドメインまたはスタンドアローンサーバーで稼動しているかどうかによって、デフォルトの設定ファイルの場所が異なります。管理ドメインの場合はEAP_HOME/domain/configuration/domain.xml
、スタンドアローンサーバーの場合はEAP_HOME/standalone/configuration/standalone.xml
になります。ロギングサブシステムノードの検索
ロギングサブシステム設定ノードを見つけます。ロギングサブシステム設定ノードは次のようになります。<subsystem xmlns="urn:jboss:domain:logging:1.1"> </subsystem>
ロギングサブシステム設定には、すでにログハンドラーやカテゴリーなどの多くの項目が含まれています。新規ロガーノードの追加
新しい<logger>
ノードをロギングシステムノードの子として追加します。このロガーがメッセージを受信するクラス名またはパッケージ名であるcategory
という属性を持たなければなりません。<logger category="com.acme.accounts.receivables"> </logger>
任意でuse-parent-handlers
属性を追加することもできます。この属性はtrue
かfalse
に設定できます。true
に設定すると、このログカテゴリーによって受信されたすべてのメッセージもルートロガーのハンドラーによって処理されます。指定がない場合、true
がデフォルトとして適用されます。ログレベルの指定
name という属性を持つ<level>
要素を追加します。name の値はこのカテゴリーが適用するログレベルでなければなりません。<logger category="com.acme.accounts.receivables"> <level name="DEBUG"/> </logger>
任意の設定: ログハンドラーの指定
このカテゴリーからのログメッセージを処理するため使用したい各ログハンドラーに対して、<handler>
要素が含まれる<handlers>
要素を追加します。指定されているハンドラーがなく、use-parent-handler が true に設定されていない場合、これ以上ログメッセージは処理されません。指定されているハンドラーがなくても use-parent-handler が true に設定されている場合は root-logger のハンドラーが使用されます。<logger category="com.acme.accounts.receivables"> <level name="DEBUG"/> <handlers> <handler name="ACCOUNTS-DEBUG-FILE"/> </handlers> </logger>
- JBoss Enterprise Application Platform 6 サーバーを再起動します。
11.7.3. RESTEasy ロギングカテゴリ
表11.3 カテゴリ
カテゴリ | 機能 |
---|---|
org.jboss.resteasy.core | コア RESTEasy 実装により全アクティビティをロギング |
org.jboss.resteasy.plugins.providers | RESTEasy エンティティプロバイダーにより全アクティビティをロギング |
org.jboss.resteasy.plugins.server | RESTEasy サーバー実装により全アクティビティをロギング |
org.jboss.resteasy.specimpl | JAX-RS 実装クラスにより全アクティビティをロギング |
org.jboss.resteasy.mock | RESTEasy モックフレームワークにより全アクティビティをロギング |
11.8. 例外処理
11.8.1. 例外マッパーの作成
例外マッパーはスローされた例外をキャッチし、特定の HTTP 応答を書き込むコンポーネントで、アプリケーションによって提供されます。
例11.2 例外マッパー
ExceptionMapper
インターフェースを実装します。
@Provider public class EJBExceptionMapper implements ExceptionMapper<javax.ejb.EJBException> { Response toResponse(EJBException exception) { return Response.status(500).build(); } }
resteasy.providers
コンテキストパラメーター下の web.xml
に追加するか、プログラムを用いて ResteasyProviderFactory
クラスより登録します。
11.8.2. RESTEasy 内部で送出された例外
表11.4 例外リスト
例外 | HTTP コード | 説明 |
---|---|---|
BadRequestException | 400 | 不正なリクエスト。このリクエストは正しくフォーマットされていないか、リクエスト入力の処理に問題があります。 |
UnauthorizedException | 401 | 権限がありません。RESTEasy のアノテーションベース、ロールベースのセキュリティを利用している場合セキュリティの例外が出されます。 |
InternalServerErrorException | 500 | 内部サーバーエラー |
MethodNotAllowedException | 405 | 呼び出した HTTP オペレーションを処理できるリソースに、JAX-RS メソッドがありません。 |
NotAcceptableException | 406 | Accept ヘッダーに記載されているメディアタイプを生成できる JAX-RS がありません。 |
NotFoundException | 404 | リクエストパス/リソースにサービスを提供する JAX-RS メソッドがありません。 |
ReaderException | 400 | MessageBodyReaders から出された例外はすべて、この例外の中にラップされます。ラップされた例外に ExceptionMapper がないか、あるいは例外が WebApplicationException 出ない場合、RESTEasy はデフォルトで 400 を返します。 |
WriterException | 500 | MessageBodyWriters から出された例外はすべて、この例外の中にラップされます。ラップされた例外に ExceptionMapper がないか、あるいは例外が WebApplicationException 出ない場合、RESTEasy はデフォルトで 400 を返します。 |
o.j.r.plugins.providers.jaxb.JAXBUnmarshalException | 400 | JAXB プロバイダー (XML および Jettison) はこの例外を読み込み時にスローします。 JAXBExceptions をラッピングする場合もあります。このクラスは ReaderException を拡張します。 |
o.j.r.plugins.providers.jaxb.JAXBMarshalException | 500 | JAXB プロバイダー (XML および Jettison) はこの例外を書き込み時にスローします。JAXBExceptions をラッピングする場合もあります。このクラスは WriterException を拡張します。 |
ApplicationException | N/A | アプリケーションコードから出された例外をすべてラップします。 InvocationTargetException と同じように機能します。ラップされた例外に ExceptionMapper がある場合、リクエスト処理に利用されます。 |
Failure | N/A | 内部 RESTEasy エラー。ログに記録されません。 |
LoggableFailure | N/A | 内部 RESTEasy エラー。ログに記録されています。 |
DefaultOptionsMethodException | N/A | ユーザーが HTTP OPTIONS を呼び出し HTTP OPTIONS に対する JAX-RS メソッドがない場合、RESTEasy ではデフォルトで例外をスローします。 |
11.9. RESTEasy インターセプター
11.9.1. JAX-RS 呼び出しのインターセプト
RESTEasy は JAX-RS 呼び出しをインターセプトでき、インターセプターと呼ばれるリスナーのようなオブジェクトでルーティングを行います。このトピックでは、インターセプター4種について説明していきます。
例11.3 MessageBodyReader/Writer インターセプター
@Provider
アノテーションか、 @ServerInterceptor
、@ClientInterceptor
がついています。
MessageBodyReader.readFrom()
あるいは MessageBodyWriter.writeTo()
の呼び出しをラップします。また、出力、入力ストリームをラップする際にも利用可能です。
public interface MessageBodyReaderInterceptor { Object read(MessageBodyReaderContext context) throws IOException, WebApplicationException; } public interface MessageBodyWriterInterceptor { void write(MessageBodyWriterContext context) throws IOException, WebApplicationException; }
MessageBodyReaderContext.proceed()
あるいは MessageBodyWriterContext.proceed()
が呼び出され、これ以上呼び出すインターセプターがない場合、MessageBodyReader あるいは MessageBodyWriter の readFrom()
あるいは writeTo()
が呼び出されます。このラッピングにより、オブジェクトがReader あるいは Writer に到達前にオブジェクトを変更することができ、proceed()
を返すまでに消去できます。
@Provider @ServerInterceptor public class MyHeaderDecorator implements MessageBodyWriterInterceptor { public void write(MessageBodyWriterContext context) throws IOException, WebApplicationException { context.getHeaders().add("My-Header", "custom"); context.proceed(); } }
例11.4 PreProcessInterceptor
public interface PreProcessInterceptor { ServerResponse preProcess(HttpRequest request, ResourceMethod method) throws Failure, WebApplicationException; }
preProcess()
メソッドは ServerResponse を返し、基盤の JAX-RS メソッドは呼び出されず、ランタイムがレスポンスを処理しクライアントに返します。
例11.5 PostProcessInterceptors
public interface PostProcessInterceptor { void postProcess(ServerResponse response); }
例11.6 ClientExecutionInterceptors
@ClientInterceptor
や @Provider
のアノテーションが付けられます。MessageBodyWriter の実行後、および ClientRequest がクライアント側で構築された後に実行されます。
public interface ClientExecutionInterceptor { ClientResponse execute(ClientExecutionContext ctx) throws Exception; } public interface ClientExecutionContext { ClientRequest getRequest(); ClientResponse proceed() throws Exception; }
11.9.2. インターセプターを JAX-RS メソッドにバインド
デフォルトでは、登録済みの全インターセプターが、全リクエストに対して呼び出されます。 AcceptedByMethod
インターフェースを実装しこの動作を調整するkとができます。
例11.7 インターセプターの例を構築
AcceptedByMethod
インターフェースを実装するインターセプターに accept()
メソッドを実装します。このメソッドが true を返す場合、インターセプターが JAX-RS メソッドの呼び出しチェーンに追加され、True が返されない場合はそのメソッドについては無視されます。
accept()
が @GET アノテーションが JAX-RS メソッドに存在するかを判断します。存在する場合、インターセプターがこのメソッドの呼び出しチェーンに適用されます。
@Provider @ServerInterceptor public class MyHeaderDecorator implements MessageBodyWriterInterceptor, AcceptedByMethod { public boolean accept(Class declaring, Method method) { return method.isAnnotationPresent(GET.class); } public void write(MessageBodyWriterContext context) throws IOException, WebApplicationException { context.getHeaders().add("My-Header", "custom"); context.proceed(); } }
11.9.3. インターセプターの登録
このトピックでは、RESTEasy JAX-RS インターセプターをアプリケーションに登録する方法を説明しています。
手順11.3 タスク
- インターセプターを登録するには、
resteasy.providers
context-param のweb.xml
ファイルにインターセプターをリストアップし、Application.getClasses()
あるいはApplication.getSingletons()
メソッドにてクラスあるいはオブジェクトとして返します。
11.9.4. インターセプター優先度ファミリー
11.9.4.1. デフォルトのインターセプター優先度ファミリー
インターセプターは呼び出される順番に敏感なことがあります。RESTEasy はインターセプターをファミリーにグループ化し、順番付けを簡易化します。この参照トピックではビルトインのインターセプター優先度ファミリーと各ファミリーに関連付けられるインターセプターについて取り上げます。
- SECURITY
- SECURITY インターセプターは通常 PreProcessInterceptors です。呼び出しが承認されるまでの時間を最低限にするためこのインターセプターが最初に呼び出されます。
- HEADER_DECORATOR
- HEADER_DECORATOR インターセプターは応答または送信要求へヘッダーを追加します。追加されたヘッダーが他のインターセプターファミリーの挙動に影響することがあるため、SECURITY インターセプターの後に呼び出されます。
- ENCODER
- ENCODER インターセプターは OutputStream を変更します。GZIP インターセプターは GZIPOutputStream を作成し、圧縮するため真の OutputStream をラッピングします。
- REDIRECT
- REDIRECT インターセプターは要求のルートを変更し、JAX-RS メソッドを完全に迂回することがあるため、通常 PreProcessInterceptors で使用されます。
- DECODER
- DECODER インターセプターは inputStream をラッピングします。例えば、GZIP インターセプターデコーダーは GzipInputStream インスタンスの InputStream をラッピングします。
11.9.4.2. カスタムのインターセプター優先グループ (Precedence Family) を定義
カスタムの Precedence Family はweb.xml
ファイルで作成、登録できます。このトピックでは、インターセプターの Precedence Family を定義する際に利用可能なコンテキストパラメーターの例をみていきます。
例11.8 resteasy.append.interceptor.precedence
resteasy.append.interceptor.precedence
のコンテキストパラメーターは、デフォルトの precedence family 一覧に新規の family を追加します。
<context-param> <param-name>resteasy.append.interceptor.precedence</param-name> <param-value>CUSTOM_PRECEDENCE_FAMILY</param-value> </context-param>
例11.9 resteasy.interceptor.before.precedence
resteasy.interceptor.before.precedence
コンテキストパラメーターは、カスタムの Family が先に実行されるようにデフォルトの Precedence Family を定義します。 このパラメーターの値は、 DEFAULT_PRECEDENCE_FAMILY/CUSTOM_PRECEDENCE_FAMILYを :
で区切るという形式をとります。
<context-param> <param-name>resteasy.interceptor.before.precedence</param-name> <param-value>DEFAULT_PRECEDENCE_FAMILY : CUSTOM_PRECEDENCE_FAMILY</param-value> </context-param>
例11.10 resteasy.interceptor.after.precedence
resteasy.interceptor.after.precedence
コンテキストパラメーターは、カスタムの Family が後で実行されるようにデフォルトの Precedence Family を定義します。 このパラメーターの値は、 DEFAULT_PRECEDENCE_FAMILY/CUSTOM_PRECEDENCE_FAMILYを :
で区切るという形式をとります。
<context-param> <param-name>resteasy.interceptor.after.precedence</param-name> <param-value>DEFAULT_PRECEDENCE_FAMILY : CUSTOM_PRECEDENCE_FAMILY</param-value> </context-param>
11.10. 文字列ベースのアノテーション
11.10.1. 文字列ベースの @*Param Annotations をオブジェクトに変換
@*Param
アノテーションは、Raw HTTP リクエストの文字列として表現されます。これらのオブジェクトにvalueOf(String) の静的メソッドあるいは String パラメーターを取るコンストラクターが含まれている場合、注入されたパラメーターの型をオブジェクトに変換することが可能です。
@Provider
インターフェースを2つ提供し、valueOf(String)
の静的メソッドあるいは文字列コンストラクターのいずれも持たないクラスに対して、この変換処理を行います。
例11.11 StringConverter
import org.jboss.resteasy.client.ProxyFactory; import org.jboss.resteasy.spi.StringConverter; import org.jboss.resteasy.test.BaseResourceTest; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import javax.ws.rs.HeaderParam; import javax.ws.rs.MatrixParam; import javax.ws.rs.PUT; import javax.ws.rs.Path; import javax.ws.rs.PathParam; import javax.ws.rs.QueryParam; import javax.ws.rs.ext.Provider; public class StringConverterTest extends BaseResourceTest { public static class POJO { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } } @Provider public static class POJOConverter implements StringConverter<POJO> { public POJO fromString(String str) { System.out.println("FROM STRNG: " + str); POJO pojo = new POJO(); pojo.setName(str); return pojo; } public String toString(POJO value) { return value.getName(); } } @Path("/") public static class MyResource { @Path("{pojo}") @PUT public void put(@QueryParam("pojo")POJO q, @PathParam("pojo")POJO pp, @MatrixParam("pojo")POJO mp, @HeaderParam("pojo")POJO hp) { Assert.assertEquals(q.getName(), "pojo"); Assert.assertEquals(pp.getName(), "pojo"); Assert.assertEquals(mp.getName(), "pojo"); Assert.assertEquals(hp.getName(), "pojo"); } } @Before public void setUp() throws Exception { dispatcher.getProviderFactory().addStringConverter(POJOConverter.class); dispatcher.getRegistry().addPerRequestResource(MyResource.class); } @Path("/") public static interface MyClient { @Path("{pojo}") @PUT void put(@QueryParam("pojo")POJO q, @PathParam("pojo")POJO pp, @MatrixParam("pojo")POJO mp, @HeaderParam("pojo")POJO hp); } @Test public void testIt() throws Exception { MyClient client = ProxyFactory.create(MyClient.class, "http://localhost:8081"); POJO pojo = new POJO(); pojo.setName("pojo"); client.put(pojo, pojo, pojo, pojo); } }
例11.12 StringParameterUnmarshaller
StringParameterUnmarshaller
インターフェースは、パラメーターに付けられたアノテーションや、注入先のフィールドからの影響を受けます。これは、インジェクターごとに作成されます。setAnnotations() メソッドは、resteasy に呼び出されアンマーシャラーを初期化します。
org.jboss.resteasy.annotations.StringsParameterUnmarshallerBinder
と呼ばれる meta-annotation を使いバインドすることもかのうです。
java.util.Date
ベースの @PathParam をフォーマットします。
public class StringParamUnmarshallerTest extends BaseResourceTest { @Retention(RetentionPolicy.RUNTIME) @StringParameterUnmarshallerBinder(DateFormatter.class) public @interface DateFormat { String value(); } public static class DateFormatter implements StringParameterUnmarshaller<Date> { private SimpleDateFormat formatter; public void setAnnotations(Annotation[] annotations) { DateFormat format = FindAnnotation.findAnnotation(annotations, DateFormat.class); formatter = new SimpleDateFormat(format.value()); } public Date fromString(String str) { try { return formatter.parse(str); } catch (ParseException e) { throw new RuntimeException(e); } } } @Path("/datetest") public static class Service { @GET @Produces("text/plain") @Path("/{date}") public String get(@PathParam("date") @DateFormat("MM-dd-yyyy") Date date) { System.out.println(date); Calendar c = Calendar.getInstance(); c.setTime(date); Assert.assertEquals(3, c.get(Calendar.MONTH)); Assert.assertEquals(23, c.get(Calendar.DAY_OF_MONTH)); Assert.assertEquals(1977, c.get(Calendar.YEAR)); return date.toString(); } } @BeforeClass public static void setup() throws Exception { addPerRequestResource(Service.class); } @Test public void testMe() throws Exception { ClientRequest request = new ClientRequest(generateURL("/datetest/04-23-1977")); System.out.println(request.getTarget(String.class)); } }
11.11. ファイル拡張子の設定
11.11.1. web.xml ファイルでメディアタイプへファイル拡張子をマッピングする
クライアントによっては、ブラウザー同様に表現のメディアタイプや言語のネゴシエーションに Accept および Accept-Language ヘッダーを使用できないものがあります。RESTEasy はこの問題に対処するため、ファイル名のサフィックスをメディアタイプや言語にマッピングすることができます。次の手順に従って、web.xml
ファイルにてメディアタイプをファイル拡張子にマッピングします。
手順11.4 タスク
- テキストエディターでアプリケーションの
web.xml
ファイルを開きます。 - コンテキストパラメーター
resteasy.media.type.mappings
をファイルのweb-app
タグ内に追加します。<context-param> <param-name>resteasy.media.type.mappings</param-name> </context-param>
- パラメーター値を設定します。マッピングはコンマ区切りリストを形成します。各マッピングは
:
で区切られます。例11.13 マッピングの例
<context-param> <param-name>resteasy.media.type.mappings</param-name> <param-value>html : text/html, json : application/json, xml : application/xml</param-name> </context-param>
11.11.2. web.xml ファイルにてファイル拡張子を言語にマッピングする
クライアントによっては、ブラウザー同様に表現のメディアタイプや言語のネゴシエーションに Accept および Accept-Language ヘッダーを使用できないものがあります。RESTEasy はこの問題に対処するため、ファイル名のサフィックスをメディアタイプや言語にマッピングすることができます。次の手順に従って、web.xml
ファイルにて言語をファイル拡張子にマッピングします。
手順11.5 タスク
- テキストエディターでアプリケーションの
web.xml
ファイルを開きます。 - コンテキストパラメーター
resteasy.language.mappings
をファイルのweb-app
タグ内に追加します。<context-param> <param-name>resteasy.language.mappings</param-name> </context-param>
- パラメーター値を設定します。マッピングはコンマ区切りリストを形成します。各マッピングは
:
で区切られます。例11.14 マッピングの例
<context-param> <param-name>resteasy.language.mappings</param-name> <param-value> en : en-US, es : es, fr : fr</param-name> </context-param>
11.11.3. RESTEasy JAX-RS 対応のメディアの種類
表11.5 メデイアの種類
メディアの種類 | Java 型 |
---|---|
application/*+xml, text/*+xml, application/*+json, application/*+fastinfoset, application/atom+* | JaxB アノテーション付きクラス |
application/*+xml, text/*+xml | org.w3c.dom.Document |
*/* | java.lang.String |
*/* | java.io.InputStream |
テキスト/プレーン | プリミティブ、java.lang.String、ストリングコンストラクターを持つ型、インプット向けの静的 valueOf(String) メソッド、アウトプット向けの toString() |
*/* | javax.activation.DataSource |
*/* | byte[] |
*/* | java.io.File |
application/x-www-form-urlencoded | javax.ws.rs.core.MultivaluedMap |
11.12. RESTEasy JavaScript API
11.12.1. RESTEasy JavaScript API について
例11.15 単純な JAX-RS JavaScript API の例
@Path("/") public interface X{ @GET public String Y(); @PUT public void Z(String entity); }
var X = { Y : function(params){…}, Z : function(params){…} };
11.12.2. RESTEasy JavaScript API サーブレットの有効化
RESTEasy JavaScript API はデフォルトでは有効になっていません。次の手順に従い、web.xml
ファイルを使用して有効にします。
手順11.6 タスク
- テキストエディターでアプリケーションの
web.xml
ファイルを開きます。 - 以下の設定をファイルの
web-app
タグ内に追加します。<servlet> <servlet-name>RESTEasy JSAPI</servlet-name> <servlet-class>org.jboss.resteasy.jsapi.JSAPIServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>RESTEasy JSAPI</servlet-name> <url-pattern>/URL[-607959745]/url-pattern[403897078] [-607959745]/servlet-mapping[403897078]
11.12.3. RESTEasy Javascript API パラメーター
表11.6 パラメータープロパティー
プロパティー | デフォルト値 | 詳細 |
---|---|---|
$entity | PUT、POST リクエストとして送信するエンティティー。 | |
$contentType | Content-Type ヘッダーとして送信されるボディーエンティティーの MIME タイプ。@Consumes アノテーションによって判断されます。 | |
$accepts | */* | Accept ヘッダーとして送信される許可された MIME タイプ。@Provides アノテーションによって判断されます。 |
$callback | 非同期呼び出しの関数 (httpCode、xmlHttpRequest、value) に設定されます。指定がない場合、呼び出しは同期となり、値が返されます。 | |
@apiURL | 最後のスラッシュを含まない JAX-RS エンドポイントのベース URI に設定されます。 | |
$username | ユーザー名とパスワードが設定されている場合、設定されているユーザー名とパスワードがリクエストの認証情報に使用されます。 | |
$password | ユーザー名とパスワードが設定されている場合、設定されているユーザー名とパスワードがリクエストの認証情報に使用されます。 |
11.12.4. JavaScript API を用いた AJAX クエリの構築
RESTEasy JavaScript API を手作業で使用してリクエストを構築することができます。このトピックではこの動作の例について取り上げます。
例11.16 REST オブジェクト
// Change the base URL used by the API: REST.apiURL = "http://api.service.com"; // log everything in a div element REST.log = function(text){ jQuery("#log-div").append(text); };
- apiURL
- デフォルトで JAX-RS ルート URL に設定されます。リクエストを構築する時にすべての JavaScript クライアント API 関数によって使用されます。
- log
- RESTEasy クライアント API のログを受信するため function(string) に設定されます。クライアント API をデバッグし、見える場所にログを置きたい場合に便利です。
例11.17 REST.Request クラス
var r = new REST.Request(); r.setURI("http://api.service.com/orders/23/json"); r.setMethod("PUT"); r.setContentType("application/json"); r.setEntity({id: "23"}); r.addMatrixParameter("JSESSIONID", "12309812378123"); r.execute(function(status, request, entity){ log("Response is "+status); });
- execute(callback)
- 現在のオブジェクトに設定されたすべての情報を持つリクエストを実行します。値が返されることはありませんが、任意の引数コールバックへ渡されます。
- setAccepts(acceptHeader)
- Accept リクエストヘッダーを設定します。デフォルト値は */* です。
- setCredentials(username, password)
- リクエストの認証情報を設定します。
- setEntity(entity)
- リクエストエンティティーを設定します。
- setContentType(contentTypeHeader)
- Content-Type リクエストヘッダーを設定します。
- setURI(uri)
- リクエスト URI を設定します。絶対 URI でなければなりません。
- setMethod(method)
- リクエストメソッドを設定します。デフォルト値は GET です。
- setAsync(async)
- ブール変数です。リクエストが非同期であるべきかどうかを制御します。デフォルト値は true です。
- addCookie(name, value)
- リクエストを実行する時に現在のドキュメントに特定のクッキーを設定します。これはブラウザーで永続化されます。
- addQueryParameter(name, value)
- クエリパラメーターを URI のクエリ部分に追加します。
- addMatrixParameter(name, value)
- リクエスト URI の最後のパスセグメントへマトリックスパラメーター (パスパラメーター) を追加します。
- addHeader(name, value)
- リクエストヘッダーを追加します。
11.12.5. REST.Request クラスメンバー
表11.7 REST.Request クラス
メンバー | 説明 |
---|---|
execute(callback) | 現在のオブジェクトに設定されたすべての情報を持つリクエストを実行します。値は任意の引数コールバックへ渡され、返されません。 |
setAccepts(acceptHeader) | Accept リクエストヘッダーを設定します。デフォルトは */* です。 |
setCredentials(username, password) | リクエストの認証情報を設定します。 |
setEntity(entity) | リクエストエンティティーを設定します。 |
setContentType(contentTypeHeader) | Content-Type リクエストヘッダーを設定します。 |
setURI(uri) | リクエスト URI を設定します。絶対 URI でなければなりません。 |
setMethod(method) | リクエストメソッドを設定します。デフォルトは GET です。 |
setAsync(async) | リクエストが非同期であるべきかどうかを制御します。デフォルトは true です。 |
addCookie(name, value) | リクエストを実行する時に現在のドキュメントに特定のクッキーを設定します。これはブラウザーで永続化されます。 |
addQueryParameter(name, value) | クエリパラメーターを URI のクエリ部分に追加します。 |
addMatrixParameter(name, value) | リクエスト URI の最後のパスセグメントへマトリックスパラメーター (パスパラメーター) を追加します。 |
addHeader(name, value) | リクエストヘッダーを追加します。 |
11.13. RESTEasy 非同期ジョブサービス
11.13.1. RESTEasy 非同期ジョブサービスについて
11.13.2. 非同期ジョブサービスの有効化
手順11.7 タスク
web.xml
ファイルで非同期ジョブサービスを有効化<context-param> <param-name>resteasy.async.job.service.enabled</param-name> <param-value>true</param-value> </context-param>
非同期ジョブサービスは有効化されました。設定オプションについては、「非同期ジョブサービスの設定パラメーター」 を参照してください。
11.13.3. RESTEasy 向けに非同期ジョブを設定
このトピックでは、RESTEasy を使った非同期ジョブのクエリパラメーター例について見ていきます。
警告
web.xml
ファイルで XML 宣言しなければなりません。
注記
例11.18 非同期パラメーター
asynch
クエリパラメーターを使いバックグラウンドで呼び出しを実行します。バックグラウンドメソッドのレスポンスの場所を参照する URL が含まれるロケーションヘッダーとあわせ、202 Accepted レスポンスが返されます。
POST http://example.com/myservice?asynch=true
HTTP/1.1 202 Accepted Location: http://example.com/asynch/jobs/3332334
/asynch/jobs/{job-id}?wait={millisconds}|nowait=true
- ジョブが完了した場合、GET はレスポンスとして呼び出された JAX-RS リソースメソッドを返します。ジョブが完了していない場合、この GET が 202 Accepted レスポンスコードを返します。GET を呼び出してもジョブは削除されないので、複数回呼び出すことができます。
- POST はジョブのレスポンスを読み取り、完了した場合はジョブを削除します。
- DLETE はジョブのキューを手動消去するために呼び出されます。
注記
ジョブのキューがいっぱいの場合、DELETE を呼び出すことなしに、自動的にメモリから最初のジョブをエビクトします。
例11.19 Wait / Nowait
wait
やnowait
を使うことで最大待機時間を定義できます。wait
パラメーターを指定されていない場合、この操作はデフォルトのnowait=true
となり、ジョブが完了していない場合も待機しません。wait
パラメーターをミリ秒で定義します。
POST http://example.com/asynch/jobs/122?wait=3000
例11.20 Oneway パラメーター
oneway
クエリパラメーターを使うことで、fire/forget ジョブに対応しています。
POST http://example.com/myservice?oneway=true
11.13.4. 非同期ジョブサービスの設定パラメーター
下表は非同期ジョブサービスの設定可能なコンテキストパラメーターと詳細を表しています。これらのパラメーターは web.xml
ファイルに設定することができます。
表11.8 設定パラメーター
パラメーター | 説明 |
---|---|
resteasy.async.job.service.max.job.results | 一度にメモリーに保持できるジョブ結果の数です。デフォルト値は 100 になります。 |
resteasy.async.job.service.max.wait | クライアントがジョブをクエリする時のジョブの最大待機時間です。デフォルト値は 300000 です。 |
resteasy.async.job.service.thread.pool.size | ジョブを実行するバックグラウンドスレッドのスレッドプールサイズです。デフォルト値は 100 になります。 |
resteasy.async.job.service.base.path | ジョブの URI のベースパスを設定します。デフォルト値は /asynch/jobs になります。 |
例11.21 非同期ジョブ設定の例
<web-app> <context-param> <param-name>resteasy.async.job.service.enabled</param-name> <param-value>true</param-value> </context-param> <context-param> <param-name>resteasy.async.job.service.max.job.results</param-name> <param-value>100</param-value> </context-param> <context-param> <param-name>resteasy.async.job.service.max.wait</param-name> <param-value>300000</param-value> </context-param> <context-param> <param-name>resteasy.async.job.service.thread.pool.size</param-name> <param-value>100</param-value> </context-param> <context-param> <param-name>resteasy.async.job.service.base.path</param-name> <param-value>/asynch/jobs</param-value> </context-param> <listener> <listener-class> org.jboss.resteasy.plugins.server.servlet.ResteasyBootstrap </listener-class> </listener> <servlet> <servlet-name>Resteasy</servlet-name> <servlet-class> org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher </servlet-class> </servlet> <servlet-mapping> <servlet-name>Resteasy</servlet-name> <url-pattern>/*</url-pattern> </servlet-mapping> </web-app>
11.14. RESTEasy JAXB
11.14.1. JAXB デコレーターの作成
RESTEasy の JAXB プロバイダーはマーシャラーおよびアンマーシャラーインスタンスを修飾するプラグ可能な方法を提供します。作成されたアノテーションによってマーシャラーまたはアンマーシャラーインスタンスが発生します。本トピックでは RESTEasy を用いて JAXB デコレーターを作成する手順を取り上げます。
手順11.8 タスクタスク
プロセッサークラスの作成
- DecoratorProcessor<Target, Annotation> を実装するクラスを作成します。ターゲットは JAXB マーシャラーまたはアンマーシャラーのクラスになります。アノテーションは手順 2 で作成されます。
- @DecorateTypes アノテーションをクラスに付け、デコレーターが修飾するべきである MIME タイプ を宣言します。
decorate
関数内にプロパティーまたは値を設定します。
例11.22 プロセッサークラスの例
import org.jboss.resteasy.core.interception.DecoratorProcessor; import org.jboss.resteasy.annotations.DecorateTypes; import javax.xml.bind.Marshaller; import javax.xml.bind.PropertyException; import javax.ws.rs.core.MediaType; import javax.ws.rs.Produces; import java.lang.annotation.Annotation; @DecorateTypes({"text/*+xml", "application/*+xml"}) public class PrettyProcessor implements DecoratorProcessor<Marshaller, Pretty> { public Marshaller decorate(Marshaller target, Pretty annotation, Class type, Annotation[] annotations, MediaType mediaType) { target.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE); } }
アノテーションの作成
- @Decorator アノテーションが付けられたカスタムインターフェースを作成します。
- @Decorator アノテーションのプロセッサーとターゲットを宣言します。プロセッサは手順 1 で作成されています。ターゲットは JAXB マーシャラーまたはアンマーシャラーのクラスになります。
例11.23 アノテーションの例
import org.jboss.resteasy.annotations.Decorator; @Target({ElementType.TYPE, ElementType.METHOD, ElementType.PARAMETER, ElementType.FIELD}) @Retention(RetentionPolicy.RUNTIME) @Decorator(processor = PrettyProcessor.class, target = Marshaller.class) public @interface Pretty {}
- 手順 2 で作成されたアノテーションを関数に追加し、マーシャルされた時に入力か出力が修飾されるようにします。
11.15. RESTEasy Atom サポート
11.15.1. Atom API とプロバイダーについて
org.jboss.resteasy.plugins.providers.atom
パッケージにあります。RESTEasy は JAXB を使用してAPI をマーシャルおよびアンマーシャルします。 プロバイダーは JAXB ベースで、XML を使用した atom オブジェクトの送信のみに限定されません。RESTEasy が持つ全 JAXB プロバイダーは、JSON や fastinfoset などの Atom API とプロバイダーによる再使用が可能です。API の詳細は javadocs を参照してください。
第12章 JAX-WS Web サービス
12.1. JAX-WS Web サービスについて
WS-Notification
、WS-Addressing
、WS-Policy
、WS-Security
、WS-Trust
などの Web サービス指向プロトコルは JAX-WS によってサポートが容易になります。これらのプロトコルはメッセージアーキテクチャーやメッセージ形式を定義する シンプルオブジェクトアクセスプロトコル (SOAP) と呼ばれる特殊な XML 言語を使用して通信します。
WebService
インターフェースと WebMethod
インターフェースを実装するクラスによって構成されます。
webservices
サブシステムより提供されます。
JBoss Enterprise Application Platform 6 のクイックスタートには完全に機能する JAX-WS Web サービスアプリケーションが複数含まれています。これらの例には以下が含まれています。
- wsat-simple
- wsba-coordinator-completion-simple
- wsba-participant-completion-simple
12.2. webservices サブシステムの設定
webservices
サブシステムには、数多くの設定オプションを使用することができます。管理 CLI スクリプト (EAP_HOME/bin/jboss-cli.sh
または EAP_HOME/bin/jboss-cli.bat
) 内の各要素を変更するためのコマンドが提供されています。スタンドアローンサーバーには、/profile=default
の部分は削除します。また、管理対象ドメイン上の異なるプロファイルには、この部分を修正してサブシステムを変更してください。
エンドポイントで公開している WSDL コントラクトの <soap:address>
要素を書き換えることができます。この機能は、各エンドポイントのクライアントに対してアドバタイズされたサーバーアドレスを制御するのに使用することができます。以下のオプション要素はそれぞれ、必要に応じて修正することができます。これらのいずれかの要素を修正した場合には、サーバーを再起動する必要があります。
表12.1 公開されるエンドポイントアドレスの設定要素
要素 | 説明 | CLI コマンド |
---|---|---|
modify-wsdl-address |
WSDL アドレスを常に変更するかどうかを設定します。true に指定した場合には、
<soap:address> の内容は常に上書きされます。false に指定した場合には、<soap:address> の内容は URL が有効でない場合のみ上書きされます。使用する値は、wsdl-host 、wsdl-port 、および wsdl-secure-port で、以下に説明を記載しています。
| /profile=default/subsystem=webservices/:write-attribute(name=modify-wsdl-address,value=true)
|
wsdl-host | <soap:address> を書き換える際に使用するホスト名 / IP アドレス。wsdl-host を文字列 jbossws.undefined.host に設定すると、<soap:address> 書き換えの際にリクエスターのホストが使用されます。
| /profile=default/subsystem=webservices/:write-attribute(name=wsdl-host,value10.1.1.1) |
wsdl-port | SOAP アドレスの書き換えに使用される HTTP ポートを明示的に定義する整数。未定義の場合には、インストール済みの HTTP コネクターの一覧に対してクエリを実行することによってHTTP ポートが識別されます。 | /profile=default/subsystem=webservices/:write-attribute(name=wsdl-port,value=8080)
|
wsdl-secure-port | SOAP アドレスの書き換えに使用される HTTPS ポートを明示的に定義する整数。未定義の場合には、インストール済みの HTTPS コネクターの一覧に対してクエリを実行することによって HTTPS ポートが識別されます。 | /profile=default/subsystem=webservices/:write-attribute(name=wsdl-secure-port,value=8443)
|
エンドポイントの実装が参照可能なエンドポイント設定を定義することができます。その用途の一つとして、@org.jboss.ws.api.annotation.EndpointConfig
のアノテーションが付いた所定のエンドポイント設定でマークされた任意の WS エンドポイントに所定のハンドラーを追加することができます。
Standard-Endpoint-Config
が含まれています。また、カスタム設定の例である Recording-Endpoint-Config
も含まれています。これは、レコーディングハンドラーの例を提供します。Standard-Endpoint-Config
は、どの設定とも関連付けされていないエンドポイントに自動的に使用されます。
Standard-Endpoint-Config
を読み取るには、次のコマンドを実行します。
/profile=default/subsystem=webservices/endpoint-config=Standard-Endpoint-Config/:read-resource(recursive=true,proxies=false,include-runtime=false,include-defaults=true)
エンドポイントの設定は、管理 API では endpoint-config
と呼ばれており、post-handler-chain
、post-handler-chain
および特定のエンドポイントに適用される一部のプロパティーが含まれます。endpoint config の読み取りには以下のコマンドを使用します。
例12.1 endpoint config の読み取り
/profile=default/subsystem=webservices/endpoint-config=Recording-Endpoint-Config:read-resource
例12.2 endpoint config の追加
/profile=default/subsystem=webservices/endpoint-config=My-Endpoint-Config:add
各 endpoint config は PRE
および POST
ハンドラーチェーンと関連付けすることができます。各ハンドラーチェーンには、JAXWS に準拠したハンドラーを追加することが可能です。送信メッセージの場合は、@HandlerChain
アノテーションなどの 標準的な JAXWS の方法を使用してエンドポイントに接続されるハンドラーよりも前に、PRE ハンドラーチェーンのハンドラーが実行されます。POST ハンドラーチェーンのハンドラーは、通常のエンドポイントハンドラーの後に実行されます。 受信メッセージの場合は、その逆が適用されます。JAX-WS は、XML ベース Web サービス向けの標準 API で、http://jcp.org/en/jsr/detail?id=224 に文書化されています。
protocol-binding
属性を追加することも可能です。
例12.3 ハンドラーチェーンの読み取り
/profile=default/subsystem=webservices/endpoint-config=Recording-Endpoint-Config/pre-handler-chain=recording-handlers:read-resource
例12.4 ハンドラーチェーンの追加
/profile=default/subsystem=webservices/endpoint-config=My-Endpoint-Config/post-handler-chain=my-handlers:add(protocol-bindings="##SOAP11_HTTP")
JAXWS ハンドラーは、ハンドラーチェーン内の子エレメント <handler>
です。このハンドラは、ハンドラー暮らすの完全修飾クラス名である class
属性を取ります。エンドポイントがデプロイされる際には、参照するデプロイメントごとにそのクラスのインスタンスが作成されます。デプロイメントクラスローダーまたは org.jboss.as.webservices.server.integration
モジュール用のクラスローダーのいずれかがハンドラークラスをロード可能である必要があります。
例12.5 ハンドラーの読み取り
/profile=default/subsystem=webservices/endpoint-config=Recording-Endpoint-Config/pre-handler-chain=recording-handlers/handler=RecordingHandler:read-resource
例12.6 ハンドラーの追加
/subsystem=webservices/endpoint-config=My-Endpoint-Config/post-handler-chain=my-handlers/handler=foo-handler:add(class="org.jboss.ws.common.invocation.RecordingServerHandler")
Web コンテキストや WSDL URL などの Web サービスのランタイム情報は、エンドポイント自体にクエリを実行することによって表示することができます。*
の文字を使用すると、全エンドポイントに対して一度にクエリを実行することができます。/deployment
は管理 API のトップレベル要素である点に注意してください。
例12.7 全エンドポイントについてのランタイム情報の表示
/deployment="*"/subsystem=webservices/endpoint="*":read-resource
{ "outcome" => "success", "result" => [{ "address" => [ ("deployment" => "jaxws-samples-handlerchain.war"), ("subsystem" => "webservices"), ("endpoint" => "jaxws-samples-handlerchain:TestService") ], "outcome" => "success", "result" => { "class" => "org.jboss.test.ws.jaxws.samples.handlerchain.EndpointImpl", "context" => "jaxws-samples-handlerchain", "name" => "TestService", "type" => "JAXWS_JSE", "wsdl-url" => "http://localhost:8080/jaxws-samples-handlerchain?wsdl" } }] }
12.3. JAX-WS Web サービスエンドポイント
12.3.1. JAX-WS Web サービスエンドポイントについて
Web サービスは、http://www.jcp.org/en/jsr/summary?id=181 に記載の JAX-WS API および Web サービスメタデータ仕様要件を満たしている必要があります。有効な実装は以下の要件を満たします。
javax.jws.WebService
アノテーションが含まれます。- メソッドのパラメーターおよび戻り値の型はすべて JAXB 2.0 の仕様 JSR-222 との互換性があります。詳しくは http://www.jcp.org/en/jsr/summary?id=222 を参照してください。
例12.8 POJO エンドポイントの例
@WebService @SOAPBinding(style = SOAPBinding.Style.RPC) public class JSEBean01 { @WebMethod public String echo(String input) { ... } }
例12.9 Web サービスエンドポイントの例
<web-app ...> <servlet> <servlet-name>TestService</servlet-name> <servlet-class>org.jboss.test.ws.jaxws.samples.jsr181pojo.JSEBean01</servlet-class> </servlet> <servlet-mapping> <servlet-name>TestService</servlet-name> <url-pattern>/*</url-pattern> </servlet-mapping> </web-app>
例12.10 EJB 内のエンドポイントの公開
@Stateless @Remote(EJB3RemoteInterface.class) @RemoteBinding(jndiBinding = "/ejb3/EJB3EndpointInterface") @WebService @SOAPBinding(style = SOAPBinding.Style.RPC) public class EJB3Bean01 implements EJB3RemoteInterface { @WebMethod public String echo(String input) { ... } }
JAX-WS サービスは通常、Java サービスエンドポイントインターフェース (SEI) を実装します。これは、WSDL ポートタイプから直接もしくはアノテーションを使用してマッピングすることが可能です。 この SEI は、Java オブジェクトとそれらの XML 表現の間の詳細情報を隠すハイレベルの抽象化を提供します。ただし、サービスが XML メッセージレベルで稼働する機能を必要とする場合があります。エンドポイント Provider
インターフェースはこの機能を Web サービスに提供し、その Web サービスが機能を実装します。
Web サービスをデプロイした後、WSDL を使用して、アプリケーションの基盤となるコンポーネントスタブを作成することが可能です。これでアプリケーションはエンドポイントにアクセスして作業を行うことができます。
JBoss Enterprise Application Platform 6 のクイックスタートには完全に機能する JAX-WS Web サービスアプリケーションが複数含まれています。これらの例には以下が含まれています。
- wsat-simple
- wsba-coordinator-completion-simple
- wsba-participant-completion-simple
12.3.2. JAX-WS Web サービスエンドポイントの書き込みとデプロイ
本トピックでは、シンプルな JAX-WS サービスエンドポイントの開発について説明します。JAX-WS サービスエンドポイントは、JAX-WS クライアントからの要求に応答し、WSDL 定義を自らに大して公開するサーバー側のコンポーネントです。JAX-WS サービスエンドポイントについての詳しい情報は、「JAX-WS の共通 API リファレンス」 および JBoss Enterprise Application Platform 6 に同梱されている Javadoc 形式の API ドキュメントバンドルを参照してください。
Web サービスは、http://www.jcp.org/en/jsr/summary?id=181 に記載の JAX-WS API および Web サービスメタデータの仕様要件を満たしている必要があります。有効な実装は以下の要件を満たします:
javax.jws.WebService
アノテーションが含まれます。- メソッドのパラメーターおよび戻り値の型はすべて JAXB 2.0 の仕様 JSR-222 との互換性があります。詳しくは http://www.jcp.org/en/jsr/summary?id=222 を参照してください。
例12.11 サービス実装の例
package org.jboss.test.ws.jaxws.samples.retail.profile; import javax.ejb.Stateless; import javax.jws.WebService; import javax.jws.WebMethod; import javax.jws.soap.SOAPBinding; @Stateless @WebService( name="ProfileMgmt", targetNamespace = "http://org.jboss.ws/samples/retail/profile", serviceName = "ProfileMgmtService") @SOAPBinding(parameterStyle = SOAPBinding.ParameterStyle.BARE) public class ProfileMgmtBean { @WebMethod public DiscountResponse getCustomerDiscount(DiscountRequest request) { return new DiscountResponse(request.getCustomer(), 10.00); } }
例12.12 XML ペイロードの例
ProfileMgmtBean
Bean によって使用される DiscountRequest
クラスの例は以下のとおりです。アノテーションは詳細のために含まれています。通常、JAXB のデフォルト設定は妥当なので指定する必要はありません。
package org.jboss.test.ws.jaxws.samples.retail.profile; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlType; import org.jboss.test.ws.jaxws.samples.retail.Customer; @XmlAccessorType(XmlAccessType.FIELD) @XmlType( (1) name = "discountRequest", namespace="http://org.jboss.ws/samples/retail/profile", propOrder = { "customer" } ) public class DiscountRequest { protected Customer customer; public DiscountRequest() { } public DiscountRequest(Customer customer) { this.customer = customer; } public Customer getCustomer() { return customer; } public void setCustomer(Customer value) { this.customer = value; } }
実装クラスは JAR
デプロイメントにラッピングされます。実装クラスおよびサービスエンドポイントインターフェースに対するアノテーションからデプロイメントに必要な任意の必須メタデータを取ります。管理 CLI または管理インターフェースを使用して JAR をデプロイすると、HTTP エンドポイントは自動的に作成されます。
例12.13 Web サービスデプロイメントの JAR 構造の例
[user@host ~]$ jar -tf jaxws-samples-retail.jar
org/jboss/test/ws/jaxws/samples/retail/profile/DiscountRequest.class
org/jboss/test/ws/jaxws/samples/retail/profile/DiscountResponse.class
org/jboss/test/ws/jaxws/samples/retail/profile/ObjectFactory.class
org/jboss/test/ws/jaxws/samples/retail/profile/ProfileMgmt.class
org/jboss/test/ws/jaxws/samples/retail/profile/ProfileMgmtBean.class
org/jboss/test/ws/jaxws/samples/retail/profile/ProfileMgmtService.class
org/jboss/test/ws/jaxws/samples/retail/profile/package-info.class
12.4. JAX-WS Web サービスクライアント
12.4.1. JAX-WS Web サービスの使用とアクセス
- クライアントアーティファクトの作成
- サービススタブの構築
- エンドポイントへのアクセス
クライアントアーティファクトを作成する前に、WSDL コントラクトを作成しておく必要があります。以下の WSDL コントラクトは、以降、本トピックで例として使用します。
例12.14 WSDL コントラクトの例
<definitions name='ProfileMgmtService' targetNamespace='http://org.jboss.ws/samples/retail/profile' xmlns='http://schemas.xmlsoap.org/wsdl/' xmlns:ns1='http://org.jboss.ws/samples/retail' xmlns:soap='http://schemas.xmlsoap.org/wsdl/soap/' xmlns:tns='http://org.jboss.ws/samples/retail/profile' xmlns:xsd='http://www.w3.org/2001/XMLSchema'> <types> <xs:schema targetNamespace='http://org.jboss.ws/samples/retail' version='1.0' xmlns:xs='http://www.w3.org/2001/XMLSchema'> <xs:complexType name='customer'> <xs:sequence> <xs:element minOccurs='0' name='creditCardDetails' type='xs:string'/> <xs:element minOccurs='0' name='firstName' type='xs:string'/> <xs:element minOccurs='0' name='lastName' type='xs:string'/> </xs:sequence> </xs:complexType> </xs:schema> <xs:schema targetNamespace='http://org.jboss.ws/samples/retail/profile' version='1.0' xmlns:ns1='http://org.jboss.ws/samples/retail' xmlns:tns='http://org.jboss.ws/samples/retail/profile' xmlns:xs='http://www.w3.org/2001/XMLSchema'> <xs:import namespace='http://org.jboss.ws/samples/retail'/> <xs:element name='getCustomerDiscount' nillable='true' type='tns:discountRequest'/> <xs:element name='getCustomerDiscountResponse' nillable='true' type='tns:discountResponse'/> <xs:complexType name='discountRequest'> <xs:sequence> <xs:element minOccurs='0' name='customer' type='ns1:customer'/> </xs:sequence> </xs:complexType> <xs:complexType name='discountResponse'> <xs:sequence> <xs:element minOccurs='0' name='customer' type='ns1:customer'/> <xs:element name='discount' type='xs:double'/> </xs:sequence> </xs:complexType> </xs:schema> </types> <message name='ProfileMgmt_getCustomerDiscount'> <part element='tns:getCustomerDiscount' name='getCustomerDiscount'/> </message> <message name='ProfileMgmt_getCustomerDiscountResponse'> <part element='tns:getCustomerDiscountResponse' name='getCustomerDiscountResponse'/> </message> <portType name='ProfileMgmt'> <operation name='getCustomerDiscount' parameterOrder='getCustomerDiscount'> <input message='tns:ProfileMgmt_getCustomerDiscount'/> <output message='tns:ProfileMgmt_getCustomerDiscountResponse'/> </operation> </portType> <binding name='ProfileMgmtBinding' type='tns:ProfileMgmt'> <soap:binding style='document' transport='http://schemas.xmlsoap.org/soap/http'/> <operation name='getCustomerDiscount'> <soap:operation soapAction=''/> <input> <soap:body use='literal'/> </input> <output> <soap:body use='literal'/> </output> </operation> </binding> <service name='ProfileMgmtService'> <port binding='tns:ProfileMgmtBinding' name='ProfileMgmtPort'> <soap:address location='<PORT>/jaxws-samples-retail/ProfileMgmtBean'/> </port> </service> </definitions>
注記
wsconsume.sh
または wsconsume.bat
ツールを使用して抽象コントラクト (WSDL) を消費し、アノテーションが付いた Java クラスとそれを定義するオプションのソースを作成します。コマンドは、JBoss Enterprise Application Platform インストールの EAP_HOME/bin/
ディレクトリにあります。
例12.15 wsconsume.sh
コマンドの構文
usage: wsconsume [options] <wsdl-url> options: -h, --help Show this help message -b, --binding=<file> One or more JAX-WS or JAXB binding files -k, --keep Keep/Generate Java source -c --catalog=<file> Oasis XML Catalog file for entity resolution -p --package=<name> The target package for generated source -w --wsdlLocation=<loc> Value to use for @WebServiceClient.wsdlLocation -o, --output=<directory> The directory to put generated artifacts -s, --source=<directory> The directory to put Java source -t, --target=<2.0|2.1|2.2> The JAX-WS specification target -q, --quiet Be somewhat more quiet -v, --verbose Show full exception stack traces -l, --load-consumer Load the consumer and exit (debug utility) -e, --extension Enable SOAP 1.2 binding extension -a, --additionalHeaders Enables processing of implicit SOAP headers
ProfileMgmtService.wsdl
ファイルからソース .java
ファイルを生成して出力に一覧表示します。ソースには、パッケージのディレクトリ構造が使用されます。これは、-p
スイッチで指定します。
[user@host bin]$ wsconsume.sh -k -p org.jboss.test.ws.jaxws.samples.retail.profile ProfileMgmtService.wsdl
org/jboss/test/ws/jaxws/samples/retail/profile/Customer.java
org/jboss/test/ws/jaxws/samples/retail/profile/DiscountRequest.java
org/jboss/test/ws/jaxws/samples/retail/profile/DiscountResponse.java
org/jboss/test/ws/jaxws/samples/retail/profile/ObjectFactory.java
org/jboss/test/ws/jaxws/samples/retail/profile/ProfileMgmt.java
org/jboss/test/ws/jaxws/samples/retail/profile/ProfileMgmtService.java
org/jboss/test/ws/jaxws/samples/retail/profile/package-info.java
表12.2 wsconsume.sh
によって作成されたアーティファクトの説明
ファイル | 説明 |
---|---|
ProfileMgmt.java
|
サービスエンドポイントインターフェース
|
Customer.java
|
カスタムデータタイプ
|
Discount*.java
|
カスタムデータタイプ
|
ObjectFactory.java
|
JAXB XML レジストリ
|
package-info.java
|
JAXB パッケージアノテーション
|
ProfileMgmtService.java
|
サービスファクトリ
|
wsconsume.sh
コマンドは、全カスタムデータタイプ (JAXB アノテーション付きクラス)、サービスエンドポイントインターフェース、およびサービスファクトリクラスを生成します。これらのアーティファクトは、Web サービスクライアント実装の構築に使用されます。
Web サービスクライアントは、サービススタブを使用してリモート Web サービス呼び出しの詳細情報を抽象化します。クライアントアプリケーション側には、WS 呼び出しはその他のビジネスコンポーネントと同じように見えます。この場合、サービスエンドポイントインターフェースはビジネスインターフェースとして機能し、サービススタブとして構築する際にサービスファクトリクラスは使用されません。
例12.16 サービススタブの構築とエンドポイントへのアクセス
wsconsume.sh
コマンドで作成されたサービスエンドポイントインターフェースを使用して サービススタブを構築します。最終的にこのスタブはその他のビジネスインターフェースと同じように使用することができます。
import javax.xml.ws.Service; [...] Service service = Service.create( new URL("http://example.org/service?wsdl"), new QName("MyService") ); ProfileMgmt profileMgmt = service.getPort(ProfileMgmt.class); // Use the service stub in your application
12.4.2. JAX-WS クライアントアプリケーションの開発
Service
- 概要
Service
は WSDL サービスを表す抽象化です。WSDL サービスは関連ポートの集合で、それぞれには特定のプロトコルおよび特定のエンドポイントアドレスにバインドされたポート型が含まれます。通常サービスは、既存の WSDL コントラクトから残りのコンポーネントスタブが生成される時に生成されます。WSDL コントラクトはデプロイされたエンドポイントの WSDL URL を介して利用することができます。もしくはEAP_HOME/bin/
ディレクトリでwsprovide.sh
コマンドを使用してエンドポイントソースから作成することもできます。このようなタイプの使用法は 静的 ユースケースと呼ばれています。この場合、コンポーネントスタブの一つとして作成されたService
クラスのインスタンスを作成します。サービスはService.create
メソッドを使用して手動で作成することも可能です。このような使用法は 動的 ユースケースと呼ばれています。- 使用法
- 静的ユースケース
- JAX-WS クライアントの 静的 ユースケースは WSDL コントラクトが既にあることを前提としています。これは、外部ツールで生成したり、 JAX-WS エンドポイントの作成時に正しい JAX-WS アノテーションを使用して生成することができます。コンポーネントスタブを生成するには、
EAP_HOME/bin/
に格納されたwsconsume.sh
またはwsconsume.bat
のスクリプトを使用します。スクリプトは、WSDL URL またはファイルをパラメーターとして取り、ディレクトリツリー構造の複数のファイルを生成します。Service
を表すソースおよびクラスのファイルはそれぞれCLASSNAME_Service.java
とCLASSNAME_Service.class
と名付けられます。生成された実装クラスには、引数なしと、 2 つの引数を使用する、 2 つのパブリックコンストラクターがあります。2 つの引数はそれぞれ WSDL ロケーション (java.net.URL
) とサービス名 (javax.xml.namespace.QName
) を表します。引数なしのコンストラクターは最も頻繁に使用されます。この場合、WSDL ロケーションとサービス名は WSDL に記述された設定となります。これらは、生成されたクラスを装飾する@WebServiceClient
アノテーションから暗黙的に設定されます。例12.17 生成されたサービスクラスの例
@WebServiceClient(name="StockQuoteService", targetNamespace="http://example.com/stocks", wsdlLocation="http://example.com/stocks.wsdl") public class StockQuoteService extends javax.xml.ws.Service { public StockQuoteService() { super(new URL("http://example.com/stocks.wsdl"), new QName("http://example.com/stocks", "StockQuoteService")); } public StockQuoteService(String wsdlLocation, QName serviceName) { super(wsdlLocation, serviceName); } ... }
- 動的ユースケース
- 動的なケースでは、スタブは自動的には生成されず、代わりに Web サービスクライアントが
Service.create
メソッドを使用してService
インスタンスを作成します。以下のコードフラグメントは、このプロセスの例を示しています。例12.18 手動でのサービス作成
URL wsdlLocation = new URL("http://example.org/my.wsdl"); QName serviceName = new QName("http://example.org/sample", "MyService"); Service service = Service.create(wsdlLocation, serviceName);
- ハンドラーリゾルバー
- JAX-WS は、ハンドラー として知られるメッセージ処理モジュール向けの柔軟性の高いプラグインフレームワークを提供します。このようなハンドラーにより、JAX-WS ランタイムシステムの機能が拡張されます。
Service
インスタンスは、サービス、ポート、プロトコルバインディングのいずれかの単位でハンドラーのセットを設定することが可能なgetHandlerResolver
メソッドとsetHandlerResolver
メソッドのペアを介してHandlerResolver
へのアクセスを提供します。Service
インスタンスがプロキシまたはDispatch
インスタンスを作成する際には、現在サービスに登録されているハンドラーリゾルバーによって必要なハンドラーチェーンが作成されます。Service
インスタンス用に設定されたハンドラーリゾルバーがそれ以降に変更されても、以前に作成されたプロキシやDispatch
インスタンスには影響を及ぼしません。 - エグゼキューター
Service
インスタンスはjava.util.concurrent.Executor
を使用して設定することができます。Executor
はアプリケーションが要求する任意の非同期コールバックを呼び出します。Service
のsetExecutor
メソッドとgetExecutor
のメソッドを変更して一定のサービス用に設定されたExecutor
を取得することができます。
動的プロキシ とは、Service
で提供される getPort
メソッドの一つを使用するクライアントプロキシのインスタンスです。portName
は、サービスが使用する WSDL ポートの名前を指定します。serviceEndpointInterface
は、作成された動的プロキシインスタンスのサポートするサービスエンドポイントインターフェースを指定します。
例12.19 getPort
メソッド
public <T> T getPort(QName portName, Class<T> serviceEndpointInterface) public <T> T getPort(Class>T< serviceEndpointInterface)
wsconsume.sh
コマンドを使用して生成されます。これにより WSDL が解析されて、Java クラスが作成されます。
例12.20 サービスポートの戻り値
@WebServiceClient(name = "TestEndpointService", targetNamespace = "http://org.jboss.ws/wsref", wsdlLocation = "http://localhost.localdomain:8080/jaxws-samples-webserviceref?wsdl") public class TestEndpointService extends Service { ... public TestEndpointService(URL wsdlLocation, QName serviceName) { super(wsdlLocation, serviceName); } @WebEndpoint(name = "TestEndpointPort") public TestEndpoint getTestEndpointPort() { return (TestEndpoint)super.getPort(TESTENDPOINTPORT, TestEndpoint.class); } }
@WebServiceRef
@WebServiceRef
アノテーションは Web サービスの参照を宣言します。これは http://www.jcp.org/en/jsr/summary?id=250 で定義されている javax.annotation.Resource
アノテーションにより表示されるリソースパターンに従います。
@WebServiceRef
のユースケース
- このアノテーションは、生成された
Service
クラス型である参照を定義するのに使用することができます。この場合、種類要素と値要素はそれぞれ生成されたService
クラス型を参照します。また、アノテーションが適用されるフィールドまたはメソッドの宣言によって参照型を推定することができる場合、種類要素および値要素にデフォルト値のObject.class
を使用することができますが、必須ではありません。型が推測できない場合には、少なくとも種類要素は非デフォルト値で表示する必要があります。 - このアノテーションを使用して型が SEI の参照を定義することができます。この場合、アノテーションが設定されたフィールドまたはメソッドの宣言から参照型を推定することができるならば、種類要素にデフォルト値を使用することができますが、必須ではありません 。ただし、値要素には常に、生成されたサービスクラス型を使用する必要があります。これは、
javax.xml.ws.Service
のサブタイプです。wsdlLocation
要素がある場合には、参照対象の生成されたサービスクラスの@WebService
アノテーションで指定された WSDL ロケーション情報をオーバーライドします。例12.21
@WebServiceRef
の例public class EJB3Client implements EJB3Remote { @WebServiceRef public TestEndpointService service4; @WebServiceRef public TestEndpoint port3;
XML Web Services は、Java EE コンテナ内にデプロイされたエンドポイントと任意のクライアントとの間における通信に XML メッセージを使用します。XML メッセージでは Simple Object Access Protocol (SOAP) と呼ばれる XML 言語を採用しています。JAX-WS API は、エンドポイントとクライアントがそれぞれ SOAP メッセージを送受信し、SOAP メッセージから Java への変換およびその逆の変換を行うことを可能にするメカニズムを提供します。これは marshalling
および unmarshalling
と呼ばれています。
Dispatch
クラスはこの機能を提供します。Dispatch
は 2 つの使用モードで動作し、次にあげる定数のいずれか一方により特定されます。
javax.xml.ws.Service.Mode.MESSAGE
- このモードは、クライアントアプリケーションがプロトコル固有のメッセージ構造を使用して直接連動するように指示します。SOAP プロトコルバインディングと併用すると、クライアントアプリケーションは SOAP メッセージと直接連動します。javax.xml.ws.Service.Mode.PAYLOAD
- このモードを使用すると、クライアントはペイロード自体と連動します。たとえば、 SOAP プロトコルバインディングと併用した場合、クライアントアプリケーションは SOAP メッセージ全体ではなく、SOAP ボディのコンテンツと連動します。
Dispatch
は、メッセージまたはペイロードを XML として構築する必要があるローレベルの API で、個別のプロトコルおよびメッセージまたはペイロード構造の詳細知識を厳格に順守します。Dispatch
は、あらゆるタイプのメッセージまたはメッセージペイロードの入出力をサポートする、ジェネリッククラスです。
例12.22 Dispatch
の使用法
Service service = Service.create(wsdlURL, serviceName); Dispatch dispatch = service.createDispatch(portName, StreamSource.class, Mode.PAYLOAD); String payload = "<ns1:ping xmlns:ns1='http://oneway.samples.jaxws.ws.test.jboss.org/'/>"; dispatch.invokeOneWay(new StreamSource(new StringReader(payload))); payload = "<ns1:feedback xmlns:ns1='http://oneway.samples.jaxws.ws.test.jboss.org/'/>"; Source retObj = (Source)dispatch.invoke(new StreamSource(new StringReader(payload)));
BindingProvider
インターフェースはクライアントが使用可能なプロトコルバインディングを提供するコンポーネントを表します。これはプロキシによって実装され、Dispatch
インターフェースによって拡張されます。
BindingProvider
インスタンスは非同期オペレーション機能を提供することが可能です。非同期オペレーション呼び出しは、呼び出し時に BindingProvider
インスタンスから切り離されます。オペレーション完了時には、応答コンテキストは更新されず、その代わりにResponse
インターフェースを使用して別の応答コンテキストを利用できるようになります。
例12.23 非同期呼び出しの例
public void testInvokeAsync() throws Exception { URL wsdlURL = new URL("http://" + getServerHost() + ":8080/jaxws-samples-asynchronous?wsdl"); QName serviceName = new QName(targetNS, "TestEndpointService"); Service service = Service.create(wsdlURL, serviceName); TestEndpoint port = service.getPort(TestEndpoint.class); Response response = port.echoAsync("Async"); // access future String retStr = (String) response.get(); assertEquals("Async", retStr); }
@Oneway
呼び出し
@Oneway
アノテーションは、所定の Web メソッドが入力メッセージを受け取っても出力メッセージは返さないことを表します。通常、@Oneway
メソッドは、ビジネスメソッドが実行される前に、制御のスレッドを呼び出しアプリケーションに返します。
例12.24 @Oneway
呼び出しの例
@WebService (name="PingEndpoint") @SOAPBinding(style = SOAPBinding.Style.RPC) public class PingEndpointImpl { private static String feedback; @WebMethod @Oneway public void ping() { log.info("ping"); feedback = "ok"; } @WebMethod public String feedback() { log.info("feedback"); return feedback; } }
HTTP 接続のタイムアウトの動作およびメッセージの受信を待つクライアントのタイムアウトは 2 つの異なるプロパティによって制御されます。第 1 のプロパティは javax.xml.ws.client.connectionTimeout
、第 2 のプロパティは javax.xml.ws.client.receiveTimeout
です。各プロパティはミリ秒で表します。正しい構文は次のとおりです。
例12.25 JAX-WS タイムアウト設定
public void testConfigureTimeout() throws Exception { //Set timeout until a connection is established ((BindingProvider)port).getRequestContext().put("javax.xml.ws.client.connectionTimeout", "6000"); //Set timeout until the response is received ((BindingProvider) port).getRequestContext().put("javax.xml.ws.client.receiveTimeout", "1000"); port.echo("testTimeout"); }
12.5. JAX-WS 開発に関する参考資料
12.5.1. Web Services Addressing (WS-Addressing) の有効化
前提条件
- お使いのアプリケーションに既存の JAX-WS サービスとクライアント設定がなければなりません。
手順12.1 タスク
サービスエンドポイントのアノテーション
アプリケーションのエンドポイントコードに@Addressing
アノテーションを追加します。例12.26
@Addressing
アノテーションこのサンプルでは、通常の JAX-WS エンドポイントに@Addressing
アノテーションを追加する場合です。package org.jboss.test.ws.jaxws.samples.wsa; import javax.jws.WebService; import javax.xml.ws.soap.Addressing; @WebService ( portName = "AddressingServicePort", serviceName = "AddressingService", wsdlLocation = "WEB-INF/wsdl/AddressingService.wsdl", targetNamespace = "http://www.jboss.org/jbossws/ws-extensions/wsaddressing", endpointInterface = "org.jboss.test.ws.jaxws.samples.wsa.ServiceIface" ) @Addressing(enabled=true, required=true) public class ServiceImpl implements ServiceIface { public String sayHello() { return "Hello World!"; } }
クライアントコードの更新
アプリケーションでクライアントコードを更新し WS-Addressing を設定例12.27 WS-Addressing のクライアント設定
このサンプルでは、通常の JAX-WS クライアントを更新し WS-Addressing を設定しています。package org.jboss.test.ws.jaxws.samples.wsa; import java.net.URL; import javax.xml.namespace.QName; import javax.xml.ws.Service; import javax.xml.ws.soap.AddressingFeature; public final class AddressingTestCase { private final String serviceURL = "http://localhost:8080/jaxws-samples-wsa/AddressingService"; public static void main(String[] args) throws Exception { // construct proxy QName serviceName = new QName("http://www.jboss.org/jbossws/ws-extensions/wsaddressing", "AddressingService"); URL wsdlURL = new URL(serviceURL + "?wsdl"); Service service = Service.create(wsdlURL, serviceName); ServiceIface proxy = (ServiceIface)service.getPort(ServiceIface.class, new AddressingFeature()); // invoke method proxy.sayHello(); } }
クライアントとエンドポイントは WS-Addressing を使い通信を行うようになりました。
12.5.2. JAX-WS の共通 API リファレンス
ハンドラーフレームワークは JAX-WS プロトコルバインディングにより、サーバーコンポーネントであるクライアントおよびエンドポイントのランタイムに実装されます。プロキシおよび Dispatch
のインスタンスは、バインディングプロバイダー と総称されており、それぞれがプロトコルバインディングを使用して抽象機能を特定のプロトコルにバインドします。
メッセージハンドラーのタイプ
- 論理ハンドラー
- 論理ハンドラー はメッセージコンテキストプロパティーおよびメッセージペイロードでのみ動作します。論理ハンドラーはプロトコル非依存なので、メッセージのプロトコル固有の部分に影響を与えることはできません。論理ハンドラーはインターフェース
javax.xml.ws.handler.LogicalHandler
を実装します。 - プロトコルハンドラー
- Protocol handlers はメッセージコンテキストおよびプロトコル固有のメッセージでのみ動作します。プロトコルハンドラーは特定のプロトコルに固有で、プロトコル固有のメッセージアスペクトにアクセスし、変更することが可能です。 プロトコルハンドラーは
javax.xml.ws.handler.Handler except javax.xml.ws.handler.LogicalHandler
から派生する任意のインターフェースを実装します。 - サービスエンドポイントハンドラー
- サービスエンドポイントでは、ハンドラーは
@HandlerChain
アノテーションを使用して定義されます。ハンドラーチェーンファイルのロケーションは、externalForm
内の絶対java.net.URL
、あるいはソースファイル/クラスファイルからの相対パスで指定することができます。例12.28 サービスエンドポイントハンドラーの例
@WebService @HandlerChain(file = "jaxws-server-source-handlers.xml") public class SOAPEndpointSourceImpl { ... }
- サービスクライアントハンドラー
- JAX-WS クライアントでは、ハンドラーは サービスエンドポイント同様に
@HandlerChain
アノテーションを使用するか、動的に JAX-WS API を使用して定義します。例12.29 API を使用したサービスクライアントハンドラーの定義
Service service = Service.create(wsdlURL, serviceName); Endpoint port = (Endpoint)service.getPort(Endpoint.class); BindingProvider bindingProvider = (BindingProvider)port; List<Handler> handlerChain = new ArrayList<Handler>(); handlerChain.add(new LogHandler()); handlerChain.add(new AuthorizationHandler()); handlerChain.add(new RoutingHandler()); bindingProvider.getBinding().setHandlerChain(handlerChain);
setHandlerChain
メソッドへのコールが必要です。
MessageContext
インターフェースは、全 JAX-WS メッセージコンテキスト用のスーパーインターフェースです。追加のメソッドと定数を使用して Map<String,Object>
を拡張し、ハンドラーチェーン内のハンドラーが処理関連の状態を共有できるようにするプロパティセットを管理します。たとえば、ハンドラーは put
メソッドを使用してメッセージコンテキストにプロパティを挿入することができます。その後、ハンドラーチェーン内の単一または複数のハンドラーは、 get
メソッドでメッセージを取得できるようになります。
APPLICATION
または HANDLER
としてスコープ指定されます。すべてのプロパティは、特定のエンドポイントの メッセージ交換パターン (MEP) のインスタンスの全ハンドラーが使用することができます。たとえば、論理ハンドラーがメッセージコンテキストにプロパティを挿入すると、そのプロパティは、MET インスタンスの実行中にチェーン内の任意のプロトコルハンドラーも使用することができます。
注記
APPLICATION
レベルにスコープ指定されているプロパティはクライアントアプリケーションとサービスエンドポイントの実装でも使用することができます。プロパティの defaultscope
は HANDLER
です。
- 論理メッセージコンテキスト
- 論理ハンドラーが呼び出される際には、タイプ
LogicalMessageContext
のメッセージコンテキストを受信します。LogicalMessageContext
は、メッセージペイロードを取得/変更するメソッドを使用してMessageContext
を拡張します。これは、メッセージのプロトコル固有のアスペクトへのアクセスは提供しません。プロトコルバインディングは、論理メッセージコンテキストを介して使用可能なメッセージコンポーネントを定義します。SOAP バインディングにデプロイされている論理ハンドラーは、SOAP ボディーのコンテンツにアクセス可能ですが、SOAP ヘッダーにはアクセスできません。一方、XML/HTTP バインディングは論理ハンドラーがメッセージの XML ペイロード全体にアクセスできることを定義します。 - SOAP メッセージコンテキスト
- SOAP ハンドラーが呼び出される際には、
SOAPMessageContext
を受信します。SOAPMessageContext
は SOAP メッセージペイロードを取得/変更するメソッドを使用してMessageContext
を拡張します。
アプリケーションは SOAPFaultException
またはアプリケーション固有のユーザー例外をスローします。後者の場合、必要とされる障害ラッパー (fault wrapper) Bean が既にデプロイメントの一部となっていなければ、ランタイムに生成されます。
例12.30 フォルトハンドリングの例
public void throwSoapFaultException() { SOAPFactory factory = SOAPFactory.newInstance(); SOAPFault fault = factory.createFault("this is a fault string!", new QName("http://foo", "FooCode")); fault.setFaultActor("mr.actor"); fault.addDetail().addChildElement("test"); thrownew SOAPFaultException(fault); }
public void throwApplicationException() throws UserException { thrownew UserException("validation", 123, "Some validation error"); }
JAX-WS API で使用可能なアノテーションは JSR-224 で定義されています。この定義は http://www.jcp.org/en/jsr/detail?id=224 に記載されています。これらのアノテーションは javax.xml.ws
パッケージに含まれています。
javax.jws
パッケージに含まれています。
第13章 アプリケーション内のアイデンティティー
13.1. 基本概念
13.1.1. 暗号化について
13.1.2. セキュリティードメインについて
13.1.3. SSL 暗号化
13.1.4. 宣言型セキュリティー
13.2. アプリケーションのロールベースセキュリティー
13.2.1. アプリケーションのセキュリティー
13.2.2. 認証について
13.2.3. 承認について
13.2.4. セキュリティー監査について
13.2.5. セキュリティーマッピングについて
13.2.6. セキュリティー拡張アーキテクチャー
インフラストラクチャーの最初の部分は JAAS API になります。JAAS はセキュリティーインフラストラクチャーとアプリケーションの間の抽象化レイヤーを提供するプラグ可能なフレームワークです。
AuthenticationManager
インターフェースと RealmMapping
インターフェースを実装する org.jboss.security.plugins.JaasSecurityManager
です。 JaasSecurityManager
は、対応するコンポーネントデプロイメント記述子の <security-domain>
要素を基に、EJB レイヤーと Web コンテナレイヤーに統合します。
JaasSecurityManagerService
MBean
JaasSecurityManagerService
MBean サービスはセキュリティーマネージャーを管理します。名前は JAAS で始まりますが、処理するセキュリティーマネージャーは実装で JAAS を使用する必要はありません。この名前は、デフォルトのセキュリティーマネージャー実装が JaasSecurityManager
であることを示しています。
JaasSecurityManagerService
の主要な役割はセキュリティーマネージャー実装を外部化することです。 AuthenticationManager
インターフェースと RealmMapping
インターフェースの代替の実装を提供してセキュリティーマネージャーの実装を変更することができます。
JaasSecurityManagerService
の 2 つ目の基礎的な役割は、JNDI javax.naming.spi.ObjectFactory
実装を提供して JNDI 名とセキュリティーマネージャー実装との間でバインディングの簡単なコードのない管理を実現することです。セキュリティーを有効にするには、<security-domain>
デプロイメント記述子要素よりセキュリティーマネージャー実装の JNDI 名を指定します。
JaasSecurityManagerService
が 次のネーミングシステムリファレンス をバインドし、java:/jaas
という名前の JNDI の ObjectFactory
として JaasSecurityManagerService
自体をノミネートします。これにより、 java:/jaas/XYZ
という形式の命名規則を <security-domain>
要素の値とすることができます。セキュリティードメインの名前を取るコンストラクターを使用して SecurityManagerClassName
属性によって指定されるクラスのインスタンスを作成して、XYZ
セキュリティードメインのセキュリティーマネージャーインスタンスは必要な時に作成されます。
注記
java:/jaas
プレフィックスがデプロイメント記述子に含まれるようにする必要はありません。後方互換性を維持するため指定することがあるかもしれませんが、このプレフィックスは無視されます。
org.jboss.security.plugins.JaasSecurityDomain
は、 SSL やその他の暗号化のユースケースをサポートするため KeyStore
や KeyManagerFactory
、 TrustManagerFactory
の概念を追加する JaasSecurityManager
の拡張です。
詳細や動作しているセキュリティーアーキテクチャーの実例については 「JAAS (Java 認証承認サービス) について」 を参照してください。
13.2.7. Java 認証承認サービス (JAAS)
13.2.8. JAAS (Java 認証承認サービス) について
サーバーグループ (管理ドメイン内) とサーバー (スタンドアローンサーバー内) にはセキュリティードメインの設定が含まれます。セキュリティードメインには、認証、承認、マッピング、監査のモジュールの組み合わせと設定詳細に関する情報が含まれています。アプリケーションは必要なセキュリティードメインを名前で jboss-web.xml
に指定します。
アプリケーション固有の設定は次の 4 つのファイルの 1 つ以上に設定されます。
表13.1 アプリケーション固有の設定ファイル
ファイル | 説明 |
---|---|
ejb-jar.xml |
EJB の
META-INF ディレクトリにある Enterprise JavaBean (EJB) アプリケーションのデプロイメント記述子です。ejb-jar.xml を使用してロールを指定し、アプリケーションレベルでプリンシパルへマッピングします。また、特定のメソッドやクラスを特定のロールへ制限することも可能です。セキュリティーに関係しない他の EJB 固有の設定に対しても使用できます。
|
web.xml |
Java Enterprise Edition (EE) の Web アプリケーションのデプロイメント記述子です。
web.xml を使用して、認証や承認にアプリケーションが使用するセキュリティードメインを宣言します。また、許可される HTTP リクエストのタイプを制限するなど、アプリケーションのリソースやトランスポートを制約するため使用することもできます。このファイルに簡単な Web ベースの認証を設定することもできます。セキュリティーに関係しない他のアプリケーション固有の設定に使用することもできます。
|
jboss-ejb3.xml | ejb-jar.xml 記述子への JBoss 固有の拡張が含まれます。
|
jboss-web.xml | web.xml 記述子への JBoss 固有の拡張が含まれます。
|
注記
ejb-jar.xml
と web.xml
は Java Enterprise Edition (Java EE) 仕様に定義されています。jboss-ejb3.xml
は ejb-jar.xml
の JBoss 固有の拡張を提供し、jboss-web.xml
は web.xml
の JBoss 固有の拡張を提供します。
Java 認証承認サービス (JAAS) はプラグ可能認証モジュール (PAM) を使用した、 Java アプリケーションのユーザーレベルのセキュリティーに対するフレームワークです。JAAS は Java ランタイム環境 (JRE) に統合されます。JBoss Enterprise Application Platform では、コンテナ側のコンポーネントは org.jboss.security.plugins.JaasSecurityManager
MBean で、AuthenticationManager
インターフェースと RealmMapping
インターフェースのデフォルト実装を提供します。
JaasSecurityManager は JAAS パッケージを使用して AuthenticationManager と RealmMapping インターフェースの動作を実装します。JaasSecurityManager へ割り当てられたセキュリティードメインに設定されたログインモジュールインスタンスを実行するとこの動作が生じます。ログインモジュールはセキュリティードメインのプリンシパルの認証やロールマッピングの挙動を実装します。ドメインの異なるログインモジュール設定を組み込むと、異なるセキュリティードメイン全体で JaasSecurityManager を使用することができます。
EJBHome
を実装するメソッドのクライアント呼び出しの概要になります。EJB は既にサーバーにデプロイされ、EJBHome
インターフェースメソッドは ejb-jar.xml
記述子の <method-permission> 要素を使用して安全な状態になっています。jboss-ejb3.xml
ファイルの <security-domain> 要素に指定される jwdomain
セキュリティードメインを使用します。以下の図は図の後で説明する手順を表しています。
図13.1 保護された EJB メソッド呼び出しの手順
- クライアントが JAAS のログインを実行し、認証のプリンシパルと認証情報を確立します。上図では Client Side Login とラベル付けされます。JNDI より実行することも可能です。JAAS ログインを実行するには、LoginContext インスタンスを作成し、使用する設定の名前を渡します。ここでの設定名は
other
になります。このワンタイムログインは、ログインプリンシパルと認証情報を後続の EJB メソッド呼び出しすべてへ関連付けます。プロセスがユーザーを認証するとは限りません。クライアント側のログインの性質は、クライアントが使用するログインモジュール設定によって異なります。この例では、other
というクライアント側ログイン設定エントリーがClientLoginModule
ログインモジュールを使用します。サーバー上で後で認証が行われるため、このモジュールはユーザー名とパスワードを EJB 呼び出しレイヤーへバインドします。クライアントのアイデンティティーはクライアント上で認証されません。 - クライアントは
EJBHome
メソッドを取得し、このメソッドをサーバー上で呼び出します。呼び出しにはクライアントによって渡されたメソッド引数や、クライアント側 JAAS ログインからのユーザー ID や認証情報が含まれます。 - サーバー上では、セキュリティーインターセプターがメソッドを呼び出したユーザーを認証します。これには別の JAAS ログインが関係します。
- セキュリティードメインはログインモジュールの選択を完全に決定しません。セキュリティードメインの名前はログイン設定エントリー名として
LoginContext
コンストラクターへ渡されます。EJB セキュリティードメインはjwdomain
です。JAAS 認証に成功すると、JAAS サブジェクトが作成されます。JAAS サブジェクトには次の詳細を含む PrincipalSet が含まれます。- デプロイメントセキュリティー環境よりクライアントアイデンティティーへ対応する
java.security.Principal
インスタンス。 - ユーザーのアプリケーションドメインからのロール名が含まれる
Roles
と呼ばれるjava.security.acl.Group
。org.jboss.security.SimplePrincipal
タイプのオブジェクトはロール名を表します。これらのロールは、ejb-jar.xml
とEJBContext.isCallerInRole(String)
メソッド実装の制約に従って EJB メソッドへのアクセスを検証します。 - アプリケーションドメインの呼び出し側のアイデンティティーに対応する 1 つの
org.jboss.security.SimplePrincipal
が含まれるCallerPrincipal
という名前の任意のjava.security.acl.Group
。CallerPrincipal グループメンバーはEJBContext.getCallerPrincipal()
メソッドによって返される値です。このマッピングは、運用セキュリティー環境のプリンシパルがアプリケーションが認識するプリンシパルへマッピングできるようにします。CallerPrincipal マッピングが存在しない場合、運用プリンシパルはアプリケーションドメインプリンシパルと同じになります。
- EJB メソッドを呼び出しているユーザーは呼び出しが許可されているユーザーであることをサーバーが検証します。次の手順でこの承認を実行します。
- EJB コンテナから EJBメソッドへアクセスすることが許可されるロールの名前を取得します。呼び出されたメソッドが含まれるすべての <method-permission> 要素の
ejb-jar.xml
記述子 <role-name> 要素によってロール名が判断されます。 - 割り当てられたロールがなかったり、メソッドが exclude-list 要素に指定されている場合、メソッドへのアクセスは拒否されます。それ以外の場合は、セキュリティーインターセプターによってセキュリティーマネージャー上で
doesUserHaveRole
メソッドが呼び出され、呼び出し側に割り当てられたロール名の 1 つがあるかどうかを確認します。このメソッドはロール名より繰り返され、認証されたユーザーのSubject Roles
グループに割り当てられたロール名を持つ SimplePrincipal が含まれるか確認します。Roles グループメンバーのロール名がある場合はアクセスが許可されます。メンバーのロール名がない場合はアクセスが拒否されます。 - EJB がカスタムのセキュリティープロキシを使用する場合、メソッドの呼び出しはプロキシへ委譲されます。セキュリティープロキシが呼び出し側へのアクセスを拒否すると、
java.lang.SecurityException
がスローされます。それ以外の場合は EJB メソッドへのアクセスは許可され、メソッド呼び出しは次のコンテナインターセプターへ渡されます。SecurityProxyInterceptor はこのチェックを処理し、このインターセプターは表示されません。 - Web 接続要求の場合、
web.xml
で定義され、要求されたリソースとアクセスされた HTTP メソッドに一致するセキュリティー制約を Web サーバーがチェックします。要求に対して制約が存在する場合、Web サーバーは JaasSecurityManager を呼び出し、プリンシパルの認証を行います。これにより、確実にユーザーロールがプリンシパルオブジェクトへ関連付けられているようにします。
13.2.9. アプリケーションでのセキュリティードメインの使用
サーバーグループやスタンドアローンサーバーに対してセキュリティードメインを設定した後、アプリケーションを設定して使用するようにすることができます。セキュリティードメインを WAR の WEB-INF/jboss-web.xml
記述子ファイルに指定するか、アノテーションを用いて指定することが可能です。
例13.1 WEB-INF/jboss-web.xml
にセキュリティードメインを指定する
WEB-INF/web.xml
ファイルにある <jboss-web>
要素の <security-domain>
子要素に指定します。
<jboss-web> <security-domain>my-domain</security-domain> </jboss-web>
WEB-INF/jboss-web.xml
記述子に指定できる多くの設定の 1 つになります。
例13.2 アノテーションを用いて EJB 上でセキュリティードメインを指定する
SPNEGO
セキュリティードメインを指定します。セキュリティードメインは既にコンテナに設定されています。
package example.ejb3; import javax.annotation.Resource; import javax.annotation.security.RolesAllowed; import javax.ejb.EJBContext; import javax.ejb.Stateless; import org.jboss.ejb3.annotation.SecurityDomain; @Stateless @SecurityDomain("SPNEGO") @RolesAllowed("JBossAdmin") public class SessionBean implements Session { @Resource private EJBContext context; public void echo(String echo) { System.out.println(echo); System.out.println("Principal.getClass(): " + context.getCallerPrincipal().getClass()); System.out.println("Principal.getName(): " + context.getCallerPrincipal().getName()); System.out.println("isCallerInRole('JBossAdmin')? " + context.isCallerInRole("JBossAdmin")); } }
13.2.10. サーブレットでのロールベースセキュリティーの使用
jboss-web.xml
に指定されたセキュリティードメインによって処理されます。
サーブレットで ロールベースセキュリティーを使用する前に、アクセスの認証と承認に使用されるセキュリティードメインを JBoss Enterprise Application Platform のコンテナに設定する必要があります。
手順13.1 ロールベースセキュリティーのサーブレットへの追加
サーブレットと URL パターンの間にマッピングを追加します。
web.xml
の<servlet-mapping>
要素を使用して各サーブレットを URL パターンへマッピングします。次の例はDisplayOpResult
と呼ばれるサーブレットを URL パターン/DisplayOpResult
にマッピングします。<servlet-mapping> <servlet-name>DisplayOpResult</servlet-name> <url-pattern>/DisplayOpResult</url-pattern> </servlet-mapping>
URL パターンにセキュリティー制約を追加します。
URL パターンをセキュリティー制約へマッピングするには、<security-constraint>
を使用します。次の例は、ロールeap_admin
を持つプリンシパルによる URL パターン/DisplayOpResult
のアクセスを制約します。セキュリティードメインにロールが存在していなければなりません。<security-constraint> <display-name>Restrict access to role eap_admin</display-name> <web-resource-collection> <web-resource-name>Restrict access to role eap_admin</web-resource-name> <url-pattern>/DisplayOpResult/*</url-pattern> </web-resource-collection> <auth-constraint> <role-name>eap_admin</role-name> </auth-constraint> <security-role> <role-name>eap_admin</role-name> </security-role> </security-constraint>
WAR の
jboss-web.xml
にセキュリティードメインを指定します。セキュリティー制約に対してプリンシパルを認証および承認する方法を認識している設定済みのセキュリティーにサーブレットを接続するため、WAR のjboss-web.xml
にセキュリティードメインを追加します。次の例はacme_domain
というセキュリティードメインを使用します。<jboss-web> ... <security-domain>acme_domain</security-domain> ... </jboss-web>
13.2.11. アプリケーションにおけるサードパーティー認証システムの使用
注記
context.xml
デプロイメント記述子には設定されないようになりました。バルブは直接 jboss-web.xml
記述子に設定されます。context.xml
は無視されるようになりました。
例13.3 基本的な認証バルブ
<jboss-web> <security-domain>SPNEGO</security-domain> <valve> <class-name>org.jboss.security.negotiation.NegotiationAuthenticator</class-name> </valve> </jboss-web>
例13.4 ヘッダー属性セットを持つカスタムバルブ
<jboss-web> <Valve> <class-name>org.jboss.web.tomcat.security.GenericHeaderAuthenticator</class-name> <attribute name="httpHeaderForSSOAuth>sm_ssoid,ct-remote-user,HTTP_OBLIX_UID</attribute-name> <attribute name="sessionCookieForSSOAuth">SMSESSION,CTSESSION,ObSSOCookie</attribute> </Valve> </jboss-web>
独自のオーセンティケーターの作成については本書の範囲外となりますが、次の Java コードが例として提供されています。
例13.5 GenericHeaderAuthenticator.java
/* * JBoss, Home of Professional Open Source. * Copyright 2006, Red Hat Middleware LLC, and individual contributors * as indicated by the @author tags. See the copyright.txt file in the * distribution for a full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.web.tomcat.security; import java.io.IOException; import java.security.Principal; import java.util.StringTokenizer; import javax.management.JMException; import javax.management.ObjectName; import javax.servlet.http.Cookie; import org.apache.catalina.Realm; import org.apache.catalina.Session; import org.apache.catalina.authenticator.Constants; import org.apache.catalina.connector.Request; import org.apache.catalina.connector.Response; import org.apache.catalina.deploy.LoginConfig; import org.jboss.logging.Logger; /** * JBAS-2283: Provide custom header based authentication support * * Header Authenticator that deals with userid from the request header * Requires two attributes configured on the Tomcat Service - one for * the http header denoting the authenticated identity and the other * is the SESSION cookie * * @author <a href="mailto:Anil.Saldhana@jboss.org">Anil Saldhana</a> * @author <a href="mailto:sguilhen@redhat.com">Stefan Guilhen</a> * @version $Revision$ * @since Sep 11, 2006 */ public class GenericHeaderAuthenticator extends ExtendedFormAuthenticator { protected static Logger log = Logger.getLogger(GenericHeaderAuthenticator.class); protected boolean trace = log.isTraceEnabled(); // JBAS-4804: GenericHeaderAuthenticator injection of ssoid and sessioncookie name. private String httpHeaderForSSOAuth = null; private String sessionCookieForSSOAuth = null; /** * <p> * Obtain the value of the <code>httpHeaderForSSOAuth</code> attribute. This attribute is * used to indicate the request header ids that have to be checked in order to retrieve the SSO * identity set by a third party security system. * </p> * * @return a <code>String</code> containing the value of the <code>httpHeaderForSSOAuth</code> * attribute. */ public String getHttpHeaderForSSOAuth() { return httpHeaderForSSOAuth; } /** * <p> * Set the value of the <code>httpHeaderForSSOAuth</code> attribute. This attribute is * used to indicate the request header ids that have to be checked in order to retrieve the SSO * identity set by a third party security system. * </p> * * @param httpHeaderForSSOAuth a <code>String</code> containing the value of the * <code>httpHeaderForSSOAuth</code> attribute. */ public void setHttpHeaderForSSOAuth(String httpHeaderForSSOAuth) { this.httpHeaderForSSOAuth = httpHeaderForSSOAuth; } /** * <p> * Obtain the value of the <code>sessionCookieForSSOAuth</code> attribute. This attribute is used * to indicate the names of the SSO cookies that may be present in the request object. * </p> * * @return a <code>String</code> containing the names (separated by a <code>','</code>) of the SSO cookies * that may have been set by a third party security system in the request. */ public String getSessionCookieForSSOAuth() { return sessionCookieForSSOAuth; } /** * <p> * Set the value of the <code>sessionCookieForSSOAuth</code> attribute. This attribute is used * to indicate the names of the SSO cookies that may be present in the request object. * </p> * * @param sessionCookieForSSOAuth a <code>String</code> containing the names (separated by a * <code>','</code>) of the SSO cookies that may have been set by a third party security system in * the request. */ public void setSessionCookieForSSOAuth(String sessionCookieForSSOAuth) { this.sessionCookieForSSOAuth = sessionCookieForSSOAuth; } /** * <p> * Creates an instance of <code>GenericHeaderAuthenticator</code>. * </p> */ public GenericHeaderAuthenticator() { super(); } public boolean authenticate(Request request, Response response, LoginConfig config) throws IOException { log.trace("Authenticating user"); Principal principal = request.getUserPrincipal(); if (principal != null) { if (trace) log.trace("Already authenticated '" + principal.getName() + "'"); return true; } Realm realm = context.getRealm(); Session session = request.getSessionInternal(true); String username = getUserId(request); String password = getSessionCookie(request); //Check if there is sso id as well as sessionkey if (username == null || password == null) { log.trace("Username is null or password(sessionkey) is null:fallback to form auth"); return super.authenticate(request, response, config); } principal = realm.authenticate(username, password); if (principal == null) { forwardToErrorPage(request, response, config); return false; } session.setNote(Constants.SESS_USERNAME_NOTE, username); session.setNote(Constants.SESS_PASSWORD_NOTE, password); request.setUserPrincipal(principal); register(request, response, principal, Constants.FORM_METHOD, username, password); return true; } /** * Get the username from the request header * @param request * @return */ protected String getUserId(Request request) { String ssoid = null; //We can have a comma-separated ids String ids = ""; try { ids = this.getIdentityHeaderId(); } catch (JMException e) { if (trace) log.trace("getUserId exception", e); } if (ids == null || ids.length() == 0) throw new IllegalStateException("Http headers configuration in tomcat service missing"); StringTokenizer st = new StringTokenizer(ids, ","); while (st.hasMoreTokens()) { ssoid = request.getHeader(st.nextToken()); if (ssoid != null) break; } if (trace) log.trace("SSOID-" + ssoid); return ssoid; } /** * Obtain the session cookie from the request * @param request * @return */ protected String getSessionCookie(Request request) { Cookie[] cookies = request.getCookies(); log.trace("Cookies:" + cookies); int numCookies = cookies != null ? cookies.length : 0; //We can have comma-separated ids String ids = ""; try { ids = this.getSessionCookieId(); log.trace("Session Cookie Ids=" + ids); } catch (JMException e) { if (trace) log.trace("checkSessionCookie exception", e); } if (ids == null || ids.length() == 0) throw new IllegalStateException("Session cookies configuration in tomcat service missing"); StringTokenizer st = new StringTokenizer(ids, ","); while (st.hasMoreTokens()) { String cookieToken = st.nextToken(); String val = getCookieValue(cookies, numCookies, cookieToken); if (val != null) return val; } if (trace) log.trace("Session Cookie not found"); return null; } /** * Get the configured header identity id * in the tomcat service * @return * @throws JMException */ protected String getIdentityHeaderId() throws JMException { if (this.httpHeaderForSSOAuth != null) return this.httpHeaderForSSOAuth; return (String) mserver.getAttribute(new ObjectName("jboss.web:service=WebServer"), "HttpHeaderForSSOAuth"); } /** * Get the configured session cookie id in the tomcat service * @return * @throws JMException */ protected String getSessionCookieId() throws JMException { if (this.sessionCookieForSSOAuth != null) return this.sessionCookieForSSOAuth; return (String) mserver.getAttribute(new ObjectName("jboss.web:service=WebServer"), "SessionCookieForSSOAuth"); } /** * Get the value of a cookie if the name matches the token * @param cookies array of cookies * @param numCookies number of cookies in the array * @param token Key * @return value of cookie */ protected String getCookieValue(Cookie[] cookies, int numCookies, String token) { for (int i = 0; i < numCookies; i++) { Cookie cookie = cookies[i]; log.trace("Matching cookieToken:" + token + " with cookie name=" + cookie.getName()); if (token.equals(cookie.getName())) { if (trace) log.trace("Cookie-" + token + " value=" + cookie.getValue()); return cookie.getValue(); } } return null; } }
13.3. セキュリティレルム
13.3.1. セキュリティーレルムについて
ManagementRealm
は、管理 CLI や Web ベースの管理コンソールに機能を提供する管理 API のユーザーやパスワード、ロール情報を保存します。JBoss Enterprise Application Platform を管理するため認証システムを提供します。管理 API に使用する同じビジネスルールでアプリケーションを認証する必要がある場合にManagementRealm
を使用することもできます。ApplicationRealm
は Web アプリケーションと EJB のユーザーやパスワード、ロール情報を保存します。
REALM-users.properties
はユーザー名とハッシュ化されたパスワードを保存します。REALM-users.roles
はユーザーからロールへのマッピングを保存します。
domain/configuration/
および standalone/configuration/
ディレクトリに保存されます。ファイルは add-user.sh
や add-user.bat
コマンドによって同時に書き込まれます。コマンドを実行する時、新しいユーザーをどのレルムに追加するか最初に決定します。
13.3.2. 新しいセキュリティレルムの追加
Management CLI を実行します。
jboss-cli.sh
またはjboss-cli.bat
コマンドを開始し、サーバーに接続します。新しいセキュリティーレルムを作成します。
次のコマンドを実行し、ドメインコントローラーまたはスタンドアローンサーバー上でMyDomain
という名前の新しいセキュリティーレルムを作成します。/host=master/core-service=management/security-realm=MyDomainRealm:add()
新しいロールの情報を保存するプロパティーファイルへの参照を作成します。
次のコマンドを実行し、新しいロールに関連するプロパティーが含まれるmyfile.properties
という名前のファイルのポインターを作成します。/host=master/core-service=management/security-realm=MyDomainRealm/authentication=properties:add(path=myfile.properties)
新しいセキュリティーレルムが作成されました。この新しいレルムにユーザーやロールを追加すると、デフォルトのセキュリティーレルムとは別のファイルに情報が保存されます。
13.3.3. セキュリティーレルムへユーザーを追加
add-user.sh
またはadd-user.bat
コマンドを実行します。コマンドラインインターフェース (CLI) を開きます。EAP_HOME/bin/
ディレクトリへ移動します。Red Hat Enterprise Linux や他の UNIX 系のオペレーティングシステムを稼働している場合はadd-user.sh
を実行します。Microsoft Windows Server を稼働している場合はadd-user.bat
を実行します。管理ユーザーやアプリケーションユーザーを追加するか選択します。
この手順ではb
を入力し、アプリケーションユーザーを追加します。ユーザーが追加されるレルムを選択します。
デフォルトでは、ApplicationRealm
のみが選択可能です。カスタムレルムが追加されている場合はその名前を入力します。入力を促されたらユーザー名、パスワード、ロールを入力します。
入力を促されたら希望のユーザー名、パスワード、任意のロールを入力します。yes
を入力して選択を確認するか、no
を入力して変更をキャンセルします。変更はセキュリティーレルムの各プロパティーファイルに書き込まれます。
13.4. EJB アプリケーションセキュリティー
13.4.1. セキュリティアイデンティティ (ID)
13.4.1.1. EJB のセキュリティ ID
<security-identity>
タグのことです。これは、EJB がコンポーネントでメソッド呼び出しを行う際に必ず使う必要のあるアイデンティティを指します。
<use-caller-identity>
タグがあり、特定ロールの場合は <run-as>
タグが使用されます。
13.4.1.2. EJB のセキュリティーアイデンティティーの設定
例13.6 呼び出し側と同じになるように EJB のセキュリティーアイデンティティーを設定する
<security-identity>
要素の宣言を指定しない場合、この挙動がデフォルトになります。
<ejb-jar> <enterprise-beans> <session> <ejb-name>ASessionBean</ejb-name> <!-- ... --> <security-identity> <use-caller-identity/> </security-identity> </session> <!-- ... --> </enterprise-beans> </ejb-jar>
例13.7 特定ロールに EJB のセキュリティーアイデンティティーを設定する
<security-identity>
タグの中に <run-as>
または <role>
タグを使用します。
<ejb-jar> <enterprise-beans> <session> <ejb-name>RunAsBean</ejb-name> <!-- ... --> <security-identity> <run-as> <description>A private internal role</description> <role-name>InternalRole</role-name> </run-as> </security-identity> </session> </enterprise-beans> <!-- ... --> </ejb-jar>
<run-as>
を使用すると anonymous
という名前のプリンシパルが発信呼び出しへ割り当てられます。違うプリンシプルを割り当てる場合は <run-as-principle>
を使用します。
<session> <ejb-name>RunAsBean</ejb-name> <security-identity> <run-as-principal>internal</run-as-principal> </security-identity> </session>
注記
<run-as>
要素と <run-as-principle>
要素を使用することもできます。
以下も参照してください。
13.4.2. EJB メソッドのパーミッション
13.4.2.1. EJB メソッドのパーミッション
<method-permisison>
要素の宣言を提供します。この宣言により、EJB のインターフェースメソッドを呼び出し可能なロールを設定します。以下の組み合わせに対してパーミッションの指定が可能です。
- 名前付き EJB のホームおよびコンポーネントインターフェースメソッド
- 名前付き EJB のホームあるいはコンポーネントインターフェースの指定メソッド
- オーバーロードした名前を持つメソッドセット内の指定メソッド
13.4.2.2. EJB メソッドパーミッションの使用
<method-permission>
要素は、<method>
要素によって定義される EJB メソッドへアクセスできる論理ロールを定義します。XML の構文を表す例は複数あります。メソッドパーミッションステートメントは複数存在することがあり、累積的な影響があります。<method-permission>
要素は <ejb-jar>
記述子の <assembly-descriptor>
要素の子要素です。
例13.8 ロールが EJB の全メソッドへのアクセスできるようにする
<method-permission> <description>The employee and temp-employee roles may access any method of the EmployeeService bean </description> <role-name>employee</role-name> <role-name>temp-employee</role-name> <method> <ejb-name>EmployeeService</ejb-name> <method-name>*</method-name> </method> </method-permission>
例13.9 EJB の特定メソッドへのみロールがアクセスできるようにし、パラメーターが渡すことができるメソッドを制限します。
<method-permission> <description>The employee role may access the findByPrimaryKey, getEmployeeInfo, and the updateEmployeeInfo(String) method of the AcmekPayroll bean </description> <role-name>employee</role-name> <method> <ejb-name>AcmekPayroll</ejb-name> <method-name>findByPrimaryKey</method-name> </method> <method> <ejb-name>AcmePayroll</ejb-name> <method-name>getEmployeeInfo</method-name> </method> <method> <ejb-name>AcmePayroll</ejb-name> <method-name>updateEmployeeInfo</method-name> <method-params> <method-param>java.lang.String</method-param> </method-params> </method> </method-permission>
例13.10 承認された全ユーザーが EJB のメソッドにアクセスできるようにする
<unchecked/>
要素を使用すると、承認された全ユーザーが指定のメソッドを使用できます。
<method-permission> <description>Any authenticated user may access any method of the EmployeeServiceHelp bean</description> <unchecked/> <method> <ejb-name>EmployeeServiceHelp</ejb-name> <method-name>*</method-name> </method> </method-permission>
例13.11 特定の EJB メソッドを完全に除外して使用されないようにする
<exclude-list> <description>No fireTheCTO methods of the EmployeeFiring bean may be used in this deployment</description> <method> <ejb-name>EmployeeFiring</ejb-name> <method-name>fireTheCTO</method-name> </method> </exclude-list>
例13.12 複数の <method-permission>
ブロックが含まれる完全な <assembly-descriptor>
<ejb-jar> <assembly-descriptor> <method-permission> <description>The employee and temp-employee roles may access any method of the EmployeeService bean </description> <role-name>employee</role-name> <role-name>temp-employee</role-name> <method> <ejb-name>EmployeeService</ejb-name> <method-name>*</method-name> </method> </method-permission> <method-permission> <description>The employee role may access the findByPrimaryKey, getEmployeeInfo, and the updateEmployeeInfo(String) method of the AcmePayroll bean </description> <role-name>employee</role-name> <method> <ejb-name>AcmePayroll</ejb-name> <method-name>findByPrimaryKey</method-name> </method> <method> <ejb-name>AcmePayroll</ejb-name> <method-name>getEmployeeInfo</method-name> </method> <method> <ejb-name>AcmePayroll</ejb-name> <method-name>updateEmployeeInfo</method-name> <method-params> <method-param>java.lang.String</method-param> </method-params> </method> </method-permission> <method-permission> <description>The admin role may access any method of the EmployeeServiceAdmin bean </description> <role-name>admin</role-name> <method> <ejb-name>EmployeeServiceAdmin</ejb-name> <method-name>*</method-name> </method> </method-permission> <method-permission> <description>Any authenticated user may access any method of the EmployeeServiceHelp bean</description> <unchecked/> <method> <ejb-name>EmployeeServiceHelp</ejb-name> <method-name>*</method-name> </method> </method-permission> <exclude-list> <description>No fireTheCTO methods of the EmployeeFiring bean may be used in this deployment</description> <method> <ejb-name>EmployeeFiring</ejb-name> <method-name>fireTheCTO</method-name> </method> </exclude-list> </assembly-descriptor> </ejb-jar>
13.4.3. EJB セキュリティアノテーション
13.4.3.1. EJB セキュリティーアノテーション
- @DeclareRoles
- どのロールが利用可能か宣言します。
- @RulesAllowed、 @PermitAll、 @DenyAll
- どのメソッドパーミッションが可能か指定します。メソッドパーミッションについては 「EJB メソッドのパーミッション」 を参照してください。
- @RunAs
- コンポーネントの伝搬されたセキュリティー ID を設定します。
13.4.3.2. EJB セキュリティーアノテーションの使用
XML 記述子かアノテーションを使用して、どのセキュリティーロールが Enterprise JavaBean (EJB) でメソッドを呼び出しできるかを制御することができます。XML 記述子の使用については 「EJB メソッドパーミッションの使用」 を参照してください。
EJB のセキュリティーパーミッションを制御するアノテーション
- @DeclareRoles
- @DeclareRoles を使用して、どのセキュリティーロールに対してパーミッションをチェックするか定義します。@DeclareRoles が存在しない場合、@RolesAllowed アノテーションよりリストが自動的に構築されます。
- @RolesAllowed、@PermitAll、@DenyAll
- @RolesAllowed を使用して、1 つまたは複数のメソッドへのアクセスが許可されるロールをリストします。すべてのロールに対して 1 つまたは複数のメソッドの使用を許可する場合は @PermitAll、すべてのロールに対してメソッドの使用を拒否する場合は @DenyAll を使用します。
- @RunAs
- @RunAs を使用してロールを指定すると、メソッドが常にそのロールとして実行されるようにします。
例13.13 セキュリティーアノテーションの例
@Stateless @RolesAllowed("admin") public class WelcomeEJB implements Welcome { @PermitAll public String WelcomeEveryone(String msg) { return "Welcome to " + msg; } @RunAs("tempemployee") public String GoodBye(String msg) { return "Goodbye, " + msg; } public String public String GoodbyeAdmin(String msg) { return "See you later, " + msg; } }
WelcomeEveryone
メソッドにアクセスできます。 GoodBye
メソッドは tempemployee
ロールとして実行されます。 GoodbyeAdmin
メソッドと、セキュリティーアノテーションのない他のメソッドへは admin
ロールのみがアクセスできます。
13.4.4. EJB へのリモートアクセス
13.4.4.1. Remoting について
サポートされているトランスポートタイプ
- ソケット / セキュアソケット
- RMI / RMI over SSL
- HTTP / HTTPS
- サーブレット / セキュアサーブレット
- バイソケット (Bisocket) / セキュアバイソケット (Secure Bisocket)
Remoting システムはデータのマーシャリングサービスやアンマーシャリングサービスも提供します。データのマーシャリングとは、別のシステムの作業を実行できるようネットワークやプラットフォーム境界の全体で安全にデータを移動できる機能のことを言います。作業は元のシステムへ返送され、ローカルで処理されたように動作します。
Remoting を使用するクライアントアプリケーションを設計する場合、URL 型の形式の単純な文字列である InvokerLocator
と呼ばれる特別なリソースロケーターを使用するよう設定し、アプリケーションがサーバーと通信するようにします。Remoting サブシステムの一部として設定される connector
上でサーバーは Remoting の要求をリッスンします。connector
は設定済みの ServerInvocationHandler
へ要求を渡します。各 ServerInvocationHandler
は要求の対処方法を認識するメソッド invoke(InvocationRequest)
を実装します。
Remoting フレームワークレイヤー
- ユーザーは外部レイヤーとやりとりします。クライアント側では外部レイヤーは呼び出し要求を送信する
Client
クラスになります。サーバー側ではユーザーによって実装され、呼び出し要求を受信する InvocationHandler になります。 - トランスポートはインボーカーレイヤーによって制御されます。
- 最も下のレイヤーにはデータ形式をワイヤー形式に変換するマーシャラーとアンマーシャラーが含まれています。
13.4.4.2. Remoting コールバックについて
InvocationRequest
をクライアントに送信します。コールバックが同期的または非同期的であるかに関わらず、サーバー側のコードは同様に動作します。クライアントのみが違いを認識する必要があります。サーバーの InvocationRequest は responseObject
をクライアントに送信します。これはクライアントが要求したペイロードで、要求やイベント通知への直接応答になる場合があります。
m_listeners
オブジェクトを使用してリスナーを追跡します。これにはサーバーハンドラーに追加された全リスナーのリストが含まれます。ServerInvocationHandler
インターフェースにはこのリストを管理できるようにするメソッドが含まれます。
org.jboss.remoting.InvokerCallbackHandler
の実装で、コールバックデータを処理します。コールバックハンドラーの実装後、プルコールバックのリスナーを追加するか、プッシュコールバックのコールバックサーバーを実装します。
プルコールバックでは、Client.addListener()
メソッドを使用してクライアントが自身にサーバーのリスナーリストをを追加します。その後、コールバックデータを同期的に配信するためサーバーを周期的にプルします。ここでは Client.getCallbacks()
を使用してプルが実行されます。
プッシュコールバックではクライアントアプリケーションが独自の InvocationHandler を実行する必要があります。これには、クライアント上で Remoting サービスを実行する必要があります。これは コールバックサーバーと呼ばれます。コールバックサーバーは受信する要求を非同期的に許可し、要求元 (この場合はサーバー) のために処理します。メインサーバーを用いてクライアントのコールバックサーバーを登録するには、コールバックサーバーの InvokerLocator
を addListener
への 2 番目の引数として渡します。
13.4.4.3. リモーティングサーバーの検出について
13.4.4.4. Remoting サブシステムの設定
JBoss Remoting にはワーカースレッドプール、1 つ以上のコネクター、複数のローカルおよびリモート接続 URI の 3 つのトップレベル設定可能要素があります。ここでは設定可能な項目の説明、各項目の設定方法に対する CLI コマンド例、完全設定されたサブシステムの XML 例について取り上げます。この設定はサーバーのみに適用されます。独自のアプリケーションにカスタムコネクターを使用する場合を除き、Remoting のサブシステムの設定は必要でないことがほとんどです。EJB など Remoting クライアントとして動作するアプリケーションには特定のコネクターに接続するための個別の設定が必要になります。
注記
default
プロファイルを設定する時、CLI コマンドは管理されたドメインに対して公式化されます。異なるプロファイルを設定するには、プロファイルの名前を置き換えます。スタンドアローンサーバーではコマンドの /profile=default
の部分を省略します。
remoting
サブシステムの外部にも設定の側面が存在します。
- ネットワークインターフェース
remoting
サブシステムによって使用されるネットワークネットワークインターフェースはdomain/configuration/domain.xml
またはstandalone/configuration/standalone.xml
で定義されるusecure
インターフェースです。<interfaces> <interface name="management"/> <interface name="public"/> <interface name="unsecure"/> </interfaces>
unsecure
インターフェースのホストごとの定義はdomain.xml
またはstandalone.xml
と同じディレクトリにあるhost.xml
で定義されます。<interfaces> <interface name="management"> <inet-address value="${jboss.bind.address.management:127.0.0.1}"/> </interface> <interface name="public"> <inet-address value="${jboss.bind.address:127.0.0.1}"/> </interface> <interface name="unsecure"> <!-- Used for IIOP sockets in the standard configuration. To secure JacORB you need to setup SSL --> <inet-address value="${jboss.bind.address.unsecure:127.0.0.1}"/> </interface> </interfaces>
- socket-binding
remoting
サブシステムによって使用されるデフォルトの socket-binding は TCP ポート 4777 へバインドします。この設定を変更する必要がある場合はソケットバインディングとソケットバインディンググループに関するドキュメントを参照してください。- EJB の Remoting コネクター参照
- EJB サブシステムにはリモートメソッド呼び出しに対するリモーティングコネクターへの参照が含まれています。デフォルト設定は次の通りです。
<remote connector-ref="remoting-connector" thread-pool-name="default"/>
- 安全なトランスポート設定
- Remoting はクライアントの要求があれば StartTLS を使用して安全な接続 (HTTPS、Secure Servlet など) を使用します。安全な接続と安全でない接続の両方で同じソケットバインディング (ネットワークポート) が使用されるため、サーバー側に追加の設定をする必要はありません。クライアントはニーズに従って安全なトランスポートまたは安全でないトランスポートを要求します。EJB、ORB、JMS プロバイダーなどの Remoting を使用する JBoss Enterprise Application Platform のコンポーネントはデフォルトで安全なインターフェースを使用します。
警告
ワーカースレッドプールは、Remoting コネクターからの作業を処理できるスレッドのグループのことです。単一の要素 <worker-thread-pool>
で、複数の属性を取ります。ネットワークタイムアウトやスレッド不足が発生したり、メモリーの使用を制限する場合にこれらの属性を調節します。特定の推奨設定は状況によって異なるため、詳細は Red Hat グローバルサポートサービスまでご連絡ください。
表13.2 ワーカースレッドプールの属性
属性 | 説明 | CLI コマンド |
---|---|---|
read-threads |
リモーティングワーカーに対して作成する読み取りスレッドの数。デフォルトは
1 です。
| /profile=default/subsystem=remoting/:write-attribute(name=worker-read-threads,value=1)
|
write-threads |
リモーティングワーカーに対して作成する書き込みスレッドの数。デフォルトは
1 です。
| /profile=default/subsystem=remoting/:write-attribute(name=worker-write-threads,value=1)
|
task-keepalive |
コアでないリモーティングワーカーのタスクスレッドを生存させておく期間 (ミリ秒単位) です。デフォルトは
60 です。
| /profile=default/subsystem=remoting/:write-attribute(name=worker-task-keepalive,value=60)
|
task-max-threads |
リモーティングワーカーのタスクスレッドプールに対するスレッドの最大数です。デフォルトは
16 です。
| /profile=default/subsystem=remoting/:write-attribute(name=worker-task-max-threads,value=16)
|
task-core-threads |
リモーティングワーカーのタスクスレッドプールに対するコアスレッドの数です。デフォルトは
4 です。
| /profile=default/subsystem=remoting/:write-attribute(name=worker-task-core-threads,value=4)
|
task-limit |
挿入前に許可されるリモーティングワーカータスクの最大数です。デフォルトは
16384 です。
| /profile=default/subsystem=remoting/:write-attribute(name=worker-task-limit,value=16384)
|
コネクターは主な Remoting 設定要素です。複数のコネクターを設定できます。各コネクターは、サブ要素を持つ <connector>
要素より構成され、複数の属性が含まれることもあります。デフォルトのコネクターは JBoss Enterprise Application Platform の複数のサブシステムによって使用されます。カスタムコネクターの要素や属性の設定はアプリケーションによって異なるため、詳細は Red Hat グローバルサポートサービスまでご連絡ください。
表13.3 コネクターの属性
属性 | 説明 | CLI コマンド |
---|---|---|
名前 | JNDI によって使用されるコネクターの名前です。 | /profile=default/subsystem=remoting/connector=remoting-connector/:write-attribute(name=name,value=remoting-connector)
|
socket-binding | このコネクターに使用するソケットバインディングの名前です。 | /profile=default/subsystem=remoting/connector=remoting-connector/:write-attribute(name=socket-binding,value=remoting)
|
authentication-provider |
このコネクターと使用する JASPIC (Java Authentication Service Provider Interface) モジュールです。このモジュールはクラスパスに存在しなければなりません。
| /profile=default/subsystem=remoting/connector=remoting-connector/:write-attribute(name=authentication-provider,value=myProvider)
|
security-realm |
任意の設定です。アプリケーションのユーザーやパスワード、ロールが含まれるセキュリティーレルムになります。EJB または Web アプリケーションがセキュリティーレルムに対して認証を行います。
ApplicationRealm はデフォルトの JBoss Enterprise Application Platform インストールで使用可能です。
| /profile=default/subsystem=remoting/connector=remoting-connector/:write-attribute(name=security-realm,value=ApplicationRealm)
|
表13.4 コネクター要素
属性 | 説明 | CLI コマンド |
---|---|---|
sasl |
SASL (Simple Authentication and Security Layer) 認証メカニズムの囲み要素です。
| N/A
|
properties |
1 つ以上の
<property> 要素が含まれ、各要素には name 属性と任意の value 属性が含まれます。
| /profile=default/subsystem=remoting/connector=remoting-connector/sasl/property=myProp/:add(value=myPropValue)
|
3 つのタイプの送信接続を指定することができます。
- URI への送信接続。
- ローカルの送信接続 – ソケットなどのローカルリソースへ接続します。
- リモートの送信接続 – リモートリソースへ接続し、セキュリティーレルムを使用して認証を行います。
<outbound-connections>
要素で囲まれます。各接続タイプは outbound-socket-binding-ref
属性を取ります。送信接続は uri
属性を取ります。リモートの送信接続は任意の username
属性と security-realm
属性を取り、認証に使用します。
表13.5 送信接続要素
属性 | 説明 | CLI コマンド |
---|---|---|
outbound-connection | 汎用の送信接続。 | /profile=default/subsystem=remoting/outbound-connection=my-connection/:add(uri=http://my-connection)
|
local-outbound-connection | 暗黙の local:// URI スキームを持つ送信接続。 | /profile=default/subsystem=remoting/local-outbound-connection=my-connection/:add(outbound-socket-binding-ref=remoting2)
|
remote-outbound-connection |
セキュリティーレルムを用いた基本またはダイジェスト認証を使用する remote:// URI スキームの送信接続です。
| /profile=default/subsystem=remoting/remote-outbound-connection=my-connection/:add(outbound-socket-binding-ref=remoting,username=myUser,security-realm=ApplicationRealm)
|
SASL 子要素を定義する前に初期 SASL 要素を作成する必要があります。次のコマンドを使用します。
/profile=default/subsystem=remoting/connector=remoting-connector/security=sasl:add
属性 | 説明 | CLI コマンド |
---|---|---|
include-mechanisms |
SASL メカニズムのスペース区切りのリストである
value 属性が含まれています。
|
/profile=default/subsystem=remoting/connector=remoting-connector/security=sasl:write-attribute(name=include-mechanisms,value=["DIGEST","PLAIN","GSSAPI"]) |
qop |
SASL の保護品質値が希望順に並ぶスペース区切りのリストである
value 属性が含まれます。
|
/profile=default/subsystem=remoting/connector=remoting-connector/security=sasl:write-attribute(name=qop,value=["auth"]) |
strength |
SASL の暗号強度値が希望順に並ぶスペース区切りのリストである
value 属性が含まれます。
|
/subsystem=remoting/connector=remoting-connector/security=sasl:write-attribute(name=strength,value=["medium"]) |
reuse-session |
ブール変数値である
value 属性が含まれます。true の場合、セッションの再使用を試みます。
|
/profile=default/subsystem=remoting/connector=remoting-connector/security=sasl:write-attribute(name=reuse-session,value=false) |
server-auth |
ブール変数値である
value 属性が含まれます。true の場合、サーバーがクライアントへ認証します。
|
/profile=default/subsystem=remoting/connector=remoting-connector/security=sasl:write-attribute(name=server-auth,value=false) |
policy |
以下の要素がゼロ個以上含まれ、各要素が単一の
value を取る囲い要素です。
|
/profile=default/subsystem=remoting/connector=remoting-connector/security=sasl/sasl-policy=policy:add /profile=default/subsystem=remoting/connector=remoting-connector/security=sasl/sasl-policy=policy:write-attribute(name=forward-secrecy,value=true) /profile=default/subsystem=remoting/connector=remoting-connector/security=sasl/sasl-policy=policy:write-attribute(name=no-active,value=false) /profile=default/subsystem=remoting/connector=remoting-connector/security=sasl/sasl-policy=policy:write-attribute(name=no-dictionary,value=true) /profile=default/subsystem=remoting/connector=remoting-connector/security=sasl/sasl-policy=policy:write-attribute(name=no-plain-text,value=false) /profile=default/subsystem=remoting/connector=remoting-connector/security=sasl/sasl-policy=policy:write-attribute(name=pass-credentials,value=true) |
properties |
1 つ以上の
<property> 要素が含まれ、各要素には name 属性と任意の value 属性が含まれます。
|
/profile=default/subsystem=remoting/connector=remoting-connector/security=sasl/property=myprop:add(value=1) /profile=default/subsystem=remoting/connector=remoting-connector/security=sasl/property=myprop2:add(value=2) |
例13.14 設定例
<subsystem xmlns="urn:jboss:domain:remoting:1.1"> <connector name="remoting-connector" socket-binding="remoting" security-realm="ApplicationRealm"/> </subsystem>
<subsystem xmlns="urn:jboss:domain:remoting:1.1"> <worker-thread-pool read-threads="1" task-keepalive="60' task-max-threads="16" task-core-thread="4" task-limit="16384" write-threads="1" /> <connector name="remoting-connector" socket-binding="remoting" security-realm="ApplicationRealm"> <sasl> <include-mechanisms value="GSSAPI PLAIN DIGEST-MD5" /> <qop value="auth" /> <strength value="medium" /> <reuse-session value="false" /> <server-auth value="false" /> <policy> <forward-secrecy value="true" /> <no-active value="false" /> <no-anonymous value="false" /> <no-dictionary value="true" /> <no-plain-text value="false" /> <pass-credentials value="true" /> </policy> <properties> <property name="myprop1" value="1" /> <property name="myprop2" value="2" /> </properties> </sasl> <authentication-provider name="myprovider" /> <properties> <property name="myprop3" value="propValue" /> </properties> </connector> <outbound-connections> <outbound-connection name="my-outbound-connection" uri="htt\ p://myhost:7777/"/> <remote-outbound-connection name="my-remote-connection" outbound-socket-binding-ref="my-remote-socket" username="myUser" security-realm="ApplicationRealm"/> <local-outbound-connection name="myLocalConnection" outbound-socket-binding-ref="my-outbound-socket"/> </outbound-connections> </subsystem>
文書化されていない設定の側面
- JIDI および マルチキャスト自動検出
13.4.4.5. リモート EJB クライアントを用いたセキュリティーレルムの使用
- 新しいセキュリティーレルムをドメインコントローラーかスタンドアローンサーバーに追加します。
- 次のパラメーターをアプリケーションのクラスパスにある
jboss-ejb-client.properties
ファイルに追加します。この例では、ファイルの他のパラメーターは接続をdefault
として見なすことを前提とします。¶ remote.connection.default.username=appuser¶ remote.connection.default.password=apppassword¶
- 新しいセキュリティーレルムを使用するドメインまたはスタンドアローンサーバー上にカスタム Remoting コネクターを作成します。
- カスタム Remoting コネクターを用いてプロファイルを使用するよう設定されているサーバーグループに EJB をデプロイします。管理されたドメインを使用していない場合はスタンドアローンサーバーに EJB をデプロイします。
13.4.4.6. 新しいセキュリティレルムの追加
Management CLI を実行します。
jboss-cli.sh
またはjboss-cli.bat
コマンドを開始し、サーバーに接続します。新しいセキュリティーレルムを作成します。
次のコマンドを実行し、ドメインコントローラーまたはスタンドアローンサーバー上でMyDomain
という名前の新しいセキュリティーレルムを作成します。/host=master/core-service=management/security-realm=MyDomainRealm:add()
新しいロールの情報を保存するプロパティーファイルへの参照を作成します。
次のコマンドを実行し、新しいロールに関連するプロパティーが含まれるmyfile.properties
という名前のファイルのポインターを作成します。/host=master/core-service=management/security-realm=MyDomainRealm/authentication=properties:add(path=myfile.properties)
新しいセキュリティーレルムが作成されました。この新しいレルムにユーザーやロールを追加すると、デフォルトのセキュリティーレルムとは別のファイルに情報が保存されます。
13.4.4.7. セキュリティーレルムへユーザーを追加
add-user.sh
またはadd-user.bat
コマンドを実行します。コマンドラインインターフェース (CLI) を開きます。EAP_HOME/bin/
ディレクトリへ移動します。Red Hat Enterprise Linux や他の UNIX 系のオペレーティングシステムを稼働している場合はadd-user.sh
を実行します。Microsoft Windows Server を稼働している場合はadd-user.bat
を実行します。管理ユーザーやアプリケーションユーザーを追加するか選択します。
この手順ではb
を入力し、アプリケーションユーザーを追加します。ユーザーが追加されるレルムを選択します。
デフォルトでは、ApplicationRealm
のみが選択可能です。カスタムレルムが追加されている場合はその名前を入力します。入力を促されたらユーザー名、パスワード、ロールを入力します。
入力を促されたら希望のユーザー名、パスワード、任意のロールを入力します。yes
を入力して選択を確認するか、no
を入力して変更をキャンセルします。変更はセキュリティーレルムの各プロパティーファイルに書き込まれます。
13.4.4.8. SSL 上の EJB RMI
13.5. JAX-RS アプリケーションセキュリティー
13.5.1. RESTEasy JAX-RS Web アプリケーションのロールベースのセキュリティーを有効にする
RESTEasy は JAX-RS メソッドの @RolesAllowed、@PermitAll、@DenyAll アノテーションをサポートしますが、デフォルトではこれらのアノテーションを認識しません。次の手順に従って web.xml
ファイルを設定し、ロールベースセキュリティーを有効にします。
警告
手順13.2 タスク
- テキストエディターでアプリケーションの
web.xml
ファイルを開きます。 - 以下のコンテキストパラメーターをファイルの
web-app
タグ内に追加します。<context-param> <param-name>resteasy.role.based.security</param-name> <param-value>true</param-value> </context-param>
- <security-role> タグを使用して RESTEasy JAX-RS WAR ファイル内で使用されるすべてのロールを宣言します。
<security-role> <role-name>ROLE_NAME</role-name> </security-role> <security-role> <role-name>ROLE_NAME</role-name> </security-role>
- すべてのロールに対して JAX-RS ランタイムが対応する全 URL へのアクセスを承認します。
<security-constraint> <web-resource-collection> <web-resource-name>Resteasy</web-resource-name> <url-pattern>/PATH%lt;/url-pattern> </web-resource-collection> <auth-constraint> <role-name>ROLE_NAME</role-name> <role-name>ROLE_NAME</role-name> </auth-constraint> </security-constraint>
ロールベースセキュリティーが定義されたロールのセットによりアプリケーション内で有効になります。
例13.15 ロールベースセキュリティーの設定例
<web-app> <context-param> <param-name>resteasy.role.based.security</param-name> <param-value>true</param-value> </context-param> <servlet-mapping> <servlet-name>Resteasy</servlet-name> <url-pattern>/*</url-pattern> </servlet-mapping> <security-constraint> <web-resource-collection> <web-resource-name>Resteasy</web-resource-name> <url-pattern>/security</url-pattern> </web-resource-collection> <auth-constraint> <role-name>admin</role-name> <role-name>user</role-name> </auth-constraint> </security-constraint> <security-role> <role-name>admin</role-name> </security-role> <security-role> <role-name>user</role-name> </security-role> </web-app>
13.5.2. アノテーションを使用した JAX-RS Web サービスの保護
サポート対象のセキュリティーアノテーションを使用して JAX-RS Web サービスを保護する手順を取り上げます。
手順13.3 タスク
- ロールベースセキュリティーを有効にします。詳細は 「RESTEasy JAX-RS Web アプリケーションのロールベースのセキュリティーを有効にする」 を参照してください。
- JAX-RS Web サービスにセキュリティーアノテーションを追加します。RESTEasy は次のアノテーションをサポートします。
- @RolesAllowed
- メソッドにアクセスできるロールを定義します。ロールはすべて
web.xml
ファイルに定義する必要があります。 - @PermitAll
web.xml
ファイルに定義されている全ロールによるメソッドへのアクセスを許可します。- @DenyAll
- メソッドへのアクセスをすべて拒否します。
13.6. リモートパスワードプロトコルの保護
13.6.1. SRP (セキュアリモートパスワード) プロトコル
この文書は SRP (セキュアリモートパスワード) プロトコルとして知られる、強固なネットワーク暗号化方式について説明しています。このメカニズムは従来の再利用可能なパスワードで起きていたセキュリティの問題を排除しつつ、ユーザーによって提供されるパスワードを使いセキュアな接続をネゴシエーションするのに適しています。この仕組みは、認証プロセスでセキュアな鍵交換を行い、セッション時にセキュリティー層 (プライバシーや整合性保護) を有効にすることが可能です。信頼されたキーサーバーや証明書インフラストラクチャーは必要なく、また長期鍵の保存や管理にクライアントを必要としません。SRP には、既存のチャレンジレスポンス方式と比べセキュリティーやデプロイメントに両方において様々な利点があり、SRP は安全なパスワード認証が必要な場合に、互換性のある理想的な代用方式となります。
13.6.2. セキュアリモートパスワード (SRP) プロトコルの設定
SRPVerifierStore
インターフェースを実装する MBean を作成します。実装に関する詳細は SRPVerifierStore 実装 で確認できます。
手順13.4 既存パスワードストアの統合
ハッシュ化されたパスワード情報ストアを作成します。
パスワードが既に不可逆的にハッシュ化され、保存されている場合、この作業をユーザーごとに行う必要があります。noOP メソッドとしてsetUserVerifier(String, VerifierInfo)
を実装するか、ストアが読み取り専用であることを知らせる例外をスローするメソッドとしてsetUserVerifier(String, VerifierInfo)
を実装することができます。*SRPVerifierStore インターフェースを作成します。
作成したストアよりVerifierInfo
を取得できるカスタムのSRPVerifierStore
インターフェース実装を作成します。verifyUserChallenge(String, Object)
を使用すると、SafeWord や Radius のような既存のハードウェアトークンベースのスキームを SRP アルゴリズムへ統合することができます。このインターフェースメソッドは、クライアントの SRPLoginModule 設定で hasAuxChallenge オプションが指定されている場合のみ呼び出されます。JNDI MBean を作成します。
JNDI が使用できるSRPVerifierStore
インターフェースを公開し、必要な設定可能パラメーターを公開する MBean を作成します。デフォルトのorg.jboss.security.srp.SRPVerifierStoreService
でこれを実装することが可能です。また、SRPVerifierStore
の Java プロパティーファイル実装を使用して MBean を実装することもできます。
すべてのパスワードハッシュ情報がシリアライズされたオブジェクトのファイルとして使用できなければならないため、SRPVerifierStore
インターフェースのデフォルト実装は実稼動システムでは推奨されません。
SRPVerifierStore
実装は、特定のユーザー名に対して SRPVerifierStore.VerifierInfo
オブジェクトへのアクセスを提供します。SRP アルゴリズムが必要とするパラメーターを取得するため、getUserVerifier(String)
メソッドはユーザー SRP セッションの最初に SRPService によって呼び出されます。
VerifierInfo オブジェクトの要素
- user name
- 認証に使用されるユーザー名またはユーザー ID です。
- verifier
- アイデンティティーの証拠としてユーザーが入力するパスワードの一方向ハッシュです。
org.jboss.security.Util
クラスにはパスワードハッシュ化アルゴリズムを実行するcalculateVerifier
メソッドが含まれています。出力パスワードはH(salt | H(username | ':' | password))
の形式を取ります。H
は RFC2945 で定義されている SHA セキュアハッシュ関数になります。ユーザー名は UTF-8 エンコーディングを使用して文字列から byte[] へ変換されます。 - salt
- データベースの情報が漏えいされた場合に、ベリファイアーパスワードデータベース上での総当たり辞書攻撃を難しくするために使用される乱数です。ユーザーの既存のクリアテキストパスワードがハッシュ化された時に、暗号強度が高い乱数アルゴリズムより値が生成されなければなりません。
- g
- SRP アルゴリズムプリミティブジェネレーターです。ユーザーごとの設定ではなく、既知の固定パラメーターとなります。
org.jboss.security.srp.SRPConf
ユーティリティクラスはg
の設定を複数提供します。 これにはSRPConf.getDefaultParams().g()
により取得される適切なデフォルトなどが含まれます。 - N
- SRP アルゴリズムセーフプライムモジュールです。ユーザーごとの設定ではなく、既知の固定パラメーターとなります。 org.jboss.security.srp.SRPConf ユーティリティクラスは
org.jboss.security.srp.SRPConf
は N の設定を複数提供します。これにはSRPConf.getDefaultParams().N()
より取得される適切なデフォルトなどが含まれます。
例13.16 SRPVerifierStore インターフェース
package org.jboss.security.srp; import java.io.IOException; import java.io.Serializable; import java.security.KeyException; public interface SRPVerifierStore { public static class VerifierInfo implements Serializable { public String username; public byte[] salt; public byte[] g; public byte[] N; } public VerifierInfo getUserVerifier(String username) throws KeyException, IOException; public void setUserVerifier(String username, VerifierInfo info) throws IOException; public void verifyUserChallenge(String username, Object auxChallenge) throws SecurityException; }
13.7. 機密性の高い文字列のパスワードボールト
13.7.1. クリアテキストファイルでの機密性が高い文字列のセキュア化について
13.7.2. 機密性が高い文字列を格納する Java キーストアの作成
前提条件
keytool
コマンドを使用出来る必要があります。これは Java Runtime Environment (JRE) により提供されます。このファイルのパスを見つけます。Red Hat Enterprise Linux では、これは/usr/bin/keytool
にインストールされます。
手順13.5 タスク
キーストアと他の暗号化された情報を格納するディレクトリーを作成します。
キーストアと他の重要な情報を保持するディレクトリーを作成します。この残りの手順では、ディレクトリーが/home/USER/vault/
であることを前提とします。keytool
で使用するパラメーターを決定します。以下のパラメーターを決定します。- alias
- エイリアスは資格情報コンテナまたはキーストアに格納された他のデータの一意の ID です。この手順の最後にあるコマンド例のエイリアスは
vault
です。エイリアスは大文字と小文字を区別します。 - keyalg
- 暗号化に使用するアルゴリズム。デフォルト値は
DSA
です。この手順の例ではRSA
です。利用可能な他の選択肢については、JRE およびオペレーティングシステムのドキュメンテーションを参照してください。 - keysize
- 暗号化キーのサイズにより、ブルート フォース攻撃により復号化する困難さが影響を受けます。キーのデフォルトサイズは 1024 です。これは 512 〜 1024 の範囲にあり、64 の倍数である必要があります。この手順の例では
1024
を使用します。 - keystore
- 暗号化された情報と暗号化方法に関する情報を保持するデータベースのキーストア。キーストアを指定しない場合、使用するデフォルトのキーストアはホームディレクトリーの
.keystore
という名前のファイルです。これは、キーストアにデータを初めて追加したときに作成されます。この手順の例では、vault.keystore
キーストアを使用します。
keystore
コマンドには他の多くのオプションがあります。詳細については、JRE またはオペレーティングシステムのドキュメンテーションを参照してください。keystore
コマンドが尋ねる質問の回答を決定します。keystore
は、キーストアエントリに値を入力するために次の情報を必要とします。- キーストアパスワード
- キーストアを作成する場合は、パスワードを設定する必要があります。将来キーストアを使用するために、パスワードを提供する必要があります。覚えやすい強度の高いパスワードを作成します。キーストアは、パスワードや、キーストアが存在するファイルシステムおよびオペレーティングシステムのセキュリティーと同程度にセキュアです。
- キーパスワード (任意設定)
- キーストアパスワードに加え、保持する各キーにパスワードを指定することが可能です。このようなキーを使用するには、使用するたびにパスワードを提供する必要があります。通常、このファシリティーは使用されません。
- 名前 (名) と 名字 (姓)
- この情報と一覧の他の情報は、一意にキーを識別して他のキーの階層に置くのに役立ちます。名前である必要はありませんが、キーに一意な 2 つの言葉である必要があります。この手順の例では、
Enterprise Application Platform Vault
を使用します。これが証明書のコモンネームになります。 - 組織単位
- 証明書を使用する人物を特定する単一の言葉です。アプリケーションユニットやビジネスユニットである場合もあります。この手順の例では
enterprise_application_platform
を使用します。通常、1 つのグループやアプリケーションによって使用されるキーストアはすべて同じ組織単位を使用します。 - 組織
- 通常、所属する組織名を表す単一の言葉になります。一般的に、1 つの組織で使用されるすべての証明書で同じになります。この例では
acme
を使用します。 - 市または自治体
- お住まいの市名。
- 州または県
- お住まいの州や県、または同等の行政区画
- 国
- 2 文字の国コード
これらすべての情報によってキーストアや証明書の階層が作成され、一貫性のある一意な名前付け構造が確実に使用されるようにします。keytool
コマンドを実行し、収集した情報を提供します。例13.17
keystore
コマンドの入出力例$ keytool -genkey -alias vault -keyalg RSA -keysize 1024 -keystore /home/USER/vault/vault.keystore Enter keystore password: vault22 Re-enter new password:vault22 What is your first and last name? [Unknown]:
Enterprise Application Platform vault
What is the name of your organizational unit? [Unknown]:enterprise_application_platform
What is the name of your organization? [Unknown]:acme
What is the name of your City or Locality? [Unknown]:raleigh
What is the name of your State or Province? [Unknown]:nc
What is the two-letter country code for this unit? [Unknown]:us
Is CN=Enterprise Application Platform vault, OU=enterprise_application_platform, O=acme, L=raleigh, ST=nc, C=us correct? [no]:yes
Enter key password for <vault> (RETURN if same as keystore password):
/home/USER/vault/
ディレクトリに vault.keystore
という名前のファイルが作成されます。Enterprise Application Platform のパスワードなど、暗号化された文字列を格納するため使用される vault
という 1 つのキーがこのファイルに保存されます。
13.7.3. キーストアパスワードのマスキングとパスワードボールトの初期化
パスワードや他の機密情報が含まれる文字列をキーストアに保存したい場合、Enterprise Application Platform とアプリケーションにキーストアのパスワードが必要となります。この作業を行うことにより、パスワードを暗号化し、プレーンテキストファイルがより安全に含まれるようにします。
前提条件
EAP_HOME/bin/util/vault.sh
アプリケーションはコマンドラインインターフェースからアクセスできる必要があります。
vault.sh
コマンドを実行します。EAP_HOME/bin/utils/vault.sh
を実行します。0
を入力して新しい対話セッションを開始します。暗号化されたファイルが保存されるディレクトリを入力します。
このディレクトリはある程度保護されている必要がありますが、 Enterprise Application Platform がアクセスできなければなりません。「機密性が高い文字列を格納する Java キーストアの作成」 の手順に従うと、キーストアはホームディレクトリにあるvault/
というディレクトリの中にあります。この例では/home/USER/vault/
を使用します。注記
必ずディレクトリ名の最後にスラッシュが含まれるようにしてください。ご使用のオペレーティングシステムに応じて/
または\
を使用します。キーストアへのパスを入力します。
キーストアファイルへの完全パスを入力します。この例では/home/USER/vault/vault.keystore
を使用します。キーストアパスワードを暗号化します。
次の手順に従って、設定ファイルやアプリケーションで安全に使用できるようキーストアのパスワードを暗号化します。キーストアパスワードを入力します。
入力を促されたらキーストアのパスワードを入力します。salt 値を入力します。
8 文字の salt 値を入力します。salt 値は反復回数(下記) と共にハッシュ値の作成に使用されます。反復回数を入力します。
反復回数の値を入力します。マスクされたパスワード情報を書き留めておきます。
マスクされたパスワード と salt、反復回数は標準出力へ書き出されます。これらの情報を安全な場所に書き留めておきます。攻撃者がこれらの情報を使用してパスワードを復号化する可能性があるからです。ボールトのエイリアスを入力します。
入力を促されたら、ボールトのエイリアスを入力します。「機密性が高い文字列を格納する Java キーストアの作成」 に従ってボールトを作成した場合、エイリアスはvault
になります。
対話コンソールを終了します。
exit
を入力して対話コンソールを終了します。
設定ファイルとデプロイメントで使用するため、キーストアパスワードがマスキングされます。また、ボールトが完全設定され、すぐ使用できる状態になります。
13.7.4. パスワードボールトを使用するよう Enterprise Application Platform を設定する
設定ファイルにあるパスワードや機密性の高いその他の属性をマスキングする前に、これらを保存し復号化するパスワードボールトを Enterprise Application Platform が認識するようにする必要があります。現在、この作業を行うには Enterprise Application Platform を停止し、設定を直接編集する必要があります。
前提条件
- 設定を編集する前に Enterprise Application Platform を停止する必要があります。
手順13.6 タスク
テキストエディターで設定ファイルを開きます。
Enterprise Application Platform が停止した後、エディターで設定ファイルを開きます。デフォルトの設定ファイルへのパスは次の 1 つになります。- 管理ドメイン -
EAP_HOME/domain/configuration/domain.xml
- スタンドアローンサーバー -
EAP_HOME/standalone/configuration/standalone.xml
ボールト設定を挿入します。
extensions
section:</extensions>
の end-tag を探し、その下に次のコードを張り付けます。以下の値は 「機密性が高い文字列を格納する Java キーストアの作成」 と 「キーストアパスワードのマスキングとパスワードボールトの初期化」 の独自の値に置き換えます。<vault> <vault-option name="KEYSTORE_URL" value="/home/<replaceable>USER</replaceable>/vault/vault.keystore"/> <vault-option name="KEYSTORE_PASSWORD" value="MASK-3y28rCZlcKR"/> <vault-option name="KEYSTORE_ALIAS" value="vault"/> <vault-option name="SALT" value="12438567"/> <vault-option name="ITERATION_COUNT" value="50"/> <vault-option name="ENC_FILE_DIR" value="${user.home}/vault/"/> </vault>
Enterprise Application Platform を再起動します。
ファイルを保存してから終了し、Enterprise Application Platform を再起動します。
パスワードボールトを使用してマスキングされた文字列を復号化するよう Enterprise Application Platform が設定されます。ボールトに文字列を追加し、設定で使用する場合は 「Java キーストアに暗号化された機密性の高い文字列を保存し読み出しする」 を参照してください。
13.7.5. Java キーストアに暗号化された機密性の高い文字列を保存し読み出しする
パスワードや機密性の高いその他の文字列が平文の設定ファイルに含まれるのは安全ではありません。Enterprise Application Platform には、このような機密性の高い文字列をマスキングして暗号化されたキーストアに保存する機能や、設定ファイルでマスクされた値を使用する機能が含まれています。
前提条件
EAP_HOME/bin/util/vault.sh
アプリケーションはコマンドラインインターフェースよりアクセス可能である必要があります。
手順13.7 タスク
vault.sh
コマンドを実行します。EAP_HOME/bin/util/vault.sh
を実行します。0
を入力して新しい対話セッションを開始します。暗号化されたファイルが保存されるディレクトリを入力します。
「機密性が高い文字列を格納する Java キーストアの作成」 に従って作業を行った場合はキーストアはホームディレクトリのvault/
というディレクトリにあります。ほとんどの場合では、暗号化されたすべての情報をキーストアとして同じ場所に保存するのが普通です。この例では/home/USER/vault/
ディレクトリを使用します。注記
必ずディレクトリ名の最後にスラッシュが含まれるようにしてください。ご使用のオペレーティングシステムに応じて/
または\
を使用します。キーストアへのパスを入力します。
キーストアファイルへの完全パスを入力します。この例では/home/USER/vault/vault.keystore
を使用します。キーストアパスワード、ボールト名、ソルト、反復回数を入力します。
入力を促されたら、キーストアパスワード、ボールト名、ソルト、反復回数を入力します。ハンドシェイクが実行されます。パスワードを保存するオプションを選択します。
オプション0
を選択して、パスワードや機密性の高い他の文字列を保存します。値を入力します。
入力を促されたら、値を 2 回入力します。値が一致しない場合は再度入力するよう要求されます。ボールトブロックを入力します。
同じリソースに関連する属性のコンテナであるボールトブロックを入力します。属性名の例としてはds_ExampleDS
などが挙げられます。データソースまたは他のサービス定義で、暗号化された文字列への参照の一部を形成します。属性名を入力します。
保存する属性の名前を入力します。password
が属性名の例の 1 つになります。結果以下のようなメッセージが属性が保存されたことを示します。
Attribute Value for (ds_ExampleDS, password) saved
暗号化された文字列に関する情報を書き留めます。
メッセージはボールトブロック、属性名、共有キー、設定で文字列を使用する場合のアドバイスを示す標準出力を出力します。安全な場所にこの情報を書き留めておいてください。出力例は次の通りです。******************************************** Vault Block:ds_ExampleDS Attribute Name:password Shared Key:N2NhZDYzOTMtNWE0OS00ZGQ0LWE4MmEtMWNlMDMyNDdmNmI2TElORV9CUkVBS3ZhdWx0 Configuration should be done as follows: VAULT::ds_ExampleDS::password::N2NhZDYzOTMtNWE0OS00ZGQ0LWE4MmEtMWNlMDMyNDdmNmI2TElORV9CUkVBS3ZhdWx0 ********************************************
設定で暗号化された文字列を使用します。
プレーンテキストの文字列の代わりに前の設定手順の文字列を使用します。上記の暗号化されたパスワードを使用するデータソースが以下に示されています。... <subsystem xmlns="urn:jboss:domain:datasources:1.0"> <datasources> <datasource jndi-name="java:jboss/datasources/ExampleDS" enabled="true" use-java-context="true" pool-name="H2DS"> <connection-url>jdbc:h2:mem:test;DB_CLOSE_DELAY=-1</connection-url> <driver>h2</driver> <pool></pool> <security> <user-name>sa</user-name> <password>VAULT::ds_ExampleDS::password::N2NhZDYzOTMtNWE0OS00ZGQ0LWE4MmEtMWNlMDMyNDdmNmI2TElORV9CUkVBS3ZhdWx0</password> </security> </datasource> <drivers> <driver name="h2" module="com.h2database.h2"> <xa-datasource-class>org.h2.jdbcx.JdbcDataSource</xa-datasource-class> </driver> </drivers> </datasources> </subsystem> ...
ドメインまたはスタンドアローン設定ファイルのどこにでも暗号化された文字列を使用することができます。文字列をキーストアに保存した後、次の構文を使用してクリアテキストの文字列を暗号化された文字列に置き換えます。${VAULT::<replaceable>VAULT_BLOCK</replaceable>::<replaceable>ATTRIBUTE_NAME</replaceable>::<replaceable>ENCRYPTED_VALUE</replaceable>
実環境の値の例は次の通りです。ボールトブロックはds_ExampleDS
、属性はpassword
です。<password>${VAULT::ds_ExampleDS::password::N2NhZDYzOTMtNWE0OS00ZGQ0LWE4MmEtMWNlMDMyNDdmNmI2TElORV9CUkVBS3ZhdWx0}</password>
13.7.6. アプリケーションで機密性の高い文字列を保存し解決する
Enterprise Application Platform の設定要素は、セキュリティーボールトメカニズムを通じて Java キーストアに保存される値に対して暗号化された文字列を解決する機能をサポートしています。この機能に対するサポートを独自のアプリケーションに追加することができます。
この手順を実行する前に、ボールトファイルを格納するディレクトリが存在することを確認してください。JBoss Enterprise Application Platform を実行するユーザーがボールトファイルを読み書きできるパーミッションを持っていれば、ボールトファイルの場所はどこでも構いません。この例では、vault/
ディレクトリを /home/USER/vault/
ディレクトリに置きます。ボールト自体は vault/
ディレクトリの中にある vault.keystore
と呼ばれるファイルになります。
例13.18 ボールトへパスワードの文字列を追加する
EAP_HOME/bin/vault.sh
コマンドを用いて文字列をボールトへ追加します。次のセッションに完全セッションが含まれています。ユーザー入力の値は強調文字で表されています。出力の一部は書式設定のため削除されています。Microsoft Windows ではコマンド名は vault.bat
になります。Microsoft Windows のファイルパスでは、/
ではなく \
文字がディレクトリの分離記号として使用されることに注意してください。
[user@host bin]$ ./vault.sh ********************************** **** JBoss Vault ******** ********************************** Please enter a Digit:: 0: Start Interactive Session 1: Remove Interactive Session 2: Exit0
Starting an interactive session Enter directory to store encrypted files:/home/user/vault/
Enter Keystore URL:/home/user/vault/vault.keystore
Enter Keystore password:...
Enter Keystore password again:...
Values match Enter 8 character salt:12345678
Enter iteration count as a number (Eg: 44):25
Enter Keystore Alias:vault
Vault is initialized and ready for use Handshake with Vault complete Please enter a Digit:: 0: Store a password 1: Check whether password exists 2: Exit0
Task: Store a password Please enter attribute value:sa
Please enter attribute value again:sa
Values match Enter Vault Block:DS
Enter Attribute Name:thePass
Attribute Value for (DS, thePass) saved Please make note of the following: ******************************************** Vault Block:DS Attribute Name:thePass Shared Key:OWY5M2I5NzctYzdkOS00MmZhLWExZGYtNjczM2U5ZGUyOWIxTElORV9CUkVBS3ZhdWx0 Configuration should be done as follows: VAULT::DS::thePass::OWY5M2I5NzctYzdkOS00MmZhLWExZGYtNjczM2U5ZGUyOWIxTElORV9CUkVBS3ZhdWx0 ******************************************** Please enter a Digit:: 0: Store a password 1: Check whether password exists 2: Exit2
VAULT
で始まる行です。
例13.19 ボールトされたパスワードを使用するサーブレット
package vaulterror.web; import java.io.IOException; import java.io.Writer; import javax.annotation.Resource; import javax.annotation.sql.DataSourceDefinition; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.sql.DataSource; /*@DataSourceDefinition( name = "java:jboss/datasources/LoginDS", user = "sa", password = "sa", className = "org.h2.jdbcx.JdbcDataSource", url = "jdbc:h2:tcp://localhost/mem:test" )*/ @DataSourceDefinition( name = "java:jboss/datasources/LoginDS", user = "sa", password = "VAULT::DS::thePass::OWY5M2I5NzctYzdkOS00MmZhLWExZGYtNjczM2U5ZGUyOWIxTElORV9CUkVBS3ZhdWx0", className = "org.h2.jdbcx.JdbcDataSource", url = "jdbc:h2:tcp://localhost/mem:test" ) @WebServlet(name = "MyTestServlet", urlPatterns = { "/my/" }, loadOnStartup = 1) public class MyTestServlet extends HttpServlet { private static final long serialVersionUID = 1L; @Resource(lookup = "java:jboss/datasources/LoginDS") private DataSource ds; @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { Writer writer = resp.getWriter(); writer.write((ds != null) + ""); } }
13.8. JACC (Java Authorization Contract for Containers)
13.8.1. JACC (Java Authorization Contract for Containers) について
13.8.2. JACC (Java Authorization Contract for Containers) のセキュリティーの設定
jboss-web.xml
を編集する必要があります。
セキュリティードメインに JACC サポートを追加するには、required
フラグセットで JACC
承認ポリシーをセキュリティードメインの承認スタックへ追加します。以下は JACC サポートを持つセキュリティードメインの例になりますが、セキュリティードメインは 直接 XML には設定されず、管理コンソールか管理 CLI で設定されます。
<security-domain name="jacc" cache-type="default"> <authentication> <login-module code="UsersRoles" flag="required"> </login-module> </authentication> <authorization> <policy-module code="JACC" flag="required"/> </authorization> </security-domain>
jboss-web.xml
は デプロイメントの META-INF/
または WEB-INF/
ディレクトリに存在し、Web コンテナに対する追加の JBoss 固有の設定を格納し、上書きします。JACC が有効になっているセキュリティードメインを使用するには、<security-domain>
要素が含まれるようにし、 さらに <use-jboss-authorization>
要素を true
に設定する必要があります。以下は、上記の JACC セキュリティードメインを使用するよう適切に設定されているアプリケーションになります。
<jboss-web> <security-domain>jacc</security-domain> <use-jboss-authorization>true</use-jboss-authorization> </jboss-web>
セキュリティードメインと JACC を使用するよう EJB を設定する方法は Web アプリケーションの場合とは異なります。EJB の場合、ejb-jar.xml
記述子にてメソッドまたはメソッドのグループ上でメソッドパーミッションを宣言できます。<ejb-jar>
要素内では、すべての子 <method-permission>
要素に JACC ロールに関する情報が含まれます。詳細は設定例を参照してください。EJBMethodPermission
クラスは Java Enterprise Edition 6 API の一部で、http://docs.oracle.com/javaee/6/api/javax/security/jacc/EJBMethodPermission.html で説明されています。
例13.20 EJB の JACC メソッドパーミッション例
<ejb-jar> <method-permission> <description>The employee and temp-employee roles may access any method of the EmployeeService bean </description> <role-name>employee</role-name> <role-name>temp-employee</role-name> <method> <ejb-name>EmployeeService</ejb-name> <method-name>*</method-name> </method> </method-permission> </ejb-jar>
<security>
子要素の jboss-ejb3.xml
記述子に宣言されます。セキュリティードメインの他に、EJB が実行されるプリンシパルを変更するrun-as プリンシパル を指定することもできます。
例13.21 EJB におけるセキュリティードメイン宣言の例
<security> <ejb-name>*</ejb-name> <security-domain>myDomain</s:security-domain> <run-as-principal>myPrincipal</s:run-as-principal> </s:security>
13.9. JASPI (Java Authentication SPI for Containers)
13.9.1. JASPI (Java Authentication SPI for Containers) のセキュリティーについて
13.9.2. JASPI (Java Authentication SPI for Containers) のセキュリティーの設定
<authentication-jaspi>
要素をセキュリティードメインに追加します。設定は標準的な認証モジュールと似ていますが、ログインモジュール要素は <login-module-stack>
要素で囲まれています。設定の構成は次の通りです。
例13.22 authentication-jaspi
要素の構成
<authentication-jaspi> <login-module-stack name="..."> <login-module code="..." flag="..."> <module-option name="..." value="..."/> </login-module> </login-module-stack> <auth-module code="..." login-module-stack-ref="..."> <module-option name="..." value="..."/> </auth-module> </authentication-jaspi>
EAP_HOME/domain/configuration/domain.xml
または EAP_HOME/standalone/configuration/standalone.xml
へ直接設定を追加する前に Enterprise Application Platform を完全に停止する必要があります。
第14章 シングルサインオン (SSO)
14.1. Web アプリケーションのシングルサインオン (SSO) について
Single Sign On (SSO) allows authentication to one resource to implicitly authorize access to other resources.
クラスター化されていない SSO は、同じ仮想ホスト上でアプリケーションの承認情報を共有することを制限します。また、ホストの障害に対する耐性を持ちません。クラスター化された SSO データは複数の仮想ホストのアプリケーション間で共有することができ、フェイルオーバーに対する耐性を持ちます。さらに、クラスター化された SSO はロードバランサーからのリクエストを受信することができます。
リソースが保護されていない場合、ユーザーの認証は完全に無視されます。ユーザーが保護されたリソースにアクセスすると、ユーザーの認証が必要になります。
SSO の制限
- サードパーティー境界にまたがる伝搬がない
- JBoss Enterprise Application Platform のコンテナ内にデプロイされたアプリケーションの間でのみ SSO を使用できます。
- コンテナ管理の認証のみ使用可能
- アプリケーションの
web.xml
で<login-config>
などのコンテナ管理認証要素を使用しなければなりません。 - クッキーが必要
- ブラウザークッキーを介して維持される SSO や URL の再書き込みはサポートされていません。
- レルムとセキュリティードメインの制限
requireReauthentication
パラメーターがtrue
に設定されている場合を除き、同じ SSO バルブに設定されたすべての Web アプリケーションは、web.xml
の同じレルム設定と同じセキュリティードメインを共有しなければなりません。関与する Web アプリケーションの 1 つに対し、Host 要素内または Engine 要素周囲で Realm 要素をネストできますが、context.xml 要素内で Realm 要素はネストできません。jboss-web.xml
に設定された<security-domain>
はすべての Web アプリケーション全体で一貫していなければなりません。すべてのセキュリティー統合が同じ認証情報 (ユーザー名やパスワードなど) を許可しなければなりません。
14.2. Web アプリケーションのクラスター化されたシングルサインオン (SSO) について
jboss-web.xml
に設定されます。
- Apache Tomcat の ClusteredSingleSignOn
- Apache Tomcat の IDPWebBrowserSSOValve
- PicketLink によって提供される SAML ベースの SSO
- PicketLink によって提供される SPNEGO ベースの SSO
14.3. 適切な SSO 実装の選択
Microsoft Active Directory など、Kerberos ベースの認証承認システムがすでに組織で使用されている場合は、同じシステムを使用して JBoss Enterprise Application Platform 上で実行されているエンタープライズアプリケーションを透過的に認証することができます。
同じサーバーグループやインスタンス内で実行するアプリケーション間でセキュリティー情報を伝播する必要がある場合、クラスター化されていない SSO を使用することができます。この場合、アプリケーションの jboss-web.xml
記述子にバルブを設定することのみが必要となります。
複数の JBoss Enterprise Application Platform インスタンス全体のクラスター化された環境で実行されるアプリケーションの間でセキュリティー情報を伝播する必要がある場合、クラスター化された SSO バルブを使用することができます。このバルブはアプリケーションの jboss-web.xml
に設定されます。
複数のクラスター化されていない JBoss Enterprise Application Platform インスタンス間でセキュリティー情報を伝播する必要がある場合、中央のアイデンティティープロバイダー (IDP) がすべての認証ロジックを保持する SAML の Web ブラウザーベース SSO を使用する必要があります。各 Web アプリケーションが認証要求を中央の IDP へリダイレクトし、認証要求を処理します。認証に成功すると、ユーザーはリソースにアクセスすることができます。
複数の JBoss Enterprise Application Platform サーバー上の EJB アプリケーションや Web サービスの間でセキュリティー情報を伝播する必要がある場合、セキュリティートークンサーバー (STS) を設定して要求を処理する必要があります。
14.4. Web アプリケーションでの SSO (シングルサインオン) の使用
SSO の設定はバルブと呼ばれます。アプリケーションが SSO バルブを使用するよう設定するには、設定をアプリケーションの WEB-INF/jboss-web.xml
または META-INF/jboss-web.xml
に追加します。バルブは、サーバーグループやスタンドアローンサーバーのレベルに設定されるセキュリティードメインと関連しています。JBoss Enterprise Application Platform は ClusteredSingleSignOn
と SingleSignOn
バルブをサポートします。
前提条件
- 認証と承認を処理するセキュリティードメインが設定されている必要があります。
- SSO 情報を共有する各アプリケーションは、
jboss-web.xml
にある同じ <security-domain> とweb.xml
設定ファイルにある同じレルムを使用するよう設定されている必要があります。
クラスター化された SSO では個別のホスト間で認証を共有できますが、クラスター化されていない SSO では共有できません。どちらの SSO も同じように設定されますが、クラスター化された SSO には永続データのクラスタリングレプリケーションを制御する cacheConfig
や processExpiresInterval
、 maxEmptyLife
パラメーターが含まれています。
例14.1 クラスター化された SSO 設定の例
tomcat
と呼ばれるセキュリティードメインを使用します。
<jboss-web> <security-domain>tomcat</security-domain> <valve> <class-name>org.jboss.web.tomcat.service.sso.ClusteredSingleSignOn</class-name> <param> <param-name>maxEmptyLife</param-name> <param-value>900</param-value> </param> </valve> </jboss-web>
表14.1 SSO 設定のオプション
オプション | 説明 |
---|---|
cookieDomain |
SSO クッキーに使用するホストドメインです。デフォルトは
/ です。app1.xyz.com と app2.xyz.com によるクッキーの共有を許可するには、cookieDomain を xyz.com に設定します。
|
maxEmptyLife |
クラスター化された SSO のみ設定可能です。失効する前に、アクティブなセッションを持たない SSO バルブを 1 つのリクエストが使用できる最大秒数。唯一バルブにアクティブなセッションが付加されている場合、正の値を設定するとノードのシャットダウンが適切に処理されるようになります。maxEmptyLife を
0 に設定すると、ローカルセッションがコピーされると同時にバルブが終了しますが、クラスター化されたアプリケーションからのセッションのバックアップコピーは他のクラスターノードが使用できるようになります。バルブの管理セッションの生存期間を越えてバルブが生存できるようにすると、他のリクエストを実行する時間がユーザーに与えられます。このリクエストはセッションのバックアップコピーをアクティベートする他のノードへフェイルオーバーすることができます。デフォルトは 1800 秒 (30 分) です。
|
processExpiresInterval |
クラスター化された SSO のみ設定可能です。
MaxEmptyLife タイムアウトを失効した SSO インスタンスをバルブが発見し無効化する動作の間隔の最初秒数。デフォルトは 60 (1 分) です。
|
requiresReauthentication |
true の場合、各リクエストはキャッシュされた認証情報を使用してセキュリティーレルムへ再認証します。false の場合 (デフォルト)、バルブによる新しい要求の認証には有効な SSO クッキーのみが必要になります。
|
アプリケーションはメソッド javax.servlet.http.HttpSession.invalidate()
を呼び出し、プログラムを用いてセッションを無効化することができます。
14.5. Kerberos について
14.6. SPNEGO について
14.7. Microsoft Active Directory ディレクトリについて
- ユーザーやコンピューター、パスワードなどのリソースの情報を保存する LDAP (Lightweight Directory Access Protocol) 。
- ネットワーク上で安全な認証を提供する Kerberos.
- IP アドレスやコンピューターのホスト名、ネットワーク上のその他のデバイス間でマッピングを提供する DNS (Domain Name Service)。
14.8. Web アプリケーションに対して Kerberos または Microsoft Active Directory のデスクトップ SSO を設定する
Microsoft Active Directory など、組織における既存の Kerberos ベースの認証承認インフラストラクチャーを使用して Web アプリケーションや EJB アプリケーションを認証するため、Enterprise Application Platform 6 に内蔵される JBoss Negotiation の機能を使用することが可能です。Web アプリケーションを適切に設定すれば、デスクトップまたはネットワークへのログインに成功するだけでWeb アプリケーションに対して透過的な認証を行えるため、追加のログインプロンプトは必要ありません。
JBoss Enterprise Application Platform 6 と以前のバージョンには顕著な違いがいくつかあります。
- セキュリティードメインは、管理ドメインの各プロファイルまたは各スタンドアローンサーバーに対して中心的に設定されます。セキュリティードメインはデプロイメントの一部ではありません。デプロイメントが使用する必要のあるセキュリティードメインは、デプロイメントの
jboss-web.xml
またはjboss-ejb3.xml
ファイルに名前が指定されています。 - セキュリティープロパティーは、中央設定の一部分、キュリティードメインの一部として設定されます。デプロイメントの一部ではありません。
- デプロイメントの一部としてオーセンティケーターを上書きすることができなくなりましたが、NegotiationAuthenticator バルブを
jboss-web.xml
記述子に追加すると同じ結果を得ることができます。バルブでも<security-constraint>
および<login-config>
要素がweb.xml
に定義されている必要があります。これらはセキュアなリソースを決定するために使用されますが、選択された auth-method はjboss-web.xml
の NegotiationAuthenticator バルブによって上書きされます。 - セキュリティードメインの
CODE
属性は、完全修飾クラス名ではなく、単純名を使用するようになりました。次の表は、これらのクラスと JBoss Negotiation に使用されるクラスとのマッピングを表しています。
表14.2 ログインモジュールコードとクラス名
単純名 | クラス名 | 目的 |
---|---|---|
Kerberos | com.sun.security.auth.module.Krb5LoginModule | Kerberos ログインモジュール |
SPNEGO | org.jboss.security.negotiation.spnego.SPNEGOLoginModule | Web アプリケーションが Kerberos 認証サーバーへ認証できるようにするメカニズム。 |
AdvancedLdap | org.jboss.security.negotiation.AdvancedLdapLoginModule | Microsoft Active Directory 以外の LDAP サーバーと使用されます。 |
AdvancedAdLdap | org.jboss.security.negotiation.AdvancedADLoginModule | Microsoft Active Directory の LDAP サーバーを使用されます。 |
JBoss Negotiation Toolkit
は https://community.jboss.org/servlet/JiveServlet/download/16876-2-34629/jboss-negotiation-toolkit.war よりダウンロード可能なデバッグ用のツールです。アプリケーションを実稼動環境に導入する前に認証メカニズムをデバッグし、テストできるようにするため提供されている追加のツールです。サポート対象のツールではありませんが、SPENEGO を Web アプリケーションに対して設定することは難しいこともあるため、大変便利なツールと言えます。
手順14.1 タスク
サーバーのアイデンティティーを表すセキュリティードメインを 1 つ設定します。必要な場合はシステムプロパティーを設定します。
最初のセキュリティードメインは、コンテナ自体をディレクトリーサービスへ認証します。真のユーザーは関与しないため、あるタイプの静的ログインメカニズムを許可するログインモジュールを使用する必要があります。この例では静的プリンシパルを使用し、認証情報が含まれるキータブファイルを参照します。明確にするため、この例では XML コードが提供されていますが、管理コンソールまたは管理 CLI を使用してセキュリティードメインを設定するようにしてください。<security-domain name="host" cache-type="default"> <authentication> <login-module code="Kerberos" flag="required"> <module-option name="storeKey" value="true"/> <module-option name="useKeyTab" value="true"/> <module-option name="principal" value="host/testserver@MY_REALM"/> <module-option name="keyTab" value="/home/username/service.keytab"/> <module-option name="doNotPrompt" value="true"/> <module-option name="debug" value="false"/> </login-module> </authentication> </security-domain>
Web アプリケーションやアプリケーションをセキュアにするため、2 つ目のセキュリティードメインを設定します。必要な場合はシステムプロパティーを設定します。
2 つ目のセキュリティードメインは、個別のユーザーを Kerberos または SPNEGO 認証サーバーへ認証するために使用されます。ユーザーの認証に最低でも 1 つのログインモジュールが必要で、ユーザーに適用するロールを検索するために別のログインモジュールが必要となります。次の XML コードは SPNEGO セキュリティードメインの例を表しています。これには、ロールを個別のユーザーにマッピングする承認モジュールが含まれます。認証サーバー上でロールを検索するモジュールを使用することもできます。<security-domain name="SPNEGO" cache-type="default"> <authentication> <!-- Check the username and password --> <login-module code="SPNEGO" flag="requisite"> <module-option name="password-stacking" value="useFirstPass"/> <module-option name="serverSecurityDomain" value="host"/> </login-module> <!-- Search for roles --> <login-module code="UsersRolesLoginModule" flag="required"> <module-option name="password-stacking" value="useFirstPass" /> <module-option name="usersProperties" value="spnego-users.properties" /> <module-option name="rolesProperties" value="spnego-roles.properties" /> </login-module> </authentication> </security-domain>
web.xml
の security-constraint と login-config を指定します。web.xml
記述子にはセキュリティー制約とログイン設定に関する情報が含まれています。セキュリティー制約とログイン情報の値の例は次の通りです。<security-constraint> <display-name>Security Constraint on Conversation</display-name> <web-resource-collection> <web-resource-name>examplesWebApp</web-resource-name> <url-pattern>/*</url-pattern> </web-resource-collection> <auth-constraint> <role-name>RequiredRole</role-name> </auth-constraint> </security-constraint> <login-config> <auth-method>SPNEGO</auth-method> <realm-name>SPNEGO</realm-name> </login-config> <security-role> <description> role required to log in to the Application</description> <role-name>RequiredRole</role-name> </security-role>
jboss-web.xml
記述子にセキュリティードメインと他の設定を指定します。クライアント側のセキュリティードメイン (例の 2 番目のセキュリティードメイン) の名前をデプロイメントのjboss-web.xml
記述子に指定し、アプリケーションがこのセキュリティードメインを使用するよう指示します。オーセンティケーターを直接上書きすることができなくなりましたが、必要な場合は NegotiationAuthenticator をバルブとしてjboss-web.xml
記述子に追加することができます。<jacc-star-role-allow>
は任意で、複数のロール名を一致させるためアスタリスク (*) の使用を許可します。<jboss-web> <security-domain>java:/jaas/SPNEGO</security-domain> <valve> <class-name>org.jboss.security.negotiation.NegotiationAuthenticator</class-name> </valve> <jacc-star-role-allow>true</jacc-star-role-allow> </jboss-web>
アプリケーションの
MANIFEST.MF
に依存関係を追加し、Negotiation クラスを見つけます。Web アプリケーションが JBoss Negotiation クラスを見つけるには、クラスorg.jboss.security.negotiation
上の依存関係をデプロイメントのMETA-INF/MANIFEST.MF
マニフェストに追加する必要があります。適切にフォーマットされたエントリは次の通りです。Manifest-Version: 1.0 Build-Jdk: 1.6.0_24 Dependencies: org.jboss.security.negotiation
Web アプリケーションが Kerberos や Microsoft Active Directory、 SPNEGO 対応のディレクトリサービスに対して認証情報を許可し、認証します。既にディレクトリサービスにログインしているシステムよりユーザーがアプリケーションを実行し、必要なロールが既にユーザーに適用されている場合、Web アプリケーションは認証を要求しないため、SSO の機能が実現されます。
第15章 開発セキュリティーに関する参考資料
15.1. jboss-web.xml の設定に関する参考資料
jboss-web.xml
はデプロイメントの WEB-INF
または META-INF
ディレクトリ内にあるファイルです。このファイルには、JBoss Web コンテナが Servlet 3.0 仕様に追加する機能に関する設定情報が含まれています。Servlet 3.0 仕様は web.xml
の同じディレクトリに格納されます。
jboss-web.xml
ファイルのトップレベル要素は <jboss-web>
要素です。
使用可能な設定の多くは、アプリケーションの web.ml
に設定される要件をローカルリソースへマッピングします。web.xml
の設定に関する説明は http://docs.oracle.com/cd/E13222_01/wls/docs81/webapp/web_xml.html を参照してください。
web.xml
に jdbc/MyDataSource
が必要な場合、jboss-web.xml
はグローバルデータソース java:/DefaultDS
をマッピングして要件を満たすことがあります。WAR はグローバルデータソースを使用して jdbc/MyDataSource
に対する要求を満たします。
表15.1 一般的なトップレベル属性
属性 | 詳細 |
---|---|
env-entry | web.xml が必要とする env-entry へのマッピング。
|
ejb-ref | web.xml が必要とする ejb-ref へのマッピング。
|
ejb-local-ref | web.xml が必要とする ejb-local-ref へのマッピング。
|
service-ref | web.xml が必要とする service-ref へのマッピング。
|
resource-ref | web.xml が必要とする resource-ref へのマッピング。
|
resource-env-ref | web.xml が必要とするresource-env-ref へのマッピング。
|
message-destination-ref | web.xml が必要とする message-destination-ref へのマッピング。
|
persistence-context-ref | web.xml が必要とする persistence-context-ref へのマッピング。
|
persistence-unit-ref | web.xml が必要とする persistence-unit-ref へのマッピング。
|
post-construct | web.xml が必要とする post-context へのマッピング。
|
pre-destroy | web.xml が必要とする pre-destroy へのマッピング。
|
data-source | web.xml が必要とする data-source へのマッピング。
|
context-root | アプリケーションのルートコンテキスト。デフォルト値は .war サフィックスを除いたデプロイメントの名前です。 |
virtual-host | アプリケーションがリクエストを許可する HTTP 仮想ホストの名前。HTTP の Host ヘッダーの内容を参照します。 |
annotation | アプリケーションによって使用されるアノテーションを記述します。詳細は <annotation> を参照してください。 |
listener | アプリケーションによって使用されるリスナーを記述します。詳細は <listener> を参照してください。 |
session-config | この要素は web.xml の <session-config> 要素と同じ関数を入力します。互換性維持の目的でのみ含まれます。 |
valve | アプリケーションによって使用されるバルブを記述します。詳細は <valve> を参照してください。 |
overlay | アプリケーションに追加するオーバーレイの名前。 |
security-domain | アプリケーションによって使用されるセキュリティードメインの名前。セキュリティードメイン自体は Web ベースの管理コンソールか管理 CLI に設定されます。 |
security-role | この要素は web.xml の <security-role> 要素と同じ関数を入力します。互換性維持の目的でのみ含まれます。 |
use-jboss-authorization | この空の要素が存在する場合、JBoss Web 承認スタックが使用されます。存在しない場合は、Java Enterprise Edition 仕様に指定されている承認メカニズムのみが使用されます。この要素は JBoss Enterprise Application Platform 6 に初めて導入された要素です。 |
disable-audit | この空の要素が存在する場合、Web セキュリティー監査が無効になります。Web セキュリティー監査は Java EE 仕様の一部ではありません。この要素は JBoss Enterprise Application Platform 6 に初めて導入された要素です。 |
disable-cross-context | false の場合、アプリケーションは他のアプリケーションコンテキストを呼び出すことができます。デフォルトは true です。 |
アプリケーションによって使用されるアノテーションを記述します。下表は <annotation>
の子要素の一覧になります。
表15.2 アノテーション設定要素
属性 | 詳細 |
---|---|
class-name |
アノテーションのクラス名
|
servlet-security |
サーブレットのセキュリティーを表す
@ServletSecurity などの要素。
|
run-as |
run-as の情報を表す
@RunAs などの要素。
|
multi-part |
マルチパートの情報を表す
@MultiPart などの要素。
|
リスナーを記述します。下表は <listener>
の子要素の一覧になります。
表15.3 リスナー設定要素
属性 | 詳細 |
---|---|
class-name |
リスナーのクラス名
|
listener-type |
アプリケーションのコンテキストにどのようなリスナーを追加するかを示す
condition 要素の一覧です。以下を選択することが可能です。
|
module |
リスナークラスが含まれるモジュールの名前。
|
param |
パラメーター。
<param-name> と <param-value> の 2 つの子要素が含まれます。
|
アプリケーションのバルブを記述します。<listener> と同じ設定要素が含まれます。
15.2. EJB セキュリティーパラメーターについての参考資料
表15.4 EJB セキュリティーパラメーター要素
要素 | 詳細 |
---|---|
<security-identity>
|
EJB のセキュリティー ID に付随する子要素が含まれます。
|
<use-caller-identity />
|
EJB が呼び出し側と同じセキュリティ ID を使うよう指定します。
|
<run-as>
| <role-name> 要素が含まれます。
|
<run-as-principle>
|
これがある場合は、呼び出しに割り当てられたルールを指定します。ない場合は、呼び出しを
anonymous という名前のルールに割り当てます。
|
<role-name>
|
EJB を実行するロールを指定します。
|
<description>
| <role-name> で指定したロールを記述します。
|
例15.1 セキュリティー ID の例
<servlet>
の中でのみ利用可能です。
<ejb-jar> <enterprise-beans> <session> <ejb-name>ASessionBean</ejb-name> <security-identity> <use-caller-identity/> </security-identity> </session> <session> <ejb-name>RunAsBean</ejb-name> <security-identity> <run-as> <description>A private internal role</description> <role-name>InternalRole</role-name> </run-as> </security-identity> </session> <session> <ejb-name>RunAsBean</ejb-name> <security-identity> <run-as-principal>internal</run-as-principal> </security-identity> </session> </enterprise-beans> </ejb-jar>
第16章 補足参考資料
16.1. Java Archiveの種類
表16.1
アーカイブタイプ | 拡張 | 目的 | ディレクトリ構造の要件 |
---|---|---|---|
Java アーカイブ | .jar | Java クラスのライブラリが含まれています。 | META-INF/MANIFEST.MF ファイル (オプション)。このファイルで、どのクラスが main クラスであるかなどの情報を指定します。
|
Web アーカイブ | .war |
Java Server Pages (JSP) ファイル、サーブレット、XML ファイル、Java クラスやライブラリが含まれています。Web アーカイブのコンテンツは Web アプリケーションとして参照されます。
| WEB-INF/web.xml ファイル。Web アプリケーションの構造に関する情報が含まれています。他のファイルが WEB-INF/ に存在する場合もあります。
|
リソースアダプターアーカイブ | .rar |
JCA 仕様によりディレクトリ構造が指定されます。
|
Java Connector Architecture (JCA) リソースアダプターが含まれています。コネクターとも呼ばれます。
|
エンタープライズアーカイブ | .ear |
各種モジュールをアプリケーションサーバーに同時にデプロイできるように、Java Enterprise Edition (EE) が 1 つ以上のモジュールを1 つのアーカイブにパッケージする際に利用します。EAR アーカイブを構築するツールで最も一般的なものは Maven および Ant です。
| META-INF/ ディレクトリ。このディレクトリには 1 つ以上の XML デプロイメント記述子ファイルが含まれています。
|
以下のモジュールタイプのいずれか
| |||
サービスアーカイブ | .sar |
エンタープライズアーカイブに似ていますが、Enterprise Application Platform 固有のものです。
| jboss-service.xml あるいは jboss-beans.xml ファイルを含むMETA-INF/ ディレクトリ。
|
第17章 Compiler Output
Topic ID 8271, Revision 85634
- INFO: Assigned Writer: mstanley Common Names: Remote Access to EJBs, Security Content Warnings: Spelling Error Release: EAP 6.0 Topic Types: Task IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Configuration Concerns: Application Development Topic Lifecycle: Approved Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 4895, Revision 84033
- INFO: Assigned Writer: dmison Common Names: Internationalization and Localization Content Warnings: Spelling Error Release: EAP 6 Beta Technologies: JBoss Logging Tools Topic Types: Reference IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Application Development Topic Lifecycle: Assigned Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 4892, Revision 74701
- INFO: Assigned Writer: dmison Common Names: Internationalization and Localization Release: EAP 6 Beta Technologies: JBoss Logging Tools Topic Types: Concept IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Application Development Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 4890, Revision 84030
- INFO: Assigned Writer: dmison Common Names: Internationalization and Localization Content Warnings: Spelling Error Release: EAP 6 Beta Technologies: JBoss Logging, JBoss Logging Tools Topic Types: Overview IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Nav Priority: Nav High Priority Concerns: Application Development Topic Lifecycle: Written Topic Lifecycle: Edited Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 4413, Revision 83892
- INFO: Assigned Writer: twells Content Warnings: Spelling Error Release: EAP 6 Alpha, EAP 6 Beta Technologies: Hibernate Topic Types: Reference IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Configuration Concerns: Application Development Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 1089, Revision 83773
- INFO: Assigned Writer: twells Common Names: Java Persistence API (JPA) Content Warnings: Spelling Error Release: EAP 6 Alpha, EAP 6 Beta Technologies: Hibernate Topic Types: Concept Concerns: Getting Started Topic Lifecycle: IA Proposed Topic Lifecycle: Written Topic Lifecycle: Edited Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 4891, Revision 84031
- INFO: Assigned Writer: dmison Common Names: Internationalization and Localization Content Warnings: Spelling Error Release: EAP 6 Beta Technologies: JBoss Logging Tools Topic Types: Concept IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Application Development Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 8272, Revision 74436
- INFO: Assigned Writer: mstanley Common Names: Remote Access to EJBs, Security Release: EAP 6.0 Topic Types: Task IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Configuration Concerns: Application Development Topic Lifecycle: Approved Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 33, Revision 62608
- INFO: Assigned Writer: mstanley Common Names: Application Server Release: EAP 6 Alpha, EAP 6 Beta Topic Types: Concept Concerns: Getting Started Concerns: Administration Topic Lifecycle: Written Topic Lifecycle: Edited Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 4374, Revision 40178
- INFO: Assigned Writer: mstanley Common Names: Java Transaction API (JTA), Java Transaction Service (JTS), Transactions, Web Services Transactions (XTS) Release: EAP 6 Alpha, EAP 6 Beta Technologies: JBoss Transactions Topic Types: Task IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Configuration Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 4375, Revision 78225
- INFO: Assigned Writer: mstanley Common Names: Java Transaction API (JTA), Transactions Release: EAP 6 Alpha, EAP 6 Beta Technologies: JBoss Transactions Topic Types: Task Topic Lifecycle: IA Triage IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Application Development Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 37, Revision 62608
- INFO: Assigned Writer: mstanley Common Names: Application Server Release: EAP 6 Alpha, EAP 6 Beta Topic Types: Concept Topic Lifecycle: IA Proposed Concerns: Administration Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 4378, Revision 83888
- INFO: Assigned Writer: mstanley Common Names: Java Transaction API (JTA), Java Transaction Service (JTS), Transactions, Web Services Transactions (XTS) Content Warnings: Spelling Error Release: EAP 6 Alpha, EAP 6 Beta Technologies: JBoss Transactions Topic Types: Concept IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Application Development Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 4376, Revision 78225
- INFO: Assigned Writer: mstanley Common Names: Java Transaction API (JTA), Java Transaction Service (JTS), Transactions, Web Services Transactions (XTS) Release: EAP 6 Beta Technologies: JBoss Transactions Topic Types: Task Topic Lifecycle: IA Triage IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Application Development Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 4927, Revision 84049
- INFO: Assigned Writer: mstanley Common Names: Security Content Warnings: Spelling Error Release: EAP 6 Beta Topic Types: Task IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Web Development Concerns: Application Development Topic Lifecycle: Approved Topic Lifecycle: Written Topic Lifecycle: QE Fail
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 4377, Revision 40178
- INFO: Assigned Writer: mstanley Common Names: Java Transaction API (JTA), Transactions Release: EAP 6 Alpha, EAP 6 Beta Technologies: JBoss Transactions Topic Types: Overview IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Application Development Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 4921, Revision 47194
- INFO: Assigned Writer: twells Common Names: Web Services Release: EAP 6 Beta Technologies: JAX-RS, RESTEasy Topic Types: Task Topic Lifecycle: IA Proposed Concerns: Web Development Topic Lifecycle: Approved Topic Lifecycle: Assigned Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 4922, Revision 84048
- INFO: Assigned Writer: twells Content Warnings: Spelling Error Release: EAP 6 Beta Technologies: JAX-RS, RESTEasy Topic Types: Reference Topic Lifecycle: IA Proposed Concerns: Application Development Topic Lifecycle: Approved Topic Lifecycle: Assigned Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 4901, Revision 74348
- INFO: Assigned Writer: dmison Common Names: Internationalization and Localization Release: EAP 6 Beta Technologies: JBoss Logging Tools Topic Types: Task IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Application Development Topic Lifecycle: Assigned Topic Lifecycle: Written Topic Lifecycle: QE Fail
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 4900, Revision 84037
- INFO: Assigned Writer: dmison Common Names: Internationalization and Localization Content Warnings: Spelling Error Release: EAP 6.0 Technologies: JBoss Logging Tools Topic Types: Task IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Application Development Topic Lifecycle: Assigned Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 4354, Revision 83883
- INFO: Assigned Writer: dmison Common Names: Classloading Content Warnings: Spelling Error Release: EAP 6 Beta Technologies: JBoss Modules Topic Types: Overview IA Priority: IA High Priority Topic Lifecycle: IA Proposed Concerns: Application or Service Deployment Topic Lifecycle: Written Topic Lifecycle: Edited Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 4353, Revision 83882
- INFO: Assigned Writer: dmison Common Names: Application Server, Classloading Content Warnings: Spelling Error Release: EAP 6 Alpha, EAP 6 Beta Technologies: JBoss Modules Topic Types: Reference IA Priority: IA High Priority Topic Lifecycle: IA Proposed Concerns: Application Development Topic Lifecycle: Written Topic Lifecycle: Edited Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 4352, Revision 83881
- INFO: Assigned Writer: dmison Common Names: Application Server, Classloading Content Warnings: Spelling Error Release: EAP 6 Alpha, EAP 6 Beta Technologies: JBoss Modules Topic Types: Overview Concerns: Getting Started IA Priority: IA High Priority Topic Lifecycle: IA Proposed Concerns: Application Development Topic Lifecycle: Written Topic Lifecycle: Edited Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 4896, Revision 84034
- INFO: Assigned Writer: dmison Common Names: Internationalization and Localization Content Warnings: Spelling Error Release: EAP 6 Beta Technologies: JBoss Logging Tools Topic Types: Reference IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Application Development Topic Lifecycle: Written Topic Lifecycle: Edited Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 4899, Revision 84036
- INFO: Assigned Writer: dmison Common Names: Internationalization and Localization Content Warnings: Spelling Error Release: EAP 6 Beta Technologies: JBoss Logging Tools Topic Types: Task IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Application Development Topic Lifecycle: Written Topic Lifecycle: Edited Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 4898, Revision 84035
- INFO: Assigned Writer: dmison Common Names: Internationalization and Localization Content Warnings: Spelling Error Release: EAP 6 Beta Technologies: JBoss Logging Tools Topic Types: Task IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Application Development Topic Lifecycle: Written Topic Lifecycle: QE Fail
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 4362, Revision 83886
- INFO: Assigned Writer: twells Common Names: Java Persistence API (JPA) Content Warnings: Spelling Error Release: EAP 6 Alpha, EAP 6 Beta Technologies: Hibernate, Infinispan Topic Types: Task IA Priority: IA High Priority Topic Lifecycle: IA Proposed Concerns: Configuration Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 4360, Revision 83885
- INFO: Assigned Writer: dmison Common Names: Application Server, Classloading Content Warnings: Spelling Error Release: EAP 6 Alpha, EAP 6 Beta Technologies: JBoss Modules Topic Types: Concept IA Priority: IA High Priority Topic Lifecycle: IA Proposed Concerns: Application Development Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 5440, Revision 74810
- INFO: Assigned Writer: dmison Common Names: Developer Tools, EJB Release: EAP 6 Beta Technologies: JBoss Developer Studio, JBoss EJB3 Topic Types: Task IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Application Development Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 2811, Revision 83796
- INFO: Assigned Writer: twells Content Warnings: Spelling Error Release: EAP 6 Beta Technologies: RESTEasy Topic Types: Reference Concerns: Getting Started Topic Lifecycle: IA Proposed Concerns: Administration Topic Lifecycle: Approved Topic Lifecycle: Assigned Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 5435, Revision 84239
- INFO: Assigned Writer: twells Common Names: Web Services Content Warnings: Spelling Error Release: EAP 6 Beta Technologies: JAX-RS, RESTEasy Topic Types: Reference Topic Lifecycle: IA Proposed Concerns: Web Development Topic Lifecycle: Approved Topic Lifecycle: Assigned Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 4464, Revision 74567
- INFO: Assigned Writer: mstanley Common Names: CDI Release: EAP 6 Alpha, EAP 6 Beta Technologies: Weld Topic Types: Task Topic Lifecycle: IA Triage IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Application Development Topic Lifecycle: Written Topic Lifecycle: Edited Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 4465, Revision 40178
- INFO: Assigned Writer: mstanley Common Names: CDI Release: EAP 6 Alpha, EAP 6 Beta Technologies: Weld Topic Types: Task Uncatagorised: Developer Topic Lifecycle: IA Triage IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Application Development Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 4466, Revision 40178
- INFO: Assigned Writer: mstanley Common Names: CDI Release: EAP 6 Alpha, EAP 6 Beta Technologies: Weld Topic Types: Task Topic Lifecycle: IA Triage IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Application Development Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 4477, Revision 40178
- INFO: Assigned Writer: mstanley Common Names: CDI Release: EAP 6 Alpha, EAP 6 Beta Technologies: Weld Topic Types: Concept Topic Lifecycle: IA Triage IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Application Development Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 4478, Revision 40178
- INFO: Assigned Writer: mstanley Common Names: CDI Release: EAP 6 Alpha, EAP 6 Beta Technologies: Weld Topic Types: Concept Topic Lifecycle: IA Triage IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Application Development Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 4479, Revision 83909
- INFO: Assigned Writer: mstanley Common Names: CDI Content Warnings: Spelling Error Release: EAP 6 Alpha, EAP 6 Beta Technologies: Weld Topic Types: Concept Topic Lifecycle: IA Triage IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Application Development Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 4453, Revision 83903
- INFO: Assigned Writer: mstanley Common Names: CDI Content Warnings: Spelling Error Release: EAP 6 Alpha, EAP 6 Beta Technologies: Weld Topic Types: Task Topic Lifecycle: IA Triage IA Priority: IA Low Priority Concerns: Getting Started Topic Lifecycle: IA Proposed Concerns: Application Development Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 4930, Revision 84051
- INFO: Assigned Writer: mstanley Common Names: Security Content Warnings: Spelling Error Release: EAP 6.0 Topic Types: Task IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Configuration Concerns: Application Development Topic Lifecycle: Written Topic Lifecycle: QE Fail
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 5416, Revision 84235
- INFO: Assigned Writer: twells Common Names: Web Services Content Warnings: Spelling Error Release: EAP 6 Beta Technologies: JAX-RS, RESTEasy Topic Types: Task Topic Lifecycle: IA Proposed Concerns: Web Development Topic Lifecycle: Approved Topic Lifecycle: Assigned Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 2252, Revision 68167
- INFO: Assigned Writer: twells Common Names: Java Persistence API (JPA) Release: EAP 6 Alpha, EAP 6 Beta Technologies: Hibernate Topic Types: Concept Concerns: Getting Started Topic Lifecycle: IA Proposed Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 4452, Revision 40178
- INFO: Assigned Writer: mstanley Common Names: CDI Release: EAP 6 Alpha, EAP 6 Beta Technologies: Weld Topic Types: Task Uncatagorised: Developer Topic Lifecycle: IA Triage IA Priority: IA Low Priority Concerns: Getting Started Topic Lifecycle: IA Proposed Concerns: Application Development Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 4928, Revision 84050
- INFO: Assigned Writer: mstanley Common Names: Security Content Warnings: Spelling Error Release: EAP 6 Beta Topic Types: Reference IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Web Development Concerns: Application Development Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 2792, Revision 83793
- INFO: Assigned Writer: twells Content Warnings: Spelling Error Release: EAP 6 Beta Technologies: RESTEasy Topic Types: Task Topic Lifecycle: IA Proposed Concerns: Application Development Topic Lifecycle: Approved Topic Lifecycle: Assigned Topic Lifecycle: Written Topic Lifecycle: QE Fail
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 4454, Revision 155458
- INFO: Assigned Writer: mstanley Common Names: CDI Release: EAP 6.0.0 Beta, EAP 6.0.0 GA Technologies: Weld Topic Types: Task Topic Lifecycle: IA Triage IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Application Development Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 4934, Revision 74716
- INFO: Assigned Writer: mstanley Common Names: Application Server, Security Release: EAP 6.0 Topic Types: Task IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Administration Topic Lifecycle: Written Topic Lifecycle: QE Fail
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 4933, Revision 74715
- INFO: Assigned Writer: mstanley Common Names: Application Server, Security Release: EAP 6 Beta Topic Types: Task IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Administration Topic Lifecycle: Approved Topic Lifecycle: Written Topic Lifecycle: QE Fail
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 4451, Revision 40178
- INFO: Assigned Writer: mstanley Common Names: CDI Release: EAP 6 Alpha, EAP 6 Beta Technologies: Weld Topic Types: Task Topic Lifecycle: IA Triage IA Priority: IA Low Priority Concerns: Getting Started Topic Lifecycle: IA Proposed Concerns: Administration Concerns: Application Development Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 8765, Revision 85796
- INFO: Assigned Writer: sgilda Common Names: Developer Tools Content Warnings: Spelling Error Release: EAP 6 Beta Topic Types: Task Topic Lifecycle: IA Triage IA Priority: IA Low Priority Concerns: Getting Started Topic Lifecycle: IA Proposed Concerns: Application Development Topic Lifecycle: Assigned Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 4461, Revision 83905
- INFO: Assigned Writer: mstanley Common Names: CDI Content Warnings: Spelling Error Release: EAP 6 Alpha, EAP 6 Beta Technologies: Weld Topic Types: Task Topic Lifecycle: IA Triage IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Application Development Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 4460, Revision 74563
- INFO: Assigned Writer: mstanley Common Names: CDI Release: EAP 6 Alpha, EAP 6 Beta Technologies: Weld Topic Types: Task Topic Lifecycle: IA Triage IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Application Development Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 4937, Revision 84052
- INFO: Assigned Writer: mstanley Common Names: Application Server, EJB, Management Interfaces, Security, Single Sign On (SSO) Content Warnings: Spelling Error Release: EAP 6 Beta Topic Types: Task IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Administration Concerns: Web Development Concerns: Application Development Topic Lifecycle: Approved Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 4463, Revision 74566
- INFO: Assigned Writer: mstanley Common Names: CDI Release: EAP 6 Alpha, EAP 6 Beta Technologies: Weld Topic Types: Task Topic Lifecycle: IA Triage IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Application Development Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 2246, Revision 83787
- INFO: Assigned Writer: twells Common Names: Java Persistence API (JPA) Content Warnings: Spelling Error Release: EAP 6 Alpha, EAP 6 Beta Technologies: Hibernate Topic Types: Concept Concerns: Getting Started Topic Lifecycle: IA Proposed Topic Lifecycle: Written Topic Lifecycle: Edited Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 4462, Revision 83906
- INFO: Assigned Writer: mstanley Common Names: CDI Content Warnings: Spelling Error Release: EAP 6 Alpha, EAP 6 Beta Technologies: Weld Topic Types: Task Topic Lifecycle: IA Triage IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Application Development Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 4457, Revision 74561
- INFO: Assigned Writer: mstanley Common Names: CDI Release: EAP 6 Alpha, EAP 6 Beta Technologies: Weld Topic Types: Task Topic Lifecycle: IA Triage IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Application Development Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 5415, Revision 84234
- INFO: Assigned Writer: twells Common Names: Web Services Content Warnings: Spelling Error Release: EAP 6 Beta Technologies: JAX-RS, RESTEasy Topic Types: Task Topic Lifecycle: IA Proposed Concerns: Web Development Topic Lifecycle: Approved Topic Lifecycle: Assigned Topic Lifecycle: Written Topic Lifecycle: SME Reviewed Topic Lifecycle: QE Pass, QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 2243, Revision 83786
- INFO: Assigned Writer: twells Content Warnings: Spelling Error Release: EAP 6 Alpha, EAP 6 Beta Technologies: Hibernate Validator Topic Types: Concept Concerns: Getting Started Topic Lifecycle: IA Proposed Topic Lifecycle: Written Topic Lifecycle: QE Pass, QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 4458, Revision 65032
- INFO: Assigned Writer: mstanley Common Names: CDI Release: EAP 6 Alpha, EAP 6 Beta Technologies: Weld Topic Types: Task Topic Lifecycle: IA Triage IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Application Development Topic Lifecycle: Written Topic Lifecycle: Edited Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 4438, Revision 74551
- INFO: Assigned Writer: mstanley Common Names: CDI Release: EAP 6 Alpha, EAP 6 Beta Technologies: Weld Topic Types: Concept Topic Lifecycle: IA Triage IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Application Development Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 4439, Revision 74552
- INFO: Assigned Writer: mstanley Common Names: CDI Release: EAP 6 Alpha, EAP 6 Beta Technologies: Weld Topic Types: Concept Topic Lifecycle: IA Triage IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Application Development Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 4436, Revision 40178
- INFO: Assigned Writer: mstanley Common Names: CDI Release: EAP 6 Alpha, EAP 6 Beta Technologies: Weld Topic Types: Overview Topic Lifecycle: IA Triage IA Priority: IA Low Priority Concerns: Getting Started Topic Lifecycle: IA Proposed Concerns: Application Development Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 4437, Revision 74550
- INFO: Assigned Writer: mstanley Common Names: CDI Release: EAP 6 Alpha, EAP 6 Beta Technologies: Weld Topic Types: Concept Topic Lifecycle: IA Triage IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Application Development Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 5944, Revision 84429
- INFO: Assigned Writer: twells Common Names: Web Services Content Warnings: Spelling Error Release: EAP 6 Beta Technologies: JAX-RS, RESTEasy Topic Types: Task Topic Lifecycle: IA Proposed Concerns: Web Development Topic Lifecycle: Approved Topic Lifecycle: Assigned Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 5945, Revision 84430
- INFO: Assigned Writer: twells Common Names: Security, Web Services Content Warnings: Spelling Error Release: EAP 6 Beta Technologies: JAX-RS, RESTEasy Topic Types: Task Topic Lifecycle: IA Proposed Concerns: Web Development Topic Lifecycle: Approved Topic Lifecycle: Assigned Topic Lifecycle: Written Topic Lifecycle: QE Fail, QE Fail
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 4447, Revision 83902
- INFO: Assigned Writer: mstanley Common Names: CDI Content Warnings: Spelling Error Release: EAP 6 Alpha, EAP 6 Beta Technologies: Weld Topic Types: Reference Topic Lifecycle: IA Triage IA Priority: IA Low Priority Concerns: Getting Started Topic Lifecycle: IA Proposed Concerns: Application Development Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 4444, Revision 83900
- INFO: Assigned Writer: mstanley Common Names: CDI Content Warnings: Spelling Error Release: EAP 6 Alpha, EAP 6 Beta Technologies: Weld Topic Types: Concept Topic Lifecycle: IA Triage IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Application Development Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 4445, Revision 83901
- INFO: Assigned Writer: mstanley Common Names: CDI Content Warnings: Spelling Error Release: EAP 6 Alpha, EAP 6 Beta Technologies: Weld Topic Types: Reference Uncatagorised: Developer Topic Lifecycle: IA Triage IA Priority: IA Low Priority Concerns: Getting Started Topic Lifecycle: IA Proposed Concerns: Application Development Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 4442, Revision 83899
- INFO: Assigned Writer: mstanley Common Names: CDI Content Warnings: Spelling Error Release: EAP 6 Alpha, EAP 6 Beta Technologies: Weld Topic Types: Concept Topic Lifecycle: IA Triage IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Application Development Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 2772, Revision 83792
- INFO: Assigned Writer: mstanley Common Names: Application Server Content Warnings: Spelling Error Release: EAP 6 Alpha, EAP 6 Beta Topic Types: Reference Topic Lifecycle: IA Proposed Concerns: Configuration Concerns: Datasources Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 4443, Revision 40178
- INFO: Assigned Writer: mstanley Common Names: CDI Release: EAP 6 Alpha, EAP 6 Beta Technologies: Weld Topic Types: Concept Topic Lifecycle: IA Triage IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Application Development Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 4440, Revision 83898
- INFO: Assigned Writer: mstanley Common Names: CDI Content Warnings: Spelling Error Release: EAP 6 Alpha, EAP 6 Beta Technologies: Weld Topic Types: Overview Uncatagorised: Developer Topic Lifecycle: IA Triage IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Application Development Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 4441, Revision 40178
- INFO: Assigned Writer: mstanley Common Names: CDI Release: EAP 6 Alpha, EAP 6 Beta Technologies: Weld Topic Types: Concept Topic Lifecycle: IA Triage IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Application Development Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 5385, Revision 84225
- INFO: Assigned Writer: dmison Common Names: EJB Content Warnings: Spelling Error Release: EAP 6 Beta, EAP 6.0 Technologies: JBoss EJB3 Topic Types: Task IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Application Development Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 4416, Revision 72382
- INFO: Assigned Writer: twells Release: EAP 6 Alpha, EAP 6 Beta Technologies: Hibernate Validator Topic Types: Concept IA Priority: IA Low Priority Concerns: Getting Started Topic Lifecycle: IA Proposed Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 4431, Revision 83896
- INFO: Assigned Writer: twells Common Names: Java Persistence API (JPA) Content Warnings: Spelling Error Release: EAP 6 Alpha, EAP 6 Beta Technologies: Hibernate Topic Types: Reference IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Configuration Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 6614, Revision 84780
- INFO: Assigned Writer: twells Common Names: Web Services Content Warnings: Spelling Error Release: EAP 6 Beta Technologies: RESTEasy Topic Types: Reference IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Configuration Topic Lifecycle: Approved Topic Lifecycle: Assigned Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 4430, Revision 83895
- INFO: Assigned Writer: twells Common Names: Developer Tools, Java Persistence API (JPA) Content Warnings: Spelling Error Release: EAP 6 Alpha, EAP 6 Beta Technologies: Hibernate, JBoss Developer Studio Topic Types: Task IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Application Development Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 12555, Revision 335289
- INFO: Assigned Writer: mstanley Common Names: Distributed Caching, High Availability (HA) Clustering Technologies: Infinispan Topic Types: Task IA Priority: IA Low Priority Release: EAP 6.0.1 Topic Lifecycle: IA Proposed Concerns: Configuration Concerns: Web Development Topic Lifecycle: Approved Topic Lifecycle: Assigned Topic Lifecycle: Written
- INFO: Topic URL
- WARNING: This topic hasn't been pushed for translation.
Topic ID 12554, Revision 335295
- INFO: Assigned Writer: mstanley Common Names: Distributed Caching, High Availability (HA) Clustering Technologies: Infinispan Topic Types: Concept IA Priority: IA Low Priority Release: EAP 6.0.1 Topic Lifecycle: IA Proposed Concerns: Configuration Concerns: Web Development Topic Lifecycle: Approved Topic Lifecycle: Assigned Topic Lifecycle: Written
- INFO: Topic URL
- WARNING: This topic hasn't been pushed for translation.
Topic ID 6099, Revision 84488
- INFO: Assigned Writer: twells Common Names: Web Services Content Warnings: Spelling Error Release: EAP 6.0 Technologies: JAX-RS, RESTEasy Topic Types: Task Topic Lifecycle: IA Proposed Concerns: Web Development Topic Lifecycle: Approved Topic Lifecycle: Assigned Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 5023, Revision 71010
- INFO: Assigned Writer: twells Common Names: Java Persistence API (JPA) Release: EAP 6.0 Technologies: Hibernate Envers Topic Types: Task IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Application Development Topic Lifecycle: Approved Topic Lifecycle: Assigned Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 6097, Revision 84487
- INFO: Assigned Writer: twells Common Names: Web Services Content Warnings: Spelling Error Release: EAP 6.0 Technologies: JAX-RS, RESTEasy Topic Types: Task Topic Lifecycle: IA Proposed Concerns: Web Development Topic Lifecycle: Approved Topic Lifecycle: Assigned Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 6096, Revision 84486
- INFO: Assigned Writer: twells Common Names: Logging, Security, Web Services Content Warnings: Spelling Error Release: EAP 6.0 Technologies: JAX-RS, RESTEasy Topic Types: Concept Topic Lifecycle: IA Proposed Concerns: Configuration Concerns: Web Development Topic Lifecycle: Approved Topic Lifecycle: Assigned Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 1760, Revision 74474
- INFO: Assigned Writer: twells Release: EAP 6 Beta Technologies: RESTEasy Topic Types: Concept Concerns: Getting Started Topic Lifecycle: IA Proposed Concerns: Application Development Topic Lifecycle: Approved Topic Lifecycle: Assigned Topic Lifecycle: Written Topic Lifecycle: Edited Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 6103, Revision 72814
- INFO: Assigned Writer: twells Common Names: Web Services Release: EAP 6.0 Technologies: RESTEasy Topic Types: Concept Topic Lifecycle: IA Proposed Concerns: Web Development Topic Lifecycle: Approved Topic Lifecycle: Assigned Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 6102, Revision 72813
- INFO: Assigned Writer: twells Common Names: Web Services Release: EAP 6.0 Technologies: RESTEasy Topic Types: Concept Topic Lifecycle: IA Proposed Concerns: Web Development Topic Lifecycle: Approved Topic Lifecycle: Assigned Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 5017, Revision 84084
- INFO: Assigned Writer: twells Common Names: Java Persistence API (JPA) Content Warnings: Spelling Error Release: EAP 6.0 Technologies: Hibernate Envers Topic Types: Task IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Application Development Topic Lifecycle: Approved Topic Lifecycle: Assigned Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 4543, Revision 83929
- INFO: Assigned Writer: dmison Common Names: EJB Content Warnings: Spelling Error Release: EAP 6.0 Technologies: JBoss EJB3 Topic Types: Reference Topic Lifecycle: IA Triage IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Application Development Topic Lifecycle: Written Topic Lifecycle: QE Fail
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 5016, Revision 84083
- INFO: Assigned Writer: twells Common Names: Java Persistence API (JPA) Content Warnings: Spelling Error Release: EAP 6 Beta, EAP 6.0 Technologies: Hibernate Envers Topic Types: Task Topic Lifecycle: IA Proposed Concerns: Application Development Topic Lifecycle: Approved Topic Lifecycle: Assigned Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 5015, Revision 84082
- INFO: Assigned Writer: twells Common Names: Java Persistence API (JPA) Content Warnings: Spelling Error Release: EAP 6 Beta, EAP 6.0 Technologies: Hibernate Envers Topic Types: Reference IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Application Development Topic Lifecycle: Approved Topic Lifecycle: Assigned Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 4529, Revision 74597
- INFO: Assigned Writer: dmison Common Names: EJB, EJB 3 Lite, Java EE 6 Specifications Release: EAP 6 Alpha, EAP 6 Beta Technologies: JBoss EJB3 Topic Types: Concept Topic Lifecycle: IA Triage IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Application Development Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 5014, Revision 70924
- INFO: Assigned Writer: twells Common Names: Java Persistence API (JPA) Release: EAP 6.0 Technologies: Hibernate Envers Topic Types: Task IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Application Development Topic Lifecycle: Approved Topic Lifecycle: Assigned Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 4528, Revision 74596
- INFO: Assigned Writer: dmison Common Names: EJB Release: EAP 6 Alpha, EAP 6 Beta Technologies: JBoss EJB3 Topic Types: Concept Topic Lifecycle: IA Triage IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Application Development Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 4531, Revision 75049
- INFO: Assigned Writer: dmison Common Names: EJB, EJB 3 Lite, Java EE 6 Specifications, Migration from Previous Versions Release: EAP 6 Alpha, EAP 6 Beta Technologies: JBoss EJB3 Topic Types: Reference Topic Lifecycle: IA Triage IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Application Development Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 5011, Revision 68236
- INFO: Assigned Writer: twells Common Names: Java Persistence API (JPA) Release: EAP 6 Beta, EAP 6.0 Technologies: Hibernate Envers Topic Types: Concept IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Application Development Topic Lifecycle: Approved Topic Lifecycle: Assigned Topic Lifecycle: Written Topic Lifecycle: QE Fail
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 4533, Revision 83928
- INFO: Assigned Writer: dmison Common Names: EJB Content Warnings: Spelling Error Release: EAP 6 Alpha, EAP 6 Beta Technologies: JBoss EJB3 Topic Types: Reference Uncatagorised: Developer Topic Lifecycle: IA Triage IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Application Development Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 5010, Revision 84081
- INFO: Assigned Writer: twells Common Names: Java Persistence API (JPA) Content Warnings: Spelling Error Release: EAP 6 Beta, EAP 6.0 Technologies: Hibernate Envers Topic Types: Concept IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Application Development Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 1772, Revision 72307
- INFO: Assigned Writer: twells Common Names: Logging Release: EAP 6 Beta Technologies: RESTEasy Topic Types: Reference Topic Lifecycle: IA Proposed Concerns: Configuration Topic Lifecycle: Approved Topic Lifecycle: Assigned Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 4525, Revision 77210
- INFO: Assigned Writer: dmison Common Names: EJB Release: EAP 6 Alpha, EAP 6 Beta Technologies: JBoss EJB3 Topic Types: Overview Topic Lifecycle: IA Triage IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Application Development Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 4527, Revision 62608
- INFO: Assigned Writer: dmison Common Names: EJB Release: EAP 6 Alpha, EAP 6 Beta Technologies: JBoss EJB3 Topic Types: Concept Topic Lifecycle: IA Triage IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Application Development Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 8022, Revision 77078
- INFO: Assigned Writer: sgilda Common Names: Developer Tools Release: EAP 6 Beta Topic Types: Task Topic Lifecycle: IA Triage IA Priority: IA Low Priority Concerns: Getting Started Topic Lifecycle: IA Proposed Concerns: Application Development Topic Lifecycle: Assigned Topic Lifecycle: Written Topic Lifecycle: QE Fail
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 4516, Revision 83923
- INFO: Assigned Writer: dmison Common Names: EJB, Java Connector Architecture (JCA) Content Warnings: Spelling Error Release: EAP 6 Alpha, EAP 6 Beta Technologies: Iron Jacamar, JBoss EJB3 Topic Types: Concept IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Application Development Topic Lifecycle: Written Topic Lifecycle: Edited Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 6095, Revision 84485
- INFO: Assigned Writer: twells Common Names: Security, Web Services Content Warnings: Spelling Error Release: EAP 6.0 Technologies: JAX-RS, RESTEasy Topic Types: Task Concerns: Getting Started Topic Lifecycle: IA Proposed Concerns: Web Development Topic Lifecycle: Approved Topic Lifecycle: Assigned Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 8023, Revision 85607
- INFO: Assigned Writer: sgilda Common Names: Developer Tools Content Warnings: Spelling Error Release: EAP 6 Beta Topic Types: Task Topic Lifecycle: IA Triage IA Priority: IA Low Priority Concerns: Getting Started Topic Lifecycle: IA Proposed Concerns: Application Development Topic Lifecycle: Assigned Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 6092, Revision 84483
- INFO: Assigned Writer: twells Common Names: Web Services Content Warnings: Spelling Error Release: EAP 6.0 Technologies: JAX-RS, RESTEasy Topic Types: Reference Topic Lifecycle: IA Proposed Concerns: Web Development Topic Lifecycle: Approved Topic Lifecycle: Assigned Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 5053, Revision 71271
- INFO: Assigned Writer: mstanley Common Names: EJB, Security Release: EAP 6 Beta Topic Types: Reference Topic Lifecycle: IA Triage IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Application Development Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 7502, Revision 81137
- INFO: Assigned Writer: mstanley Common Names: Security, Single Sign On (SSO) Release: EAP 6.0 Topic Types: Overview IA Priority: IA Low Priority Concerns: Getting Started Topic Lifecycle: IA Proposed Concerns: Configuration Concerns: Application Development Topic Lifecycle: Approved Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 5052, Revision 71271
- INFO: Assigned Writer: mstanley Common Names: EJB, Security Release: EAP 6 Beta Technologies: JBoss EJB3 Topic Types: Task Topic Lifecycle: IA Triage IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Application Development Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 8421, Revision 85692
- INFO: Assigned Writer: mstanley Common Names: Web Services Content Warnings: Spelling Error Release: EAP 6.0 Technologies: JAX-WS Topic Types: Task Topic Lifecycle: IA Triage IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Web Development Concerns: Application Development Topic Lifecycle: Approved Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 8420, Revision 85691
- INFO: Assigned Writer: mstanley Common Names: Web Services Content Warnings: Spelling Error Release: EAP 6.0 Technologies: JAX-WS Topic Types: Concept Topic Lifecycle: IA Triage IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Web Development Concerns: Application Development Topic Lifecycle: Approved Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 8423, Revision 81511
- INFO: Assigned Writer: mstanley Common Names: Web Services Release: EAP 6.0 Technologies: JAX-WS Topic Types: Task Topic Lifecycle: IA Triage IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Web Development Concerns: Application Development Topic Lifecycle: Approved Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 8422, Revision 85693
- INFO: Assigned Writer: mstanley Common Names: Web Services Content Warnings: Spelling Error Release: EAP 6.0 Technologies: JAX-WS Topic Types: Task Topic Lifecycle: IA Triage IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Web Development Concerns: Application Development Topic Lifecycle: Approved Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 4496, Revision 83917
- INFO: Assigned Writer: dmison Common Names: Application Server, Logging Content Warnings: Spelling Error Release: EAP 6 Alpha, EAP 6 Beta Technologies: JBoss Logging Topic Types: Reference Uncatagorised: Developer IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Application Development Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 8896, Revision 92720
- INFO: Assigned Writer: sgilda Common Names: Developer Tools Release: EAP 6.0 Topic Types: Task Topic Lifecycle: IA Triage IA Priority: IA Low Priority Concerns: Getting Started Topic Lifecycle: IA Proposed Concerns: Configuration Concerns: Application Development Topic Lifecycle: Assigned Topic Lifecycle: Written
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 4501, Revision 83919
- INFO: Assigned Writer: dmison Common Names: Logging Content Warnings: Spelling Error Release: EAP 6 Alpha, EAP 6 Beta Technologies: JBoss Logging Topic Types: Task IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Application Development Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 8418, Revision 75356
- INFO: Assigned Writer: sgilda Common Names: Developer Tools Release: EAP 6 Beta Topic Types: Task Topic Lifecycle: IA Triage IA Priority: IA Low Priority Concerns: Getting Started Topic Lifecycle: IA Proposed Concerns: Application Development Topic Lifecycle: Assigned Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 4490, Revision 83913
- INFO: Assigned Writer: mstanley Common Names: Application Server, Java EE 6 Specifications Content Warnings: Spelling Error Release: EAP 6 Alpha, EAP 6 Beta Topic Types: Reference Topic Lifecycle: IA Triage IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Application Development Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 4488, Revision 62608
- INFO: Assigned Writer: mstanley Common Names: Application Server, Java EE 6 Specifications Release: EAP 6 Alpha, EAP 6 Beta Topic Types: Overview IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Application Development Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 4489, Revision 83912
- INFO: Assigned Writer: mstanley Common Names: Application Server, Java EE 6 Specifications Content Warnings: Spelling Error Release: EAP 6 Alpha, EAP 6 Beta Topic Types: Reference Topic Lifecycle: IA Triage IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Application Development Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 4495, Revision 79196
- INFO: Assigned Writer: dmison Common Names: Application Server, Logging Release: EAP 6 Alpha, EAP 6 Beta Technologies: JBoss Logging Topic Types: Reference IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Administration Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 5028, Revision 84086
- INFO: Assigned Writer: twells Common Names: Java Persistence API (JPA) Content Warnings: Spelling Error Release: EAP 6 Beta, EAP 6.0 Technologies: Hibernate Envers Topic Types: Concept IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Application Development Topic Lifecycle: Approved Topic Lifecycle: Assigned Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 4482, Revision 83910
- INFO: Assigned Writer: mstanley Common Names: CDI Content Warnings: Spelling Error Release: EAP 6 Alpha, EAP 6 Beta Technologies: Weld Topic Types: Reference Uncatagorised: Developer Topic Lifecycle: IA Triage IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Application Development Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 4480, Revision 74574
- INFO: Assigned Writer: mstanley Common Names: CDI Release: EAP 6 Alpha, EAP 6 Beta Technologies: Weld Topic Types: Concept Topic Lifecycle: IA Triage IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Application Development Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 4481, Revision 40178
- INFO: Assigned Writer: mstanley Common Names: CDI Release: EAP 6 Alpha, EAP 6 Beta Technologies: Weld Topic Types: Concept Topic Lifecycle: IA Triage IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Application Development Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 5025, Revision 84085
- INFO: Assigned Writer: twells Common Names: Java Persistence API (JPA) Content Warnings: Spelling Error Release: EAP 6.0 Technologies: Hibernate Envers Topic Types: Task IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Application Development Topic Lifecycle: Approved Topic Lifecycle: Assigned Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 1758, Revision 72302
- INFO: Assigned Writer: twells Common Names: Web Services Release: EAP 6 Beta Technologies: JAX-RS, RESTEasy Topic Types: Concept Topic Lifecycle: IA Proposed Concerns: Web Development Topic Lifecycle: Approved Topic Lifecycle: Assigned Topic Lifecycle: Written Topic Lifecycle: Edited Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 4484, Revision 83911
- INFO: Assigned Writer: mstanley Common Names: CDI Content Warnings: Spelling Error Release: EAP 6 Alpha, EAP 6 Beta Technologies: Weld Topic Types: Reference Topic Lifecycle: IA Triage IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Application Development Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 1759, Revision 83775
- INFO: Assigned Writer: twells Common Names: Web Services Content Warnings: Spelling Error Release: EAP 6 Beta Technologies: RESTEasy Topic Types: Concept Topic Lifecycle: IA Proposed Concerns: Application Development Topic Lifecycle: Approved Topic Lifecycle: Assigned Topic Lifecycle: Written Topic Lifecycle: Edited Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 5555, Revision 84275
- INFO: Assigned Writer: twells Common Names: Web Services Content Warnings: Spelling Error Release: EAP 6 Beta Technologies: JAX-RS, RESTEasy Topic Types: Reference Topic Lifecycle: IA Proposed Concerns: Web Development Topic Lifecycle: Approved Topic Lifecycle: Assigned Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 4606, Revision 83964
- INFO: Assigned Writer: dmison, sgilda Common Names: Application Server Content Warnings: Spelling Error Release: EAP 6 Alpha, EAP 6 Beta Topic Types: Task IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Application Development Topic Lifecycle: Written Topic Lifecycle: Edited Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 8872, Revision 86026
- INFO: Assigned Writer: dmison Common Names: Logging Release: EAP 6.0 Topic Types: Reference IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Topic Lifecycle: Assigned Topic Lifecycle: Written
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 4597, Revision 83959
- INFO: Assigned Writer: dmison Common Names: Application Server, Logging Content Warnings: Grammar Errors Release: EAP 6 Alpha, EAP 6 Beta Topic Types: Task IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Configuration Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 8869, Revision 86021
- INFO: Assigned Writer: dmison Common Names: Logging Release: EAP 6.0 Topic Types: Concept IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Topic Lifecycle: Assigned Topic Lifecycle: Written
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 8321, Revision 75355
- INFO: Assigned Writer: sgilda Common Names: Developer Tools Release: EAP 6 Beta Technologies: JBoss Developer Studio Topic Types: Task Topic Lifecycle: IA Triage IA Priority: IA Low Priority Concerns: Getting Started Topic Lifecycle: IA Proposed Concerns: Application Development Topic Lifecycle: Assigned Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 4584, Revision 83950
- INFO: Assigned Writer: mstanley Common Names: CDI Content Warnings: Spelling Error Release: EAP 6 Beta Technologies: Weld Topic Types: Concept Topic Lifecycle: IA Triage IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Application Development Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 4585, Revision 83951
- INFO: Assigned Writer: mstanley Common Names: CDI Content Warnings: Spelling Error Release: EAP 6 Beta Technologies: Weld Topic Types: Task Topic Lifecycle: IA Triage IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Application Development Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 4580, Revision 40178
- INFO: Assigned Writer: twells Common Names: Developer Tools Release: EAP 6 Alpha, EAP 6 Beta Technologies: JBoss Developer Studio Topic Types: Task Topic Lifecycle: IA Triage Concerns: Getting Started IA Priority: IA Medium Priority Concerns: Installation Topic Lifecycle: IA Proposed Concerns: Application Development Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 4581, Revision 83949
- INFO: Assigned Writer: twells Common Names: Developer Tools Content Warnings: Spelling Error Release: EAP 6 Alpha, EAP 6 Beta Technologies: JBoss Developer Studio Topic Types: Task Topic Lifecycle: IA Triage Concerns: Getting Started IA Priority: IA Medium Priority Concerns: Installation Topic Lifecycle: IA Proposed Concerns: Application Development Topic Lifecycle: Written Topic Lifecycle: QE Fail
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 4582, Revision 65038
- INFO: Assigned Writer: twells Common Names: Developer Tools Release: EAP 6 Alpha, EAP 6 Beta Technologies: JBoss Developer Studio Topic Types: Task Topic Lifecycle: IA Triage Concerns: Getting Started IA Priority: IA Medium Priority Concerns: Installation Topic Lifecycle: IA Proposed Concerns: Application Development Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 4583, Revision 57315
- INFO: Assigned Writer: twells Common Names: Developer Tools Release: EAP 6 Alpha, EAP 6 Beta Technologies: JBoss Developer Studio Topic Types: Task Concerns: Getting Started IA Priority: IA Medium Priority Concerns: Installation Topic Lifecycle: IA Proposed Concerns: Application Development Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 4576, Revision 40178
- INFO: Assigned Writer: dmison Common Names: Logging Release: EAP 6 Alpha, EAP 6 Beta Technologies: JBoss Logging Topic Types: Concept IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Application Development Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 4577, Revision 83947
- INFO: Assigned Writer: mstanley Audiences: Beginners, System Administrators Book: SOA Administration Guide Common Names: Application Server Concerns: Operating the Software Content Warnings: Spelling Error Project: JBoss Enterprise SOA Platform Release: EAP 6 Alpha, EAP 6 Beta, SOA 5.3 GA Technologies: Enterprise Service Bus Topic Types: Reference Topic Lifecycle: IA Triage IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Application or Service Deployment Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 4578, Revision 74616
- INFO: Assigned Writer: dmison Common Names: Logging Release: EAP 6 Alpha, EAP 6 Beta Technologies: JBoss Logging Topic Types: Reference Uncatagorised: Developer IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Application Development Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 4575, Revision 62608
- INFO: Assigned Writer: dmison Common Names: Logging Release: EAP 6 Alpha, EAP 6 Beta Technologies: JBoss Logging Topic Types: Concept IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Application Development Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 8843, Revision 85829
- INFO: Assigned Writer: mstanley Common Names: Web Services Content Warnings: Spelling Error Release: EAP 6.0 Technologies: JAX-WS Topic Types: Task Topic Lifecycle: IA Triage IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Topic Lifecycle: Approved Topic Lifecycle: Assigned Topic Lifecycle: Written
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 8841, Revision 85827
- INFO: Assigned Writer: mstanley Common Names: Web Services Content Warnings: Spelling Error Release: EAP 6.0 Technologies: JAX-WS Topic Types: Reference Topic Lifecycle: IA Triage IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Application Development Topic Lifecycle: Approved Topic Lifecycle: Assigned Topic Lifecycle: Written
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 5119, Revision 84096
- INFO: Assigned Writer: dmison Common Names: EJB Content Warnings: Spelling Error Release: EAP 6 Beta Technologies: JBoss EJB3 Topic Types: Reference IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Application Development Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 4566, Revision 83942
- INFO: Assigned Writer: dmison Common Names: Classloading Content Warnings: Spelling Error Release: EAP 6 Alpha, EAP 6 Beta Technologies: JBoss Modules Topic Types: Task IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Application Development Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 4565, Revision 83941
- INFO: Assigned Writer: dmison Common Names: Classloading Content Warnings: Spelling Error Release: EAP 6 Alpha, EAP 6 Beta Technologies: JBoss Modules Topic Types: Concept IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Application Development Topic Lifecycle: Written Topic Lifecycle: Edited Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 229, Revision 296792
- INFO: Assigned Writer: mstanley Common Names: Application Server Release: EAP 6.0.0 Beta, EAP 6.0.0 GA Topic Types: Reference Concerns: Getting Started Concerns: Installation Topic Lifecycle: IA Proposed Concerns: Configuration Concerns: Administration Concerns: Application Development Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 4563, Revision 83939
- INFO: Assigned Writer: mstanley Common Names: CDI Content Warnings: Spelling Error Release: EAP 6 Alpha, EAP 6 Beta Technologies: Weld Topic Types: Task Topic Lifecycle: IA Triage IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Application Development Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 4562, Revision 83938
- INFO: Assigned Writer: dmison Common Names: Application Server, Classloading Content Warnings: Spelling Error Release: EAP 6 Alpha, EAP 6 Beta Technologies: JBoss Modules Topic Types: Reference IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Application Development Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 4561, Revision 83937
- INFO: Assigned Writer: dmison Common Names: Application Server, Classloading Content Warnings: Grammar Errors Release: EAP 6 Alpha, EAP 6 Beta Technologies: JBoss Modules Topic Types: Reference IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Application Development Topic Lifecycle: Written Topic Lifecycle: Edited Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 7450, Revision 85305
- INFO: Assigned Writer: twells Common Names: Java Persistence API (JPA) Content Warnings: Spelling Error Release: EAP 6.0 Technologies: Hibernate Topic Types: Reference IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Configuration Concerns: Application Development Topic Lifecycle: Approved Topic Lifecycle: Assigned Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 7451, Revision 85306
- INFO: Assigned Writer: twells Common Names: Java Persistence API (JPA) Content Warnings: Spelling Error Release: EAP 6.0 Technologies: Hibernate Topic Types: Reference IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Configuration Concerns: Application Development Topic Lifecycle: Approved Topic Lifecycle: Assigned Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 7448, Revision 85303
- INFO: Assigned Writer: twells Common Names: Java Persistence API (JPA) Content Warnings: Spelling Error Release: EAP 6.0 Technologies: Hibernate Topic Types: Reference IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Configuration Concerns: Application Development Topic Lifecycle: Approved Topic Lifecycle: Assigned Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 7449, Revision 85304
- INFO: Assigned Writer: twells Common Names: Java Persistence API (JPA) Content Warnings: Spelling Error Release: EAP 6.0 Technologies: Hibernate Topic Types: Reference IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Configuration Concerns: Application Development Topic Lifecycle: Approved Topic Lifecycle: Assigned Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 7452, Revision 85307
- INFO: Assigned Writer: twells Common Names: Java Persistence API (JPA) Content Warnings: Spelling Error Release: EAP 6.0 Technologies: Hibernate Topic Types: Reference IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Configuration Concerns: Application Development Topic Lifecycle: Approved Topic Lifecycle: Assigned Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 4552, Revision 83933
- INFO: Assigned Writer: dmison Common Names: Application Server, Classloading Content Warnings: Spelling Error Release: EAP 6 Alpha, EAP 6 Beta Technologies: JBoss Modules Topic Types: Task IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Application Development Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 4550, Revision 83931
- INFO: Assigned Writer: dmison Common Names: Application Server, Classloading Content Warnings: Spelling Error Release: EAP 6 Alpha, EAP 6 Beta Topic Types: Reference IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Application Development Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 5089, Revision 84092
- INFO: Assigned Writer: dmison Common Names: EJB Content Warnings: Spelling Error Release: EAP 6 Beta Technologies: JBoss EJB3 Topic Types: Concept IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Application Development Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 4551, Revision 83932
- INFO: Assigned Writer: dmison Common Names: Application Server, Classloading Content Warnings: Spelling Error Release: EAP 6 Alpha, EAP 6 Beta Technologies: JBoss Modules Topic Types: Task IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Application Development Topic Lifecycle: Written Topic Lifecycle: Edited Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 4549, Revision 62608
- INFO: Assigned Writer: dmison Common Names: Classloading Release: EAP 6 Alpha, EAP 6 Beta Technologies: JBoss Modules Topic Types: Concept IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Application Development Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 7447, Revision 85302
- INFO: Assigned Writer: twells Common Names: Java Persistence API (JPA) Content Warnings: Spelling Error Release: EAP 6.0 Technologies: Hibernate Topic Types: Reference Topic Lifecycle: IA Proposed Concerns: Configuration Concerns: Application Development Topic Lifecycle: Approved Topic Lifecycle: Assigned Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 5094, Revision 84093
- INFO: Assigned Writer: dmison Common Names: Developer Tools, EJB Content Warnings: Spelling Error Release: EAP 6.0 Technologies: JBoss Developer Studio, JBoss EJB3 Topic Types: Task IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Application Development Topic Lifecycle: Written Topic Lifecycle: QE Fail
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 5707, Revision 76564
- INFO: Assigned Writer: mstanley, sgilda Common Names: Developer Tools Release: EAP 6 Beta Topic Types: Task IA Priority: IA Low Priority Concerns: Installation Topic Lifecycle: IA Proposed Topic Lifecycle: Assigned Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 7890, Revision 85552
- INFO: Assigned Writer: mstanley Common Names: Application Server, EJB, Remote Access to EJBs, Remoting Content Warnings: Spelling Error Release: EAP 6.0 Topic Types: Concept Topic Lifecycle: IA Triage IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Configuration Concerns: Application Development Topic Lifecycle: Approved Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 4614, Revision 83971
- INFO: Assigned Writer: dmison Common Names: Classloading Content Warnings: Spelling Error Release: EAP 6 Alpha, EAP 6 Beta Technologies: JBoss Modules Topic Types: Reference IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Application Development Concerns: Application or Service Deployment Topic Lifecycle: Assigned Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 5709, Revision 77339
- INFO: Assigned Writer: mstanley, sgilda Common Names: Developer Tools Release: EAP 6 Beta Topic Types: Task IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Application Development Topic Lifecycle: Written Topic Lifecycle: Edited Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 4611, Revision 83968
- INFO: Assigned Writer: dmison Common Names: Application Server, Classloading, Migration from Previous Versions Content Warnings: Spelling Error Release: EAP 6 Alpha, EAP 6 Beta Technologies: JBoss Modules Topic Types: Concept IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Application Development Concerns: Application or Service Deployment Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 4623, Revision 83976
- INFO: Assigned Writer: twells Common Names: Bean Validation Content Warnings: Spelling Error Release: EAP 6 Beta Technologies: Hibernate Validator Topic Types: Reference IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Configuration Topic Lifecycle: Assigned Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 2432, Revision 83790
- INFO: Assigned Writer: twells Content Warnings: Spelling Error Release: EAP 6 Alpha, EAP 6 Beta Technologies: Hibernate Validator Topic Types: Reference Uncatagorised: Developer Concerns: Getting Started Topic Lifecycle: IA Proposed Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 5720, Revision 152628
- INFO: Assigned Writer: sgilda Common Names: Migration from Enterprise Application Platform 5, Migration from Previous Versions Content Warnings: Spelling Error Release: EAP 6.0.0 Beta Topic Types: Task IA Priority: IA Low Priority Concerns: Getting Started Topic Lifecycle: IA Proposed Concerns: Application Development Topic Lifecycle: Approved Topic Lifecycle: Assigned Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 5721, Revision 72708
- INFO: Common Names: Developer Tools Release: EAP 6 Alpha, EAP 6 Beta Topic Types: Concept IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Application Development Topic Lifecycle: Written Topic Lifecycle: Edited Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 5722, Revision 76568
- INFO: Assigned Writer: mstanley, sgilda Common Names: Developer Tools Release: EAP 6 Alpha, EAP 6 Beta Topic Types: Task Topic Lifecycle: IA Triage IA Priority: IA Low Priority Concerns: Application Development Topic Lifecycle: Written Topic Lifecycle: Edited Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 5723, Revision 84357
- INFO: Assigned Writer: mstanley Common Names: Developer Tools Content Warnings: Spelling Error Release: EAP 6 Alpha Topic Types: Overview IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Application Development Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 5726, Revision 84359
- INFO: Assigned Writer: dmison Common Names: EJB Content Warnings: Spelling Error Release: EAP 6 Alpha, EAP 6 Beta, EAP 6.0 Technologies: JBoss EJB3 Topic Types: Reference IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Application Development Topic Lifecycle: Assigned Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 5238, Revision 84150
- INFO: Assigned Writer: dmison Common Names: EJB Content Warnings: Spelling Error Release: EAP 6 Beta, EAP 6.0 Technologies: JBoss EJB3 Topic Types: Concept IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Application Development Topic Lifecycle: Written Topic Lifecycle: Edited Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 7881, Revision 85548
- INFO: Assigned Writer: sgilda Common Names: CDI, Developer Tools Content Warnings: Spelling Error Release: EAP 6 Beta Topic Types: Task Topic Lifecycle: IA Triage IA Priority: IA Low Priority Concerns: Getting Started Topic Lifecycle: IA Proposed Concerns: Application Development Topic Lifecycle: Assigned Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 7882, Revision 85549
- INFO: Assigned Writer: mstanley Common Names: Application Server, EJB, Remote Access to EJBs, Remoting Content Warnings: Spelling Error Release: EAP 6.0 Topic Types: Concept IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Configuration Concerns: Administration Concerns: Application Development Topic Lifecycle: Approved Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 2448, Revision 47047
- INFO: Assigned Writer: twells Common Names: Bean Validation, Developer Tools Release: EAP 6 Alpha, EAP 6 Beta Technologies: Hibernate Validator, JBoss Developer Studio Topic Types: Task Topic Lifecycle: IA Proposed Concerns: Application Development Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 7883, Revision 86050
- INFO: Assigned Writer: mstanley Common Names: Application Server, EJB, Remote Access to EJBs, Remoting Content Warnings: Spelling Error Release: EAP 6.0 Topic Types: Concept IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Configuration Concerns: Administration Concerns: Application Development Topic Lifecycle: Approved Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 7884, Revision 85551
- INFO: Assigned Writer: mstanley Common Names: Application Server, EJB, Remote Access to EJBs, Remoting Content Warnings: Spelling Error Release: EAP 6.0 Topic Types: Task IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Configuration Concerns: Administration Concerns: Application Development Topic Lifecycle: Approved Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 5719, Revision 84355
- INFO: Assigned Writer: dmison Common Names: EJB Content Warnings: Spelling Error Release: EAP 6 Alpha Technologies: JBoss EJB3 Topic Types: Task IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Application Development Topic Lifecycle: Written Topic Lifecycle: QE Fail
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 5195, Revision 84137
- INFO: Assigned Writer: dmison Common Names: Internationalization and Localization Content Warnings: Spelling Error Release: EAP 6 Beta Technologies: JBoss Logging Tools Topic Types: Task IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Application Development Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 5191, Revision 84134
- INFO: Assigned Writer: dmison Common Names: Internationalization and Localization Content Warnings: Spelling Error Release: EAP 6 Beta Technologies: JBoss Logging Tools Topic Types: Task IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Application Development Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 4663, Revision 74647
- INFO: Assigned Writer: mstanley Common Names: EJB3 Clustering Release: EAP 6 Beta Technologies: JBoss EJB3 Topic Types: Concept IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Administration Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 2968, Revision 68427
- INFO: Assigned Writer: twells Common Names: Web Services Release: EAP 6.0 Technologies: JAX-RS, RESTEasy Topic Types: Task Topic Lifecycle: IA Proposed Concerns: Web Development Topic Lifecycle: Approved Topic Lifecycle: Assigned Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 5756, Revision 74883
- INFO: Assigned Writer: mstanley, sgilda Common Names: Developer Tools Release: EAP 6 Alpha, EAP 6 Beta Topic Types: Concept Topic Lifecycle: IA Triage IA Priority: IA Low Priority Concerns: Application Development Topic Lifecycle: Approved Topic Lifecycle: Assigned Topic Lifecycle: Written Topic Lifecycle: QE Pass, QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 3581, Revision 74499
- INFO: Assigned Writer: twells Common Names: Web Services Release: EAP 6 Alpha, EAP 6 Beta Topic Types: Task Concerns: Getting Started Topic Lifecycle: IA Proposed Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 5206, Revision 84139
- INFO: Assigned Writer: dmison Common Names: Internationalization and Localization Content Warnings: Spelling Error Release: EAP 6 Beta Technologies: JBoss Logging Tools Topic Types: Task IA Priority: IA Low Priority Concerns: Application Development Topic Lifecycle: Assigned Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 2965, Revision 83802
- INFO: Assigned Writer: twells Common Names: Web Services Content Warnings: Spelling Error Release: EAP 6.0 Technologies: JAX-RS, RESTEasy Topic Types: Task Topic Lifecycle: IA Proposed Concerns: Web Development Topic Lifecycle: Approved Topic Lifecycle: Assigned Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 7345, Revision 85248
- INFO: Assigned Writer: twells Common Names: Java Persistence API (JPA) Content Warnings: Spelling Error Release: EAP 6.0 Technologies: Hibernate Topic Types: Reference IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Application Development Topic Lifecycle: Approved Topic Lifecycle: Assigned Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 7825, Revision 86040
- INFO: Assigned Writer: mstanley Common Names: Security Concerns: Extending the Enterprise Application Platform Content Warnings: Spelling Error Release: EAP 6.0 Topic Types: Task IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Application Development Topic Lifecycle: Assigned Topic Lifecycle: Written Topic Lifecycle: QE Fail
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 7827, Revision 85514
- INFO: Assigned Writer: sgilda Common Names: Developer Tools Content Warnings: Spelling Error Release: EAP 6 Beta Topic Types: Task Topic Lifecycle: IA Triage IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Application Development Topic Lifecycle: Assigned Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 1841, Revision 76028
- INFO: Assigned Writer: mstanley, sgilda Common Names: Developer Tools Release: EAP 6 Alpha, EAP 6 Beta Topic Types: Concept Topic Lifecycle: IA Proposed Concerns: Application Development Topic Lifecycle: Approved Topic Lifecycle: Assigned Topic Lifecycle: Written Topic Lifecycle: Edited Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 9018, Revision 161035
- INFO: Assigned Writer: mstanley Common Names: Java Transaction API (JTA), Java Transaction Service (JTS), Logging, Transactions, Web Services Transactions (XTS) Release: EAP 6.0.0 GA Technologies: JBoss Transactions Topic Types: Concept Topic Lifecycle: IA Triage IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Administration Concerns: Troubleshooting Topic Lifecycle: Approved Topic Lifecycle: Assigned Topic Lifecycle: Written
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 9017, Revision 118914
- INFO: Assigned Writer: mstanley Common Names: Application Server Release: EAP 6.0 Topic Types: Task Topic Lifecycle: IA Triage IA Priority: IA Low Priority Concerns: Getting Started Topic Lifecycle: IA Proposed Concerns: Configuration Concerns: Administration Concerns: Application Development Topic Lifecycle: Approved Topic Lifecycle: Assigned Topic Lifecycle: Written
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 4687, Revision 83993
- INFO: Assigned Writer: mstanley Common Names: High Availability (HA) Clustering, Session Replication Content Warnings: Spelling Error Release: EAP 6 Beta Topic Types: Task IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Configuration Concerns: Application Development Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 4686, Revision 83992
- INFO: Assigned Writer: mstanley Common Names: High Availability (HA) Clustering, Session Replication Content Warnings: Spelling Error Release: EAP 6 Beta Topic Types: Concept IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Application Development Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 4689, Revision 83994
- INFO: Assigned Writer: mstanley Common Names: High Availability (HA) Clustering Content Warnings: Spelling Error Release: EAP 6 Beta Topic Types: Concept IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Application Development Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 5176, Revision 40178
- INFO: Assigned Writer: twells Common Names: Developer Tools Release: EAP 6 Beta Technologies: JBoss Developer Studio Topic Types: Task Concerns: Getting Started Topic Lifecycle: IA Proposed Concerns: Application Development Topic Lifecycle: Assigned Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 4690, Revision 83995
- INFO: Assigned Writer: mstanley Common Names: High Availability (HA) Clustering Content Warnings: Spelling Error Release: EAP 6 Beta Topic Types: Task IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Configuration Concerns: Application Development Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 5177, Revision 68190
- INFO: Assigned Writer: twells Common Names: Java Persistence API (JPA) Release: EAP 6 Beta Technologies: Hibernate Topic Types: Task Topic Lifecycle: IA Proposed Concerns: Application Development Topic Lifecycle: Assigned Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 4694, Revision 83996
- INFO: Assigned Writer: mstanley Common Names: High Availability (HA) Clustering, Single Sign On (SSO) Content Warnings: Spelling Error Release: EAP 6 Beta Topic Types: Concept IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Administration Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 4695, Revision 83997
- INFO: Assigned Writer: mstanley Common Names: High Availability (HA) Clustering, Single Sign On (SSO) Content Warnings: Spelling Error Release: EAP 6 Beta Topic Types: Task IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Configuration Concerns: Administration Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 4696, Revision 83998
- INFO: Assigned Writer: mstanley Common Names: High Availability (HA) Clustering, Single Sign On (SSO) Content Warnings: Spelling Error Release: EAP 6 Beta Topic Types: Concept IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Configuration Topic Lifecycle: Approved Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 6849, Revision 84948
- INFO: Assigned Writer: twells Common Names: Web Services Content Warnings: Spelling Error Release: EAP 6 Alpha, EAP 6 Beta, EAP 6.0 Technologies: JAX-RS, RESTEasy Topic Types: Concept IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Web Development Topic Lifecycle: Approved Topic Lifecycle: Assigned Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 5171, Revision 84124
- INFO: Assigned Writer: dmison Common Names: Internationalization and Localization Content Warnings: Spelling Error Release: EAP 6 Beta Technologies: JBoss Logging, JBoss Logging Tools Topic Types: Task IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Application Development Topic Lifecycle: Written Topic Lifecycle: Edited Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 4697, Revision 40178
- INFO: Assigned Writer: mstanley Common Names: High Availability (HA) Clustering, Single Sign On (SSO) Release: EAP 6 Beta Topic Types: Concept IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Administration Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 4698, Revision 40178
- INFO: Assigned Writer: mstanley Common Names: High Availability (HA) Clustering, Single Sign On (SSO) Release: EAP 6 Beta Topic Types: Task IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Configuration Concerns: Administration Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 7816, Revision 77549
- INFO: Assigned Writer: mstanley Common Names: Security, Single Sign On (SSO) Release: EAP 6.0 Topic Types: Concept IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Configuration Concerns: Application Development Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 5174, Revision 46174
- INFO: Assigned Writer: dmison Common Names: Internationalization and Localization Release: EAP 6 Beta Technologies: JBoss Logging, JBoss Logging Tools Topic Types: Task IA Priority: IA Low Priority Concerns: Application Development Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 7817, Revision 85508
- INFO: Assigned Writer: mstanley Common Names: Security, Single Sign On (SSO) Content Warnings: Spelling Error Release: EAP 6.0 Topic Types: Concept IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Configuration Concerns: Application Development Topic Lifecycle: Approved Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 5175, Revision 74753
- INFO: Assigned Writer: dmison Common Names: Internationalization and Localization Release: EAP 6 Beta Technologies: JBoss Logging, JBoss Logging Tools Topic Types: Task IA Priority: IA Low Priority Concerns: Application Development Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 7818, Revision 81320
- INFO: Assigned Writer: mstanley Common Names: Security, Single Sign On (SSO) Release: EAP 6.0 Topic Types: Concept IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Configuration Concerns: Application Development Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 5172, Revision 84125
- INFO: Assigned Writer: dmison Common Names: Internationalization and Localization Content Warnings: Spelling Error Release: EAP 6 Beta Technologies: JBoss Logging, JBoss Logging Tools Topic Types: Task IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Application Development Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 9001, Revision 137351
- INFO: Assigned Writer: mstanley Common Names: Application Server, Security Content Warnings: Spelling Error Release: EAP 6.0 Topic Types: Concept Topic Lifecycle: IA Triage IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Web Development Concerns: Application Development Topic Lifecycle: Approved Topic Lifecycle: Assigned Topic Lifecycle: Written
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 1822, Revision 83784
- INFO: Assigned Writer: twells Common Names: Web Services Content Warnings: Spelling Error Release: EAP 6 Beta Technologies: RESTEasy Topic Types: Reference Topic Lifecycle: IA Proposed Concerns: Web Development Topic Lifecycle: Approved Topic Lifecycle: Assigned Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 4713, Revision 55251
- INFO: Assigned Writer: mstanley Common Names: Management Interfaces, Security Release: EAP 6 Beta Technologies: Management CLI, Management Console Topic Types: Concept IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Administration Concerns: Datasources Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 5127, Revision 84100
- INFO: Assigned Writer: dmison Common Names: Internationalization and Localization Content Warnings: Spelling Error Release: EAP 6 Beta Technologies: JBoss Logging, JBoss Logging Tools Topic Types: Task IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Application Development Topic Lifecycle: Written Topic Lifecycle: Edited Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 4723, Revision 84006
- INFO: Assigned Writer: mstanley Common Names: Application Server, Security Content Warnings: Spelling Error Release: EAP 6 Beta Technologies: PicketBox XACML Topic Types: Concept IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Configuration Concerns: Administration Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 4721, Revision 70931
- INFO: Assigned Writer: mstanley Common Names: Application Server, Security Release: EAP 6 Beta Topic Types: Concept IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Configuration Concerns: Administration Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 5148, Revision 84109
- INFO: Assigned Writer: dmison Common Names: Internationalization and Localization Content Warnings: Spelling Error Release: EAP 6 Beta Technologies: JBoss Logging Tools Topic Types: Concept IA Priority: IA Low Priority Concerns: Application Development Topic Lifecycle: Assigned Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 4727, Revision 69988
- INFO: Assigned Writer: mstanley Common Names: Application Server, Security Release: EAP 6 Beta Technologies: PicketBox XACML Topic Types: Concept IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Configuration Concerns: Administration Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 5149, Revision 45446
- INFO: Assigned Writer: dmison Common Names: Internationalization and Localization Release: EAP 6 Beta Technologies: JBoss Logging Tools Topic Types: Concept IA Priority: IA Low Priority Concerns: Application Development Topic Lifecycle: Assigned Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 4725, Revision 74673
- INFO: Assigned Writer: mstanley Common Names: Application Server, Security Release: EAP 6 Beta Technologies: PicketBox XACML Topic Types: Concept IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Configuration Concerns: Administration Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 7306, Revision 85231
- INFO: Assigned Writer: sgilda Common Names: Developer Tools Content Warnings: Spelling Error Release: EAP 6 Beta Topic Types: Task Topic Lifecycle: IA Triage IA Priority: IA Low Priority Concerns: Getting Started Topic Lifecycle: IA Proposed Concerns: Application Development Topic Lifecycle: Assigned Topic Lifecycle: Written Topic Lifecycle: QE Fail
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 4729, Revision 84009
- INFO: Assigned Writer: mstanley Common Names: Application Server, Security Content Warnings: Spelling Error Release: EAP 6 Beta Technologies: PicketBox XACML Topic Types: Concept IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Configuration Concerns: Administration Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 7307, Revision 85232
- INFO: Assigned Writer: sgilda Common Names: Developer Tools Content Warnings: Spelling Error Release: EAP 6 Beta Topic Types: Task Topic Lifecycle: IA Triage IA Priority: IA Low Priority Concerns: Getting Started Topic Lifecycle: IA Proposed Concerns: Application Development Topic Lifecycle: Assigned Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 5825, Revision 84396
- INFO: Assigned Writer: dmison Common Names: Classloading Content Warnings: Spelling Error Release: EAP 6 Beta Technologies: JBoss Modules Topic Types: Task Topic Lifecycle: IA Triage IA Priority: IA Low Priority Concerns: Application Development Topic Lifecycle: Written Topic Lifecycle: QE Fail
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 4270, Revision 40178
- INFO: Assigned Writer: mstanley Common Names: Java Transaction API (JTA), Java Transaction Service (JTS), Transactions, Web Services Transactions (XTS) Release: EAP 6 Alpha, EAP 6 Beta Technologies: JBoss Transactions Topic Types: Concept Topic Lifecycle: IA Triage IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Application Development Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 4271, Revision 40178
- INFO: Assigned Writer: mstanley Common Names: Java Transaction API (JTA), Java Transaction Service (JTS), Transactions, Web Services Transactions (XTS) Release: EAP 6 Alpha, EAP 6 Beta Technologies: JBoss Transactions Topic Types: Concept Topic Lifecycle: IA Triage IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Application Development Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 4268, Revision 74512
- INFO: Assigned Writer: mstanley Common Names: Java Transaction API (JTA), Java Transaction Service (JTS), Transactions, Web Services Transactions (XTS) Release: EAP 6 Alpha, EAP 6 Beta Technologies: JBoss Transactions Topic Types: Concept Topic Lifecycle: IA Triage IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Datasources Concerns: Application Development Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 4269, Revision 74513
- INFO: Assigned Writer: mstanley Common Names: Java Transaction API (JTA), Java Transaction Service (JTS), Transactions, Web Services Transactions (XTS) Release: EAP 6 Alpha, EAP 6 Beta Technologies: JBoss Transactions Topic Types: Concept Topic Lifecycle: IA Triage IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Application Development Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 5358, Revision 74794
- INFO: Assigned Writer: mstanley Common Names: Security Release: EAP 6 Beta Technologies: PicketBox XACML Topic Types: Task Topic Lifecycle: IA Triage IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Configuration Concerns: Administration Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 5359, Revision 84205
- INFO: Assigned Writer: mstanley Common Names: Application Server, Security Content Warnings: Spelling Error Release: EAP 6 Beta Technologies: PicketBox XACML Topic Types: Task IA Priority: IA Low Priority Concerns: Getting Started Topic Lifecycle: IA Proposed Concerns: Configuration Concerns: Administration Concerns: Datasources Concerns: Application Development Concerns: Application or Service Deployment Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 5356, Revision 74792
- INFO: Assigned Writer: dmison Common Names: EJB Release: EAP 6 Beta Technologies: JBoss EJB3 Topic Types: Concept IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Application Development Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 5357, Revision 84204
- INFO: Assigned Writer: mstanley Common Names: Application Server, Security Content Warnings: Spelling Error Release: EAP 6 Beta Technologies: PicketBox XACML Topic Types: Task IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Administration Concerns: Application Development Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 5353, Revision 84203
- INFO: Assigned Writer: mstanley Common Names: Security Content Warnings: Spelling Error Release: EAP 6 Beta Technologies: PicketBox XACML Topic Types: Task IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Administration Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 4765, Revision 84015
- INFO: Assigned Writer: mstanley Common Names: Security Content Warnings: Spelling Error Release: EAP 6 Beta Topic Types: Task IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Application Development Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 4283, Revision 74520
- INFO: Assigned Writer: mstanley Common Names: Java Transaction API (JTA), Java Transaction Service (JTS), Transactions, Web Services Transactions (XTS) Release: EAP 6 Alpha, EAP 6 Beta Technologies: JBoss Transactions Topic Types: Concept Topic Lifecycle: IA Triage IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Application Development Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 4282, Revision 74519
- INFO: Assigned Writer: mstanley Common Names: Java Transaction API (JTA), Java Transaction Service (JTS), Transactions, Web Services Transactions (XTS) Release: EAP 6 Alpha, EAP 6 Beta Technologies: JBoss Transactions Topic Types: Concept Topic Lifecycle: IA Triage IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Application Development Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 4767, Revision 84016
- INFO: Assigned Writer: mstanley Common Names: Java EE 6 Specifications, Security Content Warnings: Spelling Error Release: EAP 6 Beta Topic Types: Concept IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Application Development Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 4281, Revision 74518
- INFO: Assigned Writer: mstanley Common Names: Java Transaction API (JTA), Java Transaction Service (JTS), Transactions, Web Services Transactions (XTS) Release: EAP 6 Alpha, EAP 6 Beta Technologies: JBoss Transactions Topic Types: Concept Topic Lifecycle: IA Triage IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Application Development Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 4766, Revision 59623
- INFO: Assigned Writer: mstanley Common Names: Java EE 6 Specifications, Security Release: EAP 6 Beta Topic Types: Concept IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Application Development Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 4287, Revision 72354
- INFO: Assigned Writer: mstanley Common Names: Java Transaction API (JTA), Java Transaction Service (JTS), Transactions, Web Services Transactions (XTS) Release: EAP 6 Alpha, EAP 6 Beta Technologies: JBoss Transactions Topic Types: Concept Topic Lifecycle: IA Triage IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Application Development Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 4286, Revision 71305
- INFO: Assigned Writer: mstanley Common Names: Java Transaction API (JTA), Java Transaction Service (JTS), Transactions, Web Services Transactions (XTS) Release: EAP 6 Alpha, EAP 6 Beta Technologies: JBoss Transactions Topic Types: Concept Topic Lifecycle: IA Triage IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Datasources Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 4285, Revision 74521
- INFO: Assigned Writer: mstanley Common Names: Java Transaction API (JTA), Java Transaction Service (JTS), Transactions, Web Services Transactions (XTS) Release: EAP 6 Alpha, EAP 6 Beta Technologies: JBoss Transactions Topic Types: Concept Topic Lifecycle: IA Triage IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Application Development Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 4275, Revision 74516
- INFO: Assigned Writer: mstanley Common Names: Java Transaction API (JTA), Java Transaction Service (JTS), Transactions, Web Services Transactions (XTS) Release: EAP 6 Alpha, EAP 6 Beta Technologies: JBoss Transactions Topic Types: Concept Topic Lifecycle: IA Triage IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Application Development Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 4274, Revision 40178
- INFO: Assigned Writer: mstanley Common Names: Java Transaction API (JTA), Java Transaction Service (JTS), Transactions, Web Services Transactions (XTS) Release: EAP 6 Alpha, EAP 6 Beta Technologies: JBoss Transactions Topic Types: Overview Topic Lifecycle: IA Triage IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Application Development Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 4273, Revision 83870
- INFO: Assigned Writer: mstanley Common Names: Java Transaction API (JTA), Java Transaction Service (JTS), Transactions, Web Services Transactions (XTS) Content Warnings: Spelling Error Release: EAP 6 Alpha, EAP 6 Beta Technologies: JBoss Transactions Topic Types: Concept Topic Lifecycle: IA Triage IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Application Development Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 4272, Revision 74514
- INFO: Assigned Writer: mstanley Common Names: Java Transaction API (JTA), Java Transaction Service (JTS), Transactions, Web Services Transactions (XTS) Release: EAP 6 Alpha, EAP 6 Beta Technologies: JBoss Transactions Topic Types: Concept Topic Lifecycle: IA Triage IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Application Development Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 4279, Revision 72349
- INFO: Assigned Writer: mstanley Common Names: Java Transaction API (JTA), Java Transaction Service (JTS), Transactions, Web Services Release: EAP 6 Alpha, EAP 6 Beta Technologies: JBoss Transactions Topic Types: Concept Topic Lifecycle: IA Triage IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Application Development Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 5369, Revision 84214
- INFO: Assigned Writer: mstanley Common Names: Application Server Content Warnings: Spelling Error Release: EAP 6 Beta Technologies: Management CLI, Management Console Topic Types: Reference IA Priority: IA Low Priority Concerns: Getting Started Topic Lifecycle: IA Proposed Topic Lifecycle: Assigned Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 4277, Revision 74517
- INFO: Assigned Writer: mstanley Common Names: Java Transaction API (JTA), Java Transaction Service (JTS), Transactions, Web Services Transactions (XTS) Release: EAP 6 Alpha, EAP 6 Beta Technologies: JBoss Transactions Topic Types: Concept Topic Lifecycle: IA Triage IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Application Development Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 5368, Revision 84213
- INFO: Assigned Writer: twells Common Names: Web Services Content Warnings: Spelling Error Release: EAP 6 Alpha, EAP 6 Beta, EAP 6.0 Technologies: JAX-RS, RESTEasy Topic Types: Reference Topic Lifecycle: IA Proposed Concerns: Web Development Concerns: Application Development Topic Lifecycle: Approved Topic Lifecycle: Assigned Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 4776, Revision 84020
- INFO: Assigned Writer: mstanley Common Names: Security Content Warnings: Spelling Error Release: EAP 6 Beta Topic Types: Concept IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Application Development Topic Lifecycle: Approved Topic Lifecycle: Assigned Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 4777, Revision 84021
- INFO: Assigned Writer: mstanley Common Names: Security Content Warnings: Spelling Error Release: EAP 6 Beta Topic Types: Task IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Application Development Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 4774, Revision 139258
- INFO: Assigned Writer: mstanley Common Names: Java Connector Architecture (JCA), Java Database Connectivity (JDBC), Java Messaging Service (JMS), Security Release: EAP 6 Beta Technologies: JAX-RS, JAX-WS, PicketBox XACML Topic Types: Concept IA Priority: IA Low Priority Concerns: Getting Started Topic Lifecycle: IA Proposed Concerns: Configuration Concerns: Administration Concerns: Application Development Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 4775, Revision 74687
- INFO: Assigned Writer: mstanley Common Names: Security Release: EAP 6 Beta Topic Types: Concept IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Application Development Topic Lifecycle: Approved Topic Lifecycle: Assigned Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 4770, Revision 84018
- INFO: Assigned Writer: mstanley Common Names: Security Content Warnings: Spelling Error Release: EAP 6 Beta Topic Types: Concept IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Application Development Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 6714, Revision 84845
- INFO: Assigned Writer: dmison Common Names: Internationalization and Localization Content Warnings: Spelling Error Release: EAP 6 Beta Technologies: JBoss Logging, JBoss Logging Tools Topic Types: Concept IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Application Development Topic Lifecycle: Assigned Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 4771, Revision 74686
- INFO: Assigned Writer: mstanley Common Names: Security Release: EAP 6 Beta Topic Types: Concept IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Application Development Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 6715, Revision 84846
- INFO: Assigned Writer: dmison Common Names: Internationalization and Localization, Logging Content Warnings: Spelling Error Release: EAP 6 Beta Technologies: JBoss Logging, JBoss Logging Tools Topic Types: Concept IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Application Development Topic Lifecycle: Approved Topic Lifecycle: Assigned Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 4768, Revision 84017
- INFO: Assigned Writer: mstanley Common Names: Java EE 6 Specifications, Security Content Warnings: Spelling Error Release: EAP 6 Beta Technologies: JBoss EJB3 Topic Types: Concept IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Application Development Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 4769, Revision 328644
- INFO: Assigned Writer: mstanley Common Names: Security Release: EAP 6.0.0 Beta Topic Types: Concept IA Priority: IA Low Priority Topic Lifecycle: IA Rejected Concerns: Application Development Topic Lifecycle: Written Topic Lifecycle: QE Fail
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 4797, Revision 84027
- INFO: Assigned Writer: mstanley Common Names: Security Content Warnings: Spelling Error Release: EAP 6 Beta Topic Types: Concept IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Application Development Topic Lifecycle: Approved Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 4795, Revision 84026
- INFO: Assigned Writer: mstanley Common Names: Security Content Warnings: Spelling Error Release: EAP 6 Beta Topic Types: Task IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Application Development Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 4794, Revision 71268
- INFO: Assigned Writer: mstanley Common Names: Security Release: EAP 6 Beta Topic Types: Task IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Application Development Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 9154, Revision 152955
- INFO: Assigned Writer: sgilda Common Names: Application Server, High Availability (HA) Clustering, Migration from Enterprise Application Platform 5, Migration from Previous Versions Content Warnings: Spelling Error Release: EAP 6.0.1 Topic Types: Task Topic Lifecycle: IA Triage IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Configuration Concerns: Administration Concerns: Application Development Topic Lifecycle: Assigned Topic Lifecycle: Written
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 4786, Revision 84024
- INFO: Assigned Writer: mstanley Common Names: Security Content Warnings: Spelling Error Release: EAP 6 Beta Technologies: JBoss EJB3 Topic Types: Concept IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Application Development Topic Lifecycle: Approved Topic Lifecycle: Assigned Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 2924, Revision 83798
- INFO: Assigned Writer: twells Content Warnings: Spelling Error Release: EAP 6.0 Technologies: RESTEasy Topic Types: Task Topic Lifecycle: IA Proposed Concerns: Application Development Topic Lifecycle: Approved Topic Lifecycle: Assigned Topic Lifecycle: Written Topic Lifecycle: QE Fail
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 2927, Revision 83799
- INFO: Assigned Writer: twells Common Names: Web Services Content Warnings: Spelling Error Release: EAP 6.0 Technologies: JAX-RS, RESTEasy Topic Types: Task Topic Lifecycle: IA Proposed Concerns: Web Development Topic Lifecycle: Approved Topic Lifecycle: Assigned Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 6723, Revision 84848
- INFO: Assigned Writer: dmison Common Names: Internationalization and Localization, Logging Content Warnings: Spelling Error Release: EAP 6 Beta Technologies: JBoss Logging Tools Topic Types: Reference IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Application Development Topic Lifecycle: Approved Topic Lifecycle: Assigned Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 2935, Revision 83800
- INFO: Assigned Writer: twells Content Warnings: Spelling Error Release: EAP 6.0 Technologies: RESTEasy Topic Types: Task Topic Lifecycle: IA Proposed Concerns: Application Development Topic Lifecycle: Approved Topic Lifecycle: Assigned Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 7687, Revision 74936
- INFO: Assigned Writer: mstanley Common Names: Security Release: EAP 6.0 Topic Types: Concept IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Application Development Topic Lifecycle: Approved Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 2939, Revision 83801
- INFO: Assigned Writer: twells Common Names: Web Services Content Warnings: Spelling Error Release: EAP 6.0 Technologies: JAX-RS, RESTEasy Topic Types: Task Topic Lifecycle: IA Proposed Concerns: Web Development Topic Lifecycle: Approved Topic Lifecycle: Assigned Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 2396, Revision 83789
- INFO: Assigned Writer: twells Content Warnings: Spelling Error Release: EAP 6 Alpha, EAP 6 Beta Technologies: Hibernate Validator Topic Types: Concept Concerns: Getting Started Topic Lifecycle: IA Proposed Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 3891, Revision 47526
- INFO: Assigned Writer: dmison Common Names: Application Server, Classloading Release: EAP 6 Alpha, EAP 6 Beta Technologies: JBoss Modules Topic Types: Reference Concerns: Getting Started IA Priority: IA High Priority Topic Lifecycle: IA Proposed Topic Lifecycle: Assigned Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 4300, Revision 74524
- INFO: Assigned Writer: mstanley Common Names: Java Transaction API (JTA), Transactions Release: EAP 6 Alpha, EAP 6 Beta Technologies: JBoss Transactions Topic Types: Concept Topic Lifecycle: IA Triage IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Application Development Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 4301, Revision 83875
- INFO: Assigned Writer: mstanley Common Names: Java Transaction API (JTA), Transactions Content Warnings: Spelling Error Release: EAP 6 Alpha, EAP 6 Beta Technologies: JBoss Transactions Topic Types: Concept Topic Lifecycle: IA Triage IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Application Development Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 4303, Revision 299121
- INFO: Assigned Writer: mstanley Common Names: Java Transaction API (JTA), Java Transaction Service (JTS), Transactions, Web Services Transactions (XTS) Release: EAP 6.0.0 Beta, EAP 6.0.0 GA Technologies: JBoss Transactions, Management Console Topic Types: Task Topic Lifecycle: IA Triage IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Configuration Concerns: Datasources Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 7199, Revision 139187
- INFO: Assigned Writer: mstanley Common Names: Application Server, Security Release: EAP 6.0 Technologies: Picketlink Topic Types: Concept IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Configuration Topic Lifecycle: Approved Topic Lifecycle: Assigned Topic Lifecycle: Written
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 4299, Revision 83874
- INFO: Assigned Writer: mstanley Common Names: Java Transaction API (JTA), Java Transaction Service (JTS), Transactions, Web Services Transactions (XTS) Content Warnings: Spelling Error Release: EAP 6 Alpha, EAP 6 Beta Technologies: JBoss Transactions Topic Types: Reference Topic Lifecycle: IA Triage IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Administration Concerns: Application Development Concerns: Troubleshooting Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 4295, Revision 299121
- INFO: Assigned Writer: mstanley Common Names: Java Transaction API (JTA), Transactions Content Warnings: Spelling Error Release: EAP 6.0.0 Beta, EAP 6.0.0 GA Technologies: JBoss Transactions Topic Types: Task Topic Lifecycle: IA Triage IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Configuration Concerns: Datasources Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 4288, Revision 40178
- INFO: Assigned Writer: mstanley Common Names: Application Server Release: EAP 6 Beta Topic Types: Concept Topic Lifecycle: IA Triage IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Configuration Concerns: Administration Concerns: Application Development Concerns: Performance Tuning Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 4316, Revision 72366
- INFO: Assigned Writer: mstanley Common Names: High Availability (HA) Clustering, Java Transaction API (JTA), Transactions Release: EAP 6 Alpha, EAP 6 Beta Technologies: JBoss Transactions Topic Types: Reference Topic Lifecycle: IA Triage IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Configuration Concerns: Application Development Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 4318, Revision 74532
- INFO: Assigned Writer: mstanley Common Names: Java Transaction Service (JTS), Transactions Release: EAP 6 Alpha, EAP 6 Beta Technologies: JBoss Transactions Topic Types: Concept Topic Lifecycle: IA Triage IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Application Development Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 4313, Revision 40178
- INFO: Assigned Writer: mstanley Common Names: Java Transaction API (JTA), Transactions Release: EAP 6 Alpha, EAP 6 Beta Technologies: JBoss Transactions Topic Types: Task Topic Lifecycle: IA Triage IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Application Development Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 4315, Revision 83880
- INFO: Assigned Writer: mstanley Common Names: Java Transaction API (JTA), Transactions Content Warnings: Spelling Error Release: EAP 6 Alpha, EAP 6 Beta Technologies: JBoss Transactions Topic Types: Reference Topic Lifecycle: IA Triage IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Application Development Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 4314, Revision 40178
- INFO: Assigned Writer: mstanley Common Names: Java Transaction API (JTA), Transactions Release: EAP 6 Alpha, EAP 6 Beta Technologies: JBoss Transactions Topic Types: Reference Topic Lifecycle: IA Triage IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Application Development Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 4308, Revision 72363
- INFO: Assigned Writer: mstanley Common Names: Java Transaction Service (JTS), Transactions, Web Services Transactions (XTS) Release: EAP 6 Alpha, EAP 6 Beta Technologies: JBoss Transactions Topic Types: Task Topic Lifecycle: IA Triage IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Application Development Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 4311, Revision 78199
- INFO: Assigned Writer: mstanley Common Names: Java Transaction API (JTA), Java Transaction Service (JTS), Logging, Transactions, Web Services Transactions (XTS) Release: EAP 6 Alpha, EAP 6 Beta Technologies: JBoss Transactions Topic Types: Task Topic Lifecycle: IA Triage IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Configuration Topic Lifecycle: Written
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 4310, Revision 85903
- INFO: Assigned Writer: mstanley Common Names: Java Transaction API (JTA), Transactions Content Warnings: Spelling Error Release: EAP 6 Alpha, EAP 6 Beta Technologies: JBoss Transactions Topic Types: Task Topic Lifecycle: IA Triage IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Configuration Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 4305, Revision 83877
- INFO: Assigned Writer: mstanley Common Names: Java Transaction API (JTA), Transactions Content Warnings: Spelling Error Release: EAP 6 Alpha, EAP 6 Beta Technologies: JBoss Transactions Topic Types: Task Topic Lifecycle: IA Triage IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Application Development Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 4304, Revision 83876
- INFO: Assigned Writer: mstanley Common Names: Java Transaction API (JTA), Transactions Content Warnings: Spelling Error Release: EAP 6 Alpha, EAP 6 Beta Technologies: JBoss Transactions Topic Types: Task Topic Lifecycle: IA Triage IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Application Development Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 4307, Revision 78225
- INFO: Assigned Writer: mstanley Common Names: Java Transaction API (JTA), Transactions Release: EAP 6 Beta Technologies: JBoss Transactions Topic Types: Task Topic Lifecycle: IA Triage IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Application Development Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Topic ID 4306, Revision 83878
- INFO: Assigned Writer: mstanley Common Names: Java Transaction API (JTA), Transactions Content Warnings: Spelling Error Release: EAP 6 Alpha, EAP 6 Beta Technologies: JBoss Transactions Topic Types: Task Topic Lifecycle: IA Triage IA Priority: IA Low Priority Topic Lifecycle: IA Proposed Concerns: Application Development Topic Lifecycle: Written Topic Lifecycle: QE Pass
- INFO: Topic URL
- WARNING: This topic's translated content is older than the specfied topic's content.
Compiler Glossary
- "This topic contains an invalid element that can't be converted into a DOM Element."
- The topic XML contains invalid elements that cannot be successfully converted in DOM elements.
- To fix this error please remove or correct any invalid XML elements or entities. Note: HTML Entities aren't classified as valid XML Entities.
- "This topic contains strings that are marked as "fuzzy"."
- The topic hasn't finished being translated by the Translator(s) yet, as such the topic will be displayed using translated content that may not be 100% correct.
- To fix this warning, please contact the Translator(s) responsible for translating the topics in this locale.
- "This topic doesn't have well-formed xml."
- The topic XML is not well-formed XML and maybe missing opening or closing element statements.
- To fix this error please ensure that all XML elements having an opening and closing statement and all XML reserved characters are represented as XML entities.
- "This topic has invalid Docbook XML."
- The topic XML is not valid against the Docbook 4.5 DTD.
- To fix this error please ensure that all XML elements are valid Docbook elements . Also check to ensure all XML sub elements are valid for the root XML element.
- "This topic has invalid Injection Points."
- The topic XML contains Injection Points that cannot be resolved into links.
- To fix this error please ensure that all the topics referred to by Injection Points are included in the build and/or have adequate relationships.
- "This topic has no XML data"
- The topic doesn't have any XML Content to display.
- To fix this warning, open the topic URL and add some content.
- "This topic hasn't been fully translated."
- The topic hasn't finished being translated by the Translator(s) yet, as such the topic will be displayed using incomplete translated content.
- To fix this warning, please contact the Translator(s) responsible for translating the topics in this locale.
- "This topic hasn't been pushed for translation."
- The topic hasn't been pushed for translation yet, as such the topic will be displayed using the original topic's content.
- To fix this warning, please send a request to the User responsible for pushing Translations to Zanata and request that the topic be pushed for translation.
- "This topic is an untranslated topic."
- The topic hasn't been translated yet by the Translator(s), as such the topic will be displayed using the untranslated content.
- To fix this warning, please contact the Translator(s) responsible for translating the topics in this locale.
- "This topic's translated content is older than the specfied topic's content."
- A previous revision of this topic has been pushed to Zanata, and has been translated. This previous revision has been included in the book, but will display content that is older than what was defined by the Content Specification.
- To fix this warning, please send a request to the User responsible for pushing Translations to Zanata and request that the topic be pushed for translation. In most cases the existing translations will be able to be reused when the topic is pushed to Zanata.
- "This untranslated topic uses content that is older than the specfied topic's content."
- A previous revision of this topic has been pushed to Zanata, and has not yet been translated.This previous revision has been included in the book, but will display content that is older than what was defined by the Content Specification.
- To fix this warning, please send a request to the User responsible for pushing Translations to Zanata and request that the topic be pushed for translation.
付録A 改訂履歴
改訂履歴 | |||
---|---|---|---|
改訂 0.1-3.400 | 2013-10-30 | Rüdiger Landmann | |
| |||
改訂 0.1-3 | Thu Dec 20 2012 | Tom Wells | |
| |||
改訂 0.1-2 | Thu Dec 20 2012 | Tom Wells | |
| |||
改訂 0.1-1 | Tue Dec 18 2012 | Tom Wells | |
| |||
改訂 0.0-4 | Wed Nov 21 2012 | Tom Wells | |
| |||
改訂 0.0-3 | Fri Nov 16 2012 | Tom Wells | |
| |||
改訂 0.0-2 | Mon Nov 12 2012 | Tom Wells | |
| |||
改訂 0.0-1 | Mon Nov 12 2012 | Tom Wells | |
|