開発ガイド
Red Hat JBoss Enterprise Application Platform 6 向け
概要
第1章 アプリケーションの開発 リンクのコピーリンクがクリップボードにコピーされました!
1.1. はじめに リンクのコピーリンクがクリップボードにコピーされました!
1.1.1. Red Hat JBoss Enterprise Application Platform 6 (JBoss EAP 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 および式言語 (EL) 1.2
- JavaServer Faces (JSF) 2.0 (JSR 314)
- JSP 1.2 向けの Java Standard Tag Library (JSTL)
- 他言語のデバッグサポート 1.0 (JSR 45)
エンタープライズアプリケーション関連
- コンテキストと依存性の注入 (CDI) (JSR 299)
- Java 向けの依存性の注入 (JSR 330)
- Enterprise JavaBeans 3.1 Lite (JSR 318)
- Java Persistence API 2.0 (JSR 317)
- Java Platform 1.1 向けの共通アノテーション (JSR 250)
- Java Transaction API (JTA) 1.1 (JSR 907)
- Bean 検証 (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 EAP 6 で使用されるモジュールおよび新しいモジュラークラスローディングシステム リンクのコピーリンクがクリップボードにコピーされました!
1.2.2.1. モジュール リンクのコピーリンクがクリップボードにコピーされました!
- 静的モジュール
- 静的モジュールは、アプリケーションサーバーの
EAP_HOME/modules/ディレクトリーに事前定義されます。各サブディレクトリーは 1 つのモジュールを表し、1 つまたは複数の JAR ファイルと設定ファイル (module.xml) が含まれます。モジュールの名前は、module.xmlファイルで定義されます。アプリケーションサーバーで提供されるすべての API (Java EE API や JBoss Logging などの他の API を含む) は、静的モジュールとして提供されます。例1.1 module.xml ファイルの例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow モジュール名com.mysqlはそのモジュールのディレクトリー構造と一致する必要があります。カスタム静的モジュールの作成は、同じサードパーティーライブラリーを使用する同じサーバー上に多くのアプリケーションがデプロイされる場合に役立ちます。これらのライブラリーを各アプリケーションとバンドルする代わりに、JBoss 管理者はこれらのライブラリーが含まれるモジュールを作成およびインストールできます。アプリケーションは、カスタム静的モジュールで明示的な依存関係を宣言できます。 - 動的モジュール
- 動的モジュールは、各 JAR または WAR デプロイメント (または、EAR 内のサブデプロイメント) に対してアプリケーションサーバーによって作成およびロードされます。動的モジュールの名前は、デプロイされたアーカイブの名前から派生されます。デプロイメントはモジュールとしてロードされるため、依存関係を設定でき、他のデプロイメントは依存関係として使用することが可能です。
1.2.2.2. クラスロードとモジュールの概要 リンクのコピーリンクがクリップボードにコピーされました!
1.3. 開発環境の設定 リンクのコピーリンクがクリップボードにコピーされました!
1.3.1. JBoss Developer Studio のダウンロードとインストール リンクのコピーリンクがクリップボードにコピーされました!
1.3.1.1. JBoss Developer Studio の設定 リンクのコピーリンクがクリップボードにコピーされました!
1.3.1.2. JBoss Developer Studio 5 のダウンロード リンクのコピーリンクがクリップボードにコピーされました!
- https://access.redhat.com/ へアクセスします。
- → → と選択します。
- ドロップボックスより JBoss Developer Studio を選択します。
- 正しいバージョンを選択し、 をクリックします。
1.3.1.3. JBoss Developer Studio 5 のインストール リンクのコピーリンクがクリップボードにコピーされました!
手順1.1 JBoss Developer Studio 5 のインストール
- ターミナルを開きます。
- ダウンロードした
.jarファイルが含まれるディレクトリーへ移動します。 - 次のコマンドを実行して GUI インストーラーを開始します。
java -jar jbdevstudio-build_version.jar
java -jar jbdevstudio-build_version.jarCopy to Clipboard Copied! Toggle word wrap Toggle overflow - をクリックしてインストールを開始します。
- I accept the terms of this license agreement を選択し、 をクリックします。
- インストールパスを調整し、 をクリックします。
注記
インストールパスのフォルダーが存在しない場合はメッセージが表示されます。 をクリックしてフォルダーを作成します。 - デフォルトの JVM が選択されます。他の JVM を選択するか、そのまま をクリックします。
- 使用可能なアプリケーションプラットフォームを追加し、 をクリックします。
- インストールの詳細を確認し、 をクリックします。
- インストールが完了したら をクリックします。
- JBoss Developer Studio のデスクトップショートカットを設定し、 をクリックします。
- をクリックします。
1.3.1.4. JBoss Developer Studio の起動 リンクのコピーリンクがクリップボードにコピーされました!
手順1.2 JBoss Developer Studio を起動するコマンド
- ターミナルを開きます。
- インストールディレクトリーへ移動します。
- 次のコマンドを実行して JBoss Developer Studio を起動します。
./jbdevstudio
[localhost]$ ./jbdevstudioCopy to Clipboard Copied! Toggle word wrap Toggle overflow
1.3.1.5. JBoss EAP 6 サーバーを JBoss Developer Studio へ追加 リンクのコピーリンクがクリップボードにコピーされました!
手順1.3 サーバーの追加
- Servers タブを開きます。Servers タブがない場合は次のようにパネルへ追加します。
- → → の順にクリックします。
- Servers フォルダーより Server を選択し、 をクリックします。
- new server wizard リンクをクリックするか、空のサーバーパネル内で右クリックし、 → と選択します。
図1.1 新しいサーバーの追加 - 使用できるサーバーがない場合
- JBoss Enterprise Middleware を展開し、 を選択します。その後、 ボタンをクリックします。
図1.2 サーバータイプの選択
- をクリックし、JBoss EAP 6 がインストールされている場所へ移動します。 をクリックします。
図1.3 サーバーインストールの閲覧
- この画面でサーバーの動作を定義します。手作業でサーバーを起動するか、JBoss Developer Studio に管理を任せます。デプロイメントのリモートサーバーを定義し、そのサーバーの管理ポートを公開するかどうかを決定できます (たとえば、JMX を使用してこのサーバーに接続する必要がある場合)。この例では、サーバーがローカルサーバーであり、JBoss Developer Studio がサーバーを管理するため、何もチェックする必要がないことを前提とします。 をクリックします。
図1.4 新しい JBoss サーバーの挙動の定義
- この画面により新しいサーバーに対して既存のプロジェクトを設定することが可能です。現時点ではプロジェクトがないため、 をクリックします。
図1.5 新しい JBoss サーバーのリソースの変更
JBoss Enterprise Application Server 6.0 のランタイムサーバーは Servers タブに表示されます。
図1.6 サーバーがサーバーリストに表示される
1.4. 最初のアプリケーションの実行 リンクのコピーリンクがクリップボードにコピーされました!
1.4.1. デフォルトの Welcome Web アプリケーションの置き換え リンクのコピーリンクがクリップボードにコピーされました!
手順1.4 デフォルトの Welcome Web アプリケーションを独自の Web アプリケーションに置き換える
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)
/profile=default/subsystem=web/virtual-server=default-host:write-attribute(name=enable-welcome-root,value=false)Copy to Clipboard Copied! Toggle word wrap Toggle overflow ルートコンテキストを使用するよう Web アプリケーションを設定します。
Web アプリケーションを設定してルートコンテキストを (/) を URL アドレスとして使用するには、META-INF/またはWEB-INF/ディレクトリーにあるjboss-web.xmlを変更します。<context-root>ディレクティブを次のようなディレクティブに置き換えます。<jboss-web> <context-root>/</context-root> </jboss-web><jboss-web> <context-root>/</context-root> </jboss-web>Copy to Clipboard Copied! Toggle word wrap Toggle overflow アプリケーションをデプロイします。
サーバーグループか最初に変更したサーバーにアプリケーションをデプロイします。アプリケーションはhttp://SERVER_URL:PORT/で使用できるようになります。
1.4.2. クイックスタートコードサンプルのダウンロード リンクのコピーリンクがクリップボードにコピーされました!
1.4.2.1. クイックスタートへのアクセス リンクのコピーリンクがクリップボードにコピーされました!
JBoss EAP 6 には、ユーザーが Java EE 6 の技術を使用したアプリケーションの作成を簡単に開始できるクイックスタートのサンプルが複数含まれています。
要件
- Maven 3.0.0 またはそれ以降のバージョン。Maven のインストールに関する詳細は http://maven.apache.org/download.html を参照してください。
- JBoss EAP 6.2 の Maven リポジトリーはオンライン上にあるため、ローカルにダウンロードし、インストールする必要はありません。オンラインリポジトリーを使用する場合は、次の手順を省略してください。ローカルリポジトリーをインストールする場合は、 「JBoss EAP 6 Maven リポジトリーのローカルインストール」を参照してください。
手順1.5 クイックスタートのダウンロード
- Web ブラウザーを開き、URL https://access.redhat.com/jbossnetwork/restricted/listSoftware.html?product=appplatform にアクセスします。
- リストで「Quickstarts」を見つけます。
- ボタンをクリックし、サンプルが含まれる zip アーカイブをダウンロードします。
- ディレクトリーにアーカイブを展開します。
JBoss EAP クイックスタートがダウンロードされ、展開されます。各クイックスタートのデプロイ方法については、クイックスタートアーカイブのトップレベルディレクトリーにある README.md ファイルを参照してください。
1.4.3. クイックスタートの実行 リンクのコピーリンクがクリップボードにコピーされました!
1.4.3.1. JBoss Developer Studio でのクイックスタートの実行 リンクのコピーリンクがクリップボードにコピーされました!
手順1.6 JBoss Developer Studio にクイックスタートをインポートする
- 「Maven 設定を使用した JBoss EAP 6 Maven リポジトリーの設定」 を行っていない場合は、記載されている手順に従って設定してください。
- JBoss Developer Studio を起動します。
- メニューより → と選択します。
- 選択リストより → と選択し、 をクリックします。
図1.7 既存の Maven プロジェクトのインポート
- インポートするクイックスタートのディレクトリーを参照し、 をクリックします。Projects リストボックスに、選択したクイックスタートプロジェクトの
pom.xmlファイルが示されます。図1.8 Maven プロジェクトの選択
- をクリックした後、 をクリックします。
手順1.7 helloworld クイックスタートのビルドとデプロイ
helloworld クイックスタートは最も単純なクイックスタートの 1 つで、JBoss サーバーが適切に設定され実行されているか検証することができます。
- Servers タブを開き、パネルにアプリケーションを追加します。
- → → の順にクリックします。
- Servers フォルダーから Server を選択し、 をクリックします。
- Project Explorer タブで helloworld を右クリックし、 → を選択します。
- JBoss EAP 6.2 Runtime Server を選択し、 をクリックします。これにより、
helloworldクイックスタートが JBoss サーバーにデプロイされます。 - サーバーコンソールを確認します。以下のメッセージが表示されているはずです。デプロイされたアプリケーションへアクセスする URL を提供するため、登録された Web コンテキストの前には
JBAS018210: Register web context: /jboss-helloworld JBAS018559: Deployed "jboss-helloworld.war" (runtime-name : "jboss-helloworld.war")
JBAS018210: Register web context: /jboss-helloworld JBAS018559: Deployed "jboss-helloworld.war" (runtime-name : "jboss-helloworld.war")Copy to Clipboard Copied! Toggle word wrap Toggle overflow http://localhost:8080が追加されます。 helloworldクイックスタートが JBoss サーバーに正しくデプロイされたことを確認するには、Web ブラウザーを開き、URL http://localhost:8080/jboss-helloworld にてアプリケーションにアクセスします。
1.4.3.2. コマンドラインを使用したクイックスタートの実行 リンクのコピーリンクがクリップボードにコピーされました!
手順1.8 コマンドラインを使用したクイックスタートのビルドおよびデプロイ
クイックスタートのルートディレクトリーにある
READMEファイルを確認してください。このファイルにはシステム要件に関する一般的な情報、Maven の設定方法、ユーザーの追加方法、クイックスタートの実行方法が含まれています。クイックスタートを始める前に必ず読むようにしてください。このファイルには使用可能なクイックスタートの一覧表も含まれています。この表にはクイックスタート名と使用する技術が記載され、各クイックスタートの簡単な説明と設定するために必要な経験レベルが記載されています。クイックスタートの詳細情報はクイックスタート名をクリックしてください。他のクイックスタートを改良または拡張するために作成されたクイックスタートもあります。このようなクイックスタートはPrerequisitesカラムに記載されています。クイックスタートに前提条件がある場合、クイックスタートを始める前にこれらをインストールする必要があります。オプションコンポーネントのインストールや設定が必要になるクイックスタートもあります。これらのコンポーネントは、クイックスタートが必要とする場合のみインストールしてください。helloworldクイックスタートを実行します。helloworldクイックスタートは最も単純なクイックスタートの 1 つで、JBoss サーバーが適切に設定され実行されているかどうかを検証できます。helloworldクイックスタートのルートにあるREADMEファイルを開きます。このファイルには、クイックスタートのビルドおよびデプロイ方法や、実行しているアプリケーションへのアクセス方法の詳細手順が含まれています。別のクイックスタートを実行します。
各クイックスタートのルートフォルダーにあるREADMEファイルの手順に従って例を実行します。
1.4.4. クイックスタートチュートリアルの確認 リンクのコピーリンクがクリップボードにコピーされました!
1.4.4.1. helloworld クイックスタート リンクのコピーリンクがクリップボードにコピーされました!
helloworld クイックスタートでは JBoss EAP 6 に単純なサーブレットをデプロイする方法を説明します。ビジネスロジックは CDI (Contexts and Dependency Injection、コンテキストと依存性の注入) Bean として提供されるサービスにカプセル化され、サーブレットにインジェクトされます。このクイックスタートは大変単純で、「Hello World」を Web ページに出力するだけです。サーバーが適切に設定され、起動されたかどうかを確認するのに適しています。
手順1.9 helloworld クイックスタートを JBoss Developer Studio にインポートします。
- Maven リポジトリーを設定していない場合は、 「Maven 設定を使用した JBoss EAP 6 Maven リポジトリーの設定」の手順に従って設定します。
- JBoss Developer Studio がインストールされていない場合は、 「JBoss Developer Studio 5 のインストール」の手順に従ってインストールします。
- 「JBoss Developer Studio の起動」に従って JBoss Developer Studio を起動します。
- メニューより → と選択します。
- 選択リストより → を選択し、 をクリックします。
図1.9 既存の Maven プロジェクトのインポート
QUICKSTART_HOME/quickstart/helloworld/ディレクトリーを閲覧し、 をクリックします。Projects リストボックスに、helloworld クイックスタートプロジェクトからpom.xmlファイルが追加されます。図1.10 Maven プロジェクトの選択
- をクリックします。
手順1.10 helloworld クイックスタートのビルドとデプロイ
- JBoss EAP 6 向けの JBoss Developer Studio が設定されていない場合は、 「JBoss EAP 6 サーバーを JBoss Developer Studio へ追加」の手順に従って設定する必要があります。
- Project Explorer タブの jboss-as-helloworld を右クリックし、 → と選択します。
図1.11 サーバー上での実行
- JBoss EAP 6.0 Runtime Server を選択し、 をクリックします。これにより、helloworld クイックスタートが JBoss サーバーにデプロイされます。
- helloworld が JBoss サーバーに正しくデプロイされたことを確認するには、Web ブラウザーを開き、URL http://localhost:8080/jboss-as-helloworld を指定してアプリケーションにアクセスします。
手順1.11 ディレクトリー構造の確認
QUICKSTART_HOME/helloworld ディレクトリーにあります。helloworld クイックスタートはサーブレットと CDI Bean によって構成されます。また、このアプリケーションで Bean を検索し、CDI をアクティベートするよう JBoss EAP 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.12 コードの確認
HelloWorldServlet コードの検証
HelloWorldServlet.javaはsrc/main/java/org/jboss/as/quickstarts/helloworld/ディレクトリーにあります。このサーブレットが情報をブラウザーに送ります。Copy to Clipboard Copied! Toggle word wrap Toggle overflow Expand 表1.1 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 やアノテーションの登録は必要ありません。Copy to Clipboard Copied! Toggle word wrap Toggle overflow
1.4.4.2. numberguess クイックスタート リンクのコピーリンクがクリップボードにコピーされました!
このクイックスタートでは単純なアプリケーションを作成し、JBoss EAP 6 にデプロイする方法を説明します。ここで作成するアプリケーションは情報を永続化しません。情報は JSF ビューを使用して表示され、ビジネスロジックは 2 つの CDI (Contexts and Dependency Injection、コンテキストと依存性の注入) Bean にカプセル化されます。numberguess クイックスタートでは 1 から 100 までの数字を当てるチャンスが 10 回与えられます。数字を選択した後、その数字が正解の数字より大きいまたは小さいか表示されます。
QUICKSTART_HOME/numberguess ディレクトリーにあります。numberguess クイックスタートは WAR モジュールとしてパッケージ化された複数の Bean や設定ファイル、Facelets (JSF) ビューによって構成されます。
手順1.13 numberguess クイックスタートを JBoss Developer Studio にインポートします。
- JBoss Developer Studio がインストールされていない場合は、 「JBoss Developer Studio 5 のインストール」の手順に従ってインストールします。
- 「JBoss Developer Studio の起動」に従って JBoss Developer Studio を起動します。
- メニューより → と選択します。
- 選択リストより → と選択し、 をクリックします。
図1.12 既存の Maven プロジェクトのインポート
QUICKSTART_HOME/quickstart/numberguess/ディレクトリーを閲覧し、 をクリックします。 Projects リストボックスに、numberguess クイックスタートプロジェクトからpom.xmlファイルが追加されます。- をクリックします。
手順1.14 numberguess クイックスタートのビルドとデプロイ
- JBoss EAP 6 向けの JBoss Developer Studio が設定されていない場合は、 「JBoss EAP 6 サーバーを JBoss Developer Studio へ追加」の手順に従って設定する必要があります。
- Project Explorer タブの jboss-as-numberguess を右クリックし、 → と選択します。
- JBoss EAP 6.0 Runtime Server を選択し、 をクリックします。これにより numberguess クイックスタートが JBoss サーバーにデプロイされます。
- numberguess が JBoss サーバーに正しくデプロイされたことを確認するには、Web ブラウザを開き、URL http://localhost:8080/jboss-as-numberguess を指定してアプリケーションにアクセスします。
手順1.15 設定ファイルの確認
src/main/webapp/ ディレクトリーにある WEB-INF/ ディレクトリーに格納されています。
faces-config ファイルの確認
本クイックスタートはfaces-config.xmlファイル名の JSF 2.0 バージョンを使用します。Facelets の標準的なバージョンが JSF 2.0 のデフォルトのビューハンドラーであるため、特に必要なものはありません。ここでは JBoss EAP 6 は Java EE の領域を越えます。この設定ファイルが含まれると JSF が自動的に設定されます。そのため、設定はルート要素のみで構成されます。Copy to Clipboard Copied! Toggle word wrap Toggle overflow beans.xml ファイルの確認
空のbeans.xmlファイルも存在します。このファイルは、このアプリケーションで Bean を検索し、CDI をアクティベートするよう JBoss EAP 6 に指示します。web.xml ファイルはありません
クイックスタートにはweb.xmlファイルは必要ありません。
手順1.16 JSF コードの確認
.xhtml ファイル拡張子を使用しますが、レンダリングされたビューには .jsf 拡張子を使用します。
home.xhtml コードの確認
home.xhtmlファイルはsrc/main/webapp/ディレクトリーにあります。Copy to Clipboard Copied! Toggle word wrap Toggle overflow Expand 表1.2 JSF の詳細 行 注記 20-24 ユーザーに送信できるメッセージ、「Higher」(より大きい) と「Lower」(より小さい) になります。 29-32 ユーザーが数を選択するごとに数字の範囲が狭まります。有効な数の範囲が分かるようにこの文章は変更されます。 38-42 このフィールドは値式を使用して Bean プロパティーにバインドされます。 42 ユーザーが誤って範囲外の数字を入力しないようにバリデーターのバインディングが使用されます。バリデーターがないと、ユーザーが範囲外の数字を使用する可能性があります。 43-45 ユーザーの選択した数字をサーバーに送る方法がなければなりません。ここでは、Bean 上のアクションメソッドをバインドします。
手順1.17 クラスファイルの確認
src/main/java/org/jboss/as/quickstarts/numberguess/ ディレクトリーにあります。パッケージの宣言とインポートはリストには含まれていません。完全なリストはクイックスタートのソースコードにあります。
Random.java 限定子コードの検証
型に基づきインジェクションの対象となる、2 つの Bean の間であいまいさをなくすために修飾子が使用されます。修飾子の詳細については、 「修飾子を使用したあいまいなインジェクションの解決」を参照してください。@Random修飾子は乱数のインジェクションに使用されます。Copy to Clipboard Copied! Toggle word wrap Toggle overflow MaxNumber.java 修飾子コードの検証
@MaxNumberqualifierは最大許可数のインジェクションに使用されます。Copy to Clipboard Copied! Toggle word wrap Toggle overflow ジェネレーターコードの検証
Generatorクラスの役割は、producer メソッドより乱数を作成することです。また、producer メソッドより最大可能数も公開します。このクラスはアプリケーションスコープ指定であるため、毎回異なる乱数になることはありません。Copy to Clipboard Copied! Toggle word wrap Toggle overflow ゲームコードの検証
セッションスコープ指定クラスGameは、アプリケーションのプライマリーエントリーポイントです。ゲームの設定や再設定、ユーザーが選択する数字のキャプチャーや検証、FacesMessageによるユーザーへのフィードバック提供を行う役割があります。コンストラクト後の lifecycle メソッドを使用し、@Random Instance<Integer>Bean より乱数を読み出してゲームを初期化します。このクラスの @Named アノテーションを見てください。このアノテーションは式言語 (EL) より Bean を JSF ビューにアクセスできるようにしたい場合のみ必要です。この場合#{game}が EL になります。Copy to Clipboard Copied! Toggle word wrap Toggle overflow
第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 ファイルは次のようになります。
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.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 EAP 6 の Maven リポジトリーのインストール リンクのコピーリンクがクリップボードにコピーされました!
2.2.3. JBoss EAP 6 Maven リポジトリーのローカルインストール リンクのコピーリンクがクリップボードにコピーされました!
JBoss EAP 6.2 の Maven リポジトリーはオンライン上にあるため、ローカルにダウンロードし、インストールする必要はありません。しかし、JBoss EAP の Maven リポジトリーをローカルでインストールする場合は、ローカルファイルシステム上のインストール、Apache Web Server 上のインストール、および Maven リポジトリーマネージャーを用いたインストールの 3 つの方法を使用できます。この例では、ローカルのファイルシステムへ JBoss EAP 6 の Maven リポジトリーをダウンロードする手順を取り上げます。このオプションは設定が簡単で、ローカルマシンですぐ使用できます。開発環境で Maven の知識を深めることができますが、チームによる実稼働環境での使用は推奨されません。
手順2.1 JBoss EAP 6 Maven リポジトリーのローカルファイルシステムへのダウンロードおよびインストール
- Web ブラウザーを開き、URL https://access.redhat.com/jbossnetwork/restricted/listSoftware.html?product=appplatform にアクセスします。
- リストに「Red Hat JBoss Enterprise Application Platform 6.2.0 Maven Repository」があることを確認します。
- ボタンをクリックし、リポジトリーが含まれる
.zipファイルをダウンロードします。 - ローカルファイルシステム上の同じディレクトリーにあるファイルを希望のディレクトリーで展開します。
- 「Maven 設定を使用した JBoss EAP 6 Maven リポジトリーの設定」に記載された手順に従います。
これにより、jboss-eap-6.2.0.maven-repository という Maven リポジトリーディレクトリーが作成されます。
重要
settings.xml 設定ファイルで個別に設定する必要があります。各ローカルリポジトリーは、独自の <repository> タグ内で設定する必要があります。
重要
.m2/ ディレクトリーにあるキャッシュされた repository/ サブディレクトリーを削除してください。
2.2.4. Apache httpd を使用するための JBoss EAP 6 Maven リポジトリーのインストール リンクのコピーリンクがクリップボードにコピーされました!
Apache httpd を設定する必要があります。手順は Apache HTTP Server Project を参照してください。
手順2.2 JBoss EAP 6 の Maven リポジトリー zip アーカイブのダウンロード
- Web ブラウザーを開き、URL https://access.redhat.com/jbossnetwork/restricted/listSoftware.html?product=appplatform にアクセスします。
- リストに「Red Hat JBoss Enterprise Application Platform 6.2.0 Maven Repository」があることを確認します。
- ボタンをクリックし、リポジトリーが含まれる
.zipファイルをダウンロードします。 - Apache サーバー上で Web にアクセス可能なディレクトリーにファイルを展開します。
- Apache を設定し、作成されたディレクトリーの読み取りアクセスとディレクトリの閲覧を許可します。
マルチユーザー環境が Apache httpd 上で Maven リポジトリーにアクセスできるようになります。
注記
2.2.5. Nexus Maven リポジトリーマネージャーを使用した JBoss EAP 6 Maven リポジトリーのインストール リンクのコピーリンクがクリップボードにコピーされました!
手順2.3 JBoss EAP 6 の Maven リポジトリー zip アーカイブのダウンロード
- Web ブラウザーを開き、URL https://access.redhat.com/jbossnetwork/restricted/listSoftware.html?product=appplatform にアクセスします。
- リストに「Red Hat JBoss Enterprise Application Platform 6.2.0 Maven Repository」があることを確認します。
- ボタンをクリックし、リポジトリーが含まれる
.zipファイルをダウンロードします。 - 希望のディレクトリーにファイルを展開します。
手順2.4 Nexus Maven リポジトリーマネージャーを使用した JBoss EAP 6 Maven リポジトリーの追加
- 管理者として Nexus にログインします。
- リポジトリーマネージャーの左側にある → メニューより 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 EAP Maven リポジトリーの設定 リンクのコピーリンクがクリップボードにコピーされました!
プロジェクトで JBoss EAP 6 の Maven リポジトリーを使用するよう Maven に指示する方法は 2 つあります。
- リポジトリーを Maven グローバルまたはユーザー設定で設定します。
- リポジトリーをプロジェクトの POM ファイルで設定します。
手順2.5 JBoss EAP 6 Maven リポジトリーを使用するよう Maven を設定
Maven の設定を使用して Maven リポジトリーを設定する
これは推奨される方法です。リポジトリーマネージャーや共有サーバーを用いたリポジトリーを使用して Maven を設定すると、プロジェクトの制御や管理が向上します。また、代替のミラーを使用してプロジェクトファイルを変更せずにリポジトリーマネージャーへの特定リポジトリーのルックアップ要求をすべてリダイレクトすることが可能になります。ミラーに関する詳細については、http://maven.apache.org/guides/mini/guide-mirror-settings.html を参照してください。プロジェクトの POM ファイルにリポジトリー設定が含まれていない場合、この設定方法はすべての Maven プロジェクトに対して適用されます。プロジェクトの POM を使用して Maven リポジトリーを設定する
通常、この方法は推奨されません。プロジェクトの POM ファイルにリポジトリーを設定する場合は慎重に計画します。ビルドに時間がかかり、想定外のリポジトリーからアーティファクトが抽出されることがあることに注意してください。注記
通常レポジトリーマネージャーが使用されるエンタープライズ環境では、Maven は、このマネージャーを使用してすべてのプロジェクトに対してすべてのアーティファクトを問い合わせる必要があります。Maven は、宣言されたすべてのリポジトリーを使用して不明なアーティファクトを見つけます。探しているものが見つからない場合は、中央リポジトリー (組み込みの親 POM で定義されます) での検索を試行します。この中央の場所をオーバーライドするには、centralで定義を追加してデフォルトの中央リポジトリーがリポジトリーマネージャーになるようにします。これは、確立されたプロジェクトには適切ですが、クリーンな、または「新しい」プロジェクトの場合は、周期的な依存関係が作成されるため、問題が発生します。このような設定では、推移的に含まれた POM も問題になります。Maven は、これらの外部リポジトリーで不明なアーティファクトを問い合わせる必要があります。これにより、ビルドに時間がかかるだけでなく、アーティファクトの抽出元を制御できなくなり、多くの場合、ビルドが破壊されます。この設定方法は、設定されたプロジェクトのグローバルおよびユーザーの Maven 設定を上書きします。
2.3.2. Maven 設定を使用した JBoss EAP 6 Maven リポジトリーの設定 リンクのコピーリンクがクリップボードにコピーされました!
- Maven 設定を変更できます。これにより、Maven がすべてのプロジェクトで設定を使用するよう指示できます。
- プロジェクトの POM ファイルを設定できます。これは、設定を特定のプロジェクトに制限します。
注記
- ファイルシステム
- file:///path/to/repo/jboss-eap-6.x-maven-repository
- Apache Web Server
- http://intranet.acme.com/jboss-eap-6.x-maven-repository/
- Nexus Repository Manager
- https://intranet.acme.com/nexus/content/repositories/jboss-eap-6.x-maven-repository
手順2.6 クイックスタートサンプルの設定を使用した Maven の設定
settings.xml ファイルが含まれています。これを使用するのが、最も簡単な設定方法です。
- この手順では、既存の Maven 設定ファイルが上書きされるため、既存の Maven
settings.xmlファイルをバックアップする必要があります。- Maven インストールディレクトリーの場所を確認します。通常、
USER_HOME/.m2/ディレクトリーにインストールされています。- オペレーティングシステムが Linux または Mac の場合は、
~/.m2/になります。 - Windows の場合は、
\Documents and Settings\USER_NAME\.m2\または\Users\USER_NAME\.m2\になります。
- 既存の
USER_HOME/.m2/settings.xmlファイルがある場合、名前を変更してバックアップコピーを作成し、後で復元できるようにします。
- JBoss EAP 6.2 に含まれるクイックスタートサンプルをダウンロードし、展開します。詳細は、本書の「クイックスタートコードサンプルのダウンロード」の項を参照してください。
QUICKSTART_HOME/settings.xmlファイルをUSER_HOME/.m2/ディレクトリーへコピーします。- JBoss Developer Studio の稼働中に
settings.xmlファイルを変更する場合は、以下の「JBoss Developer Studio ユーザー設定のリフレッシュ」の手順に従ってください。
手順2.7 オンラインの JBoss EAP 6.2 Maven リポジトリーを使用するよう手作業で Maven 設定を編集および設定する
- Maven インストールディレクトリーの場所を確認します。通常、
USER_HOME/.m2/ディレクトリーにインストールされています。- オペレーティングシステムが Linux または Mac の場合は、
~/.m2/になります。 - Windows の場合は、
\Documents and Settings\USER_NAME\.m2\または\Users\USER_NAME\.m2\になります。
settings.xmlファイルが見つからない場合は、USER_HOME/.m2/conf/ディレクトリーのsettings.xmlファイルをUSER_HOME/.m2/ディレクトリーへコピーします。- 次の XML をファイルの
<profiles>要素へコピーします。Copy to Clipboard Copied! Toggle word wrap Toggle overflow 次の XML をsettings.xmlファイルの<activeProfiles>要素へコピーします。<activeProfile>jboss-ga-repository</activeProfile> <activeProfile>jboss-earlyaccess-repository</activeProfile>
<activeProfile>jboss-ga-repository</activeProfile> <activeProfile>jboss-earlyaccess-repository</activeProfile>Copy to Clipboard Copied! Toggle word wrap Toggle overflow - JBoss Developer Studio の稼働中に
settings.xmlファイルを変更する場合は、以下の「JBoss Developer Studio ユーザー設定のリフレッシュ」の手順に従ってください。
手順2.8 ローカルにインストールされた JBoss EAP リポジトリーを使用するよう設定する
- Maven インストールディレクトリーの場所を確認します。通常、
USER_HOME/.m2/ディレクトリーにインストールされています。- オペレーティングシステムが Linux または Mac の場合は、
~/.m2/になります。 - Windows の場合は、
\Documents and Settings\USER_NAME\.m2\または\Users\USER_NAME\.m2\になります。
settings.xmlファイルが見つからない場合は、USER_HOME/.m2/conf/ディレクトリーのsettings.xmlファイルをUSER_HOME/.m2/ディレクトリーへコピーします。- 以下の XML を
settings.xmlファイルの<profiles>要素にコピーします。必ず、<url>を実際のリポジトリーの場所に変更してください。Copy to Clipboard Copied! Toggle word wrap Toggle overflow 次の XML をsettings.xmlファイルの<activeProfiles>要素へコピーします。<activeProfile>jboss-eap-repository</activeProfile>
<activeProfile>jboss-eap-repository</activeProfile>Copy to Clipboard Copied! Toggle word wrap Toggle overflow - JBoss Developer Studio の稼働中に
settings.xmlファイルを変更する場合は、以下の「JBoss Developer Studio ユーザー設定のリフレッシュ」の手順に従ってください。
手順2.9 JBoss Developer Studio ユーザー設定のリフレッシュ
settings.xml ファイルを変更する場合は、ユーザー設定をリフレッシュする必要があります。
- メニューより、 → を選択します。
- Preferences ウインドウで Maven を展開し、User Settings を選択します。
- ボタンをクリックし、JBoss Developer Studio で Maven のユーザー設定をリフレッシュします。
図2.1 Maven ユーザー設定の更新
重要
- Missing artifact ARTIFACT_NAME
- [ERROR] Failed to execute goal on project PROJECT_NAME; Could not resolve dependencies for PROJECT_NAME
~/.m2/repository/ サブディレクトリー (Linux の場合) または %SystemDrive%\Users\USERNAME\.m2\repository\ サブディレクトリー (Windows の場合) に存在します。
2.3.3. プロジェクト POM を使用した JBoss EAP 6 リポジトリーの設定 リンクのコピーリンクがクリップボードにコピーされました!
- Maven 設定を変更できます。
- プロジェクトの POM ファイルを設定できます。
pom.xml に追加して、JBoss EAP 6 の Maven リポジトリーを使用するよう特定のプロジェクトを設定する方法について説明します。この設定方法は、グローバル設定とユーザー設定よりも優先されます。
注記
central で定義を追加してデフォルトの中央リポジトリーがリポジトリーマネージャーになるようにします。これは、確立されたプロジェクトには適切ですが、クリーンな、または「新しい」プロジェクトの場合は、周期的な依存関係が作成されるため、問題が発生します。
注記
- ファイルシステム
file:///path/to/repo/jboss-eap-6.0.0-maven-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>をリポジトリーが実存する場所に変更するようにしてください。Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 次のプラグインリポジトリー設定を追加します。すでにファイルに
<pluginRepositories>設定が存在する場合は<pluginRepository>要素を追加します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow
2.3.4. プロジェクト依存関係の管理 リンクのコピーリンクがクリップボードにコピーされました!
pom.xml (POM) ファイルです。バージョン依存関係は、ファイルの依存関係管理セクションにリストされています。
groupId:artifactId:version (GAV) をプロジェクト pom.xml ファイルの依存関係管理セクションに追加し、<scope>import</scope> および <type>pom</type> 要素の値を指定して、BOM を使用します。
注記
provided スコープが使用されます。これは、これらのクラスは起動時にアプリケーションサーバーによって提供され、ユーザーアプリケーションとともにパッケージする必要がないためです。
サポート対象の Maven アーティファクト
1.0.0-redhat-1 のように使用される -redhat バージョン修飾子によって簡単に識別可能です。
pom.xml ファイルをビルドすると、ローカルのビルドおよびテストにて正しいバイナリーアーティファクトが使用されるようになります。-redhat バージョンのアーティファクトは、サポートされるパブリック API の一部であるとは限らず、今後の改訂で変更されることがあります。サポートされるパブリック API の詳細については、本リリースに同梱されている JavaDoc ドキュメントを参照してください。
<version/> の値が含まれていることに注意してください。依存関係バージョンの設定には、Maven の依存関係管理を使用することが推奨されます。
依存関係管理
JBoss JavaEE Specs Bom
jboss-javaee-6.0 BOM には、JBoss EAP によって使用される Java EE Specification API JAR が含まれています。
3.0.2.Final-redhat-x バージョンの jboss-javaee-6.0 BOM が使用されています。
JBoss EAP BOM とクイックスタート
| Maven artifactId | 説明 |
|---|---|
| jboss-javaee-6.0-with-hibernate | この BOM は、Java EE full プロファイル BOM 上にビルドし、Hibernate ORM、Hibernate Search、Hibernate Validator などの Hibernate Community プロジェクトを追加します。また、Hibernate JPA Model Gen、Hibernate Validator Annotation Processor などのツールプロジェクトも提供します。 |
| jboss-javaee-6.0-with-hibernate3 | この BOM は、Java EE full プロファイル BOM 上にビルドし、Hibernate 3 ORM、Hibernate Entity Manager (JPA 1.0)、Hibernate Validator などの Hibernate Community プロジェクトを追加します。 |
| jboss-javaee-6.0-with-logging | この BOM は、Java EE full プロファイル BOM 上にビルドし、JBoss Logging Tools と Log4 フレームワークを追加します。 |
| jboss-javaee-6.0-with-osgi | この BOM は、Java EE full プロファイル BOM 上にビルドし、OSGI を追加します。 |
| jboss-javaee-6.0-with-resteasy | この BOM は、Java EE full プロファイル BOM 上にビルドし、RESTEasy を追加します。 |
| jboss-javaee-6.0-with-security | この BOM は、Java EE full プロファイル BOM 上にビルドし、Picketlink を追加します。 |
| jboss-javaee-6.0-with-tools | この BOM は、Java EE full プロファイル BOM 上にビルドし、Arquillian を追加します。また、Arquillian との使用に推奨されるバージョンの JUnit および TestNG も提供します。 |
| jboss-javaee-6.0-with-transactions | この BOM には、ワールドクラスのトランザクションマネージャーが含まれます。JBossTS API を使用して完全機能にアクセスします。 |
6.2.0.GA バージョンの jboss-javaee-6.0-with-hibernate BOM を使用されています。
JBoss クライアント BOM
jboss-as-ejb-client-bom と jboss-as-jms-client-bom の 2 つのクライアント BOM が含まれています。
7.3.0.Final-redhat-x バージョンの jboss-as-ejb-client-bom クライアント BOM が使用されています。
7.3.0.Final-redhat-x バージョンの jboss-as-jms-client-bom クライアント BOM が使用されています。
2.4. Maven リポジトリーのアップグレード リンクのコピーリンクがクリップボードにコピーされました!
2.4.1. ローカル Maven リポジトリーへのパッチ適用 リンクのコピーリンクがクリップボードにコピーされました!
Maven リポジトリーは、Java ライブラリー、プラグイン、およびアプリケーションを JBoss EAP へビルドおよびデプロイするために必要なその他のアーティファクトを保存します。JBoss EAP リポジトリーはオンラインで使用可能で、ダウンロードした ZIP ファイルを使用することもできます。ホストされたパブリックリポジトリーを使用する場合は、更新が自動的に適用されます。しかし、Maven リポジトリーをローカルにダウンロードおよびインストールする場合は、ユーザーが更新を適用する必要があります。JBoss EAP のパッチが使用できるようになると、対応パッチが JBoss EAP Maven リポジトリーに提供されます。このパッチの形式は、既存のローカルリポジトリーへ展開される累計 ZIP ファイルです。この ZIP ファイルには、新しい JAR と POM ファイルが含まれますが、既存の JAR の上書きや削除は行わないため、ロールバックの要件がありません。
unzip コマンドを使用して Maven の更新をローカルにインストールされた Maven リポジトリーに適用する方法を説明します。
要件
- Red Hat カスタマーポータルへの有効なアクセスおよびサブスクリプション。
- ダウンロードされ、ローカルでインストールされた Red Hat JBoss Enterprise Application Platform 6.3.0 の Maven リポジトリー ZIP ファイル。
手順2.10 Maven リポジトリーの更新
- ブラウザーを開き、https://access.redhat.com にログインします。
- ページ上部のメニューにある を選択します。
Red Hat JBoss Middlewareを見つけ、 ボタンをクリックします。- 次の画面に表示される Product ドロップダウンメニューより Enterprise Application Platform を選択します。
- 画面に表示される Version ドロップダウンメニューより、正しいバージョンの JBoss EAP を選択し、Patches をクリックします。
- リストで
Red Hat JBoss Enterprise Application Platform 6.2 CPx Incremental Maven Repositoryを見つけ、 をクリックします。 - ディレクトリーに ZIP ファイルを保存するよう促されます。ディレクトリーを選択し、ファイルを保存します。
- ご使用のオペレーティングシステムに対応する JBoss EAP Maven リポジトリーへのパスを探します (以下のコマンドでは EAP_MAVEN_REPOSITORY_PATH と表示されています)。ローカルファイルシステムに Maven リポジトリーをインストール方法については、 「JBoss EAP 6 Maven リポジトリーのローカルインストール」を参照してください。
- JBoss EAP 6.2.x Maven リポジトリーのインストールディレクトリーで、Maven パッチファイルを直接展開します。
- Linux の場合は、ターミナルを開いて次のコマンドを入力します。
[standalone@localhost:9999 /] unzip -o jboss-eap-6.2.x-incremental-maven-repository.zip -d EAP_MAVEN_REPOSITORY_PATH
[standalone@localhost:9999 /] unzip -o jboss-eap-6.2.x-incremental-maven-repository.zip -d EAP_MAVEN_REPOSITORY_PATHCopy to Clipboard Copied! Toggle word wrap Toggle overflow - Windows の場合は、Windows の展開ユーティリティーを使用して、ZIP ファイルを
EAP_MAVEN_REPOSITORY_PATHディレクトリーのルートへ展開します。
ローカルにインストールされた Maven リポジトリーが最新パッチを用いて更新されます。
第3章 クラスローディングとモジュール リンクのコピーリンクがクリップボードにコピーされました!
3.1. はじめに リンクのコピーリンクがクリップボードにコピーされました!
3.1.1. クラスロードとモジュールの概要 リンクのコピーリンクがクリップボードにコピーされました!
3.1.2. クラスローディング リンクのコピーリンクがクリップボードにコピーされました!
3.1.3. モジュール リンクのコピーリンクがクリップボードにコピーされました!
- 静的モジュール
- 静的モジュールは、アプリケーションサーバーの
EAP_HOME/modules/ディレクトリーに事前定義されます。各サブディレクトリーは 1 つのモジュールを表し、1 つまたは複数の JAR ファイルと設定ファイル (module.xml) が含まれます。モジュールの名前は、module.xmlファイルで定義されます。アプリケーションサーバーで提供されるすべての API (Java EE API や JBoss Logging などの他の API を含む) は、静的モジュールとして提供されます。例3.1 module.xml ファイルの例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow モジュール名com.mysqlはそのモジュールのディレクトリー構造と一致する必要があります。カスタム静的モジュールの作成は、同じサードパーティーライブラリーを使用する同じサーバー上に多くのアプリケーションがデプロイされる場合に役立ちます。これらのライブラリーを各アプリケーションとバンドルする代わりに、JBoss 管理者はこれらのライブラリーが含まれるモジュールを作成およびインストールできます。アプリケーションは、カスタム静的モジュールで明示的な依存関係を宣言できます。 - 動的モジュール
- 動的モジュールは、各 JAR または WAR デプロイメント (または、EAR 内のサブデプロイメント) に対してアプリケーションサーバーによって作成およびロードされます。動的モジュールの名前は、デプロイされたアーカイブの名前から派生されます。デプロイメントはモジュールとしてロードされるため、依存関係を設定でき、他のデプロイメントは依存関係として使用することが可能です。
3.1.4. モジュールの依存性 リンクのコピーリンクがクリップボードにコピーされました!
例3.2 モジュールの依存関係
- モジュール 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 EAP 6 が自動的に追加する依存関係です。これらの依存関係は、一般的な機能や JBoss EAP 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
deployment.DEPLOYMENT_NAMECopy to Clipboard Copied! Toggle word wrap Toggle overflow たとえば、inventory.warのモジュール名はdeployment.inventory.warとなり、store.jarのモジュール名はdeployment.store.jarとなります。 - エンタープライズアーカイブ内のサブデプロイメントは次の形式で名前が付けられます。
deployment.EAR_NAME.SUBDEPLOYMENT_NAME
deployment.EAR_NAME.SUBDEPLOYMENT_NAMECopy to Clipboard Copied! Toggle word wrap Toggle overflow たとえば、エンタープライズアーカイブaccounts.ear内にあるreports.warのサブデプロイメントのモジュール名はdeployment.accounts.ear.reports.warになります。
3.1.8. jboss-deployment-structure.xml リンクのコピーリンクがクリップボードにコピーされました!
jboss-deployment-structure.xml は JBoss EAP 6 の新しいオプションデプロイメント記述子です。このデプロイメント記述子を使用すると、デプロイメントのクラスローディングを制御できます。
EAP_HOME/docs/schema/jboss-deployment-structure-1_2.xsd にあります。
3.2. デプロイメントへの明示的なモジュール依存性の追加 リンクのコピーリンクがクリップボードにコピーされました!
要件
- モジュールの依存性を追加するソフトウェアプロジェクトが存在する必要があります。
- 依存関係として追加するモジュールの名前を覚えておく必要があります。JBoss EAP 6 に含まれる静的モジュールのリストは、「含まれるモジュール」を参照してください。モジュールが他のデプロイメントである場合は、「動的モジュールの名前付け」を参照してモジュール名を判断してください。
- デプロイメントの
MANIFEST.MFファイルにエントリーを追加します。 jboss-deployment-structure.xmlデプロイメント記述子にエントリーを追加します。
手順3.1 MANIFEST.MF への依存関係設定の追加
MANIFEST.MF ファイルに必要な依存関係エントリーを作成できます。「Maven を使用した MANIFEST.MF エントリーの生成」を参照してください。
MANIFEST.MFファイルの追加プロジェクトにMANIFEST.MFファイルがない場合、MANIFEST.MFというファイルを作成します。Web アプリケーション (WAR) では、このファイルをMETA-INFディレクトリーに追加します。EJB アーカイブ (JAR) では、META-INFディレクトリーに追加します。依存関係エントリーの追加
依存関係モジュール名をコンマで区切り、依存関係エントリーをMANIFEST.MFファイルへ追加します。Dependencies: org.javassist, org.apache.velocity
Dependencies: org.javassist, org.apache.velocityCopy to Clipboard Copied! Toggle word wrap Toggle overflow 任意設定: 依存関係を任意にする
依存関係エントリーのモジュール名にoptionalを付けると、依存関係を任意にすることができます。Dependencies: org.javassist optional, org.apache.velocity
Dependencies: org.javassist optional, org.apache.velocityCopy to Clipboard Copied! Toggle word wrap Toggle overflow 任意設定: 依存関係のエクスポート
依存関係エントリーのモジュール名にexportを付けると、依存関係をエクスポートすることができます。Dependencies: org.javassist, org.apache.velocity export
Dependencies: org.javassist, org.apache.velocity exportCopy to Clipboard Copied! Toggle word wrap Toggle overflow
手順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>
<jboss-deployment-structure> </jboss-deployment-structure>Copy to Clipboard Copied! Toggle word wrap Toggle overflow Web アプリケーション (WAR) では、このファイルをWEB-INFディレクトリーに追加します。EJB アーカイブ (JAR) では、META-INFディレクトリーに追加します。依存関係セクションの追加
<deployment>要素をドキュメントルート内に作成し、その中に<dependencies>要素を作成します。モジュール要素の追加
依存関係ノード内に各モジュールの依存性に対するモジュール要素を追加します。name属性をモジュールの名前に設定します。<module name="org.javassist" />
<module name="org.javassist" />Copy to Clipboard Copied! Toggle word wrap Toggle overflow 任意設定: 依存関係を任意にする
値がTRUEのモジュールエントリーにoptional属性を追加すると依存関係を任意にすることができます。この属性のデフォルト値はFALSEです。<module name="org.javassist" optional="TRUE" />
<module name="org.javassist" optional="TRUE" />Copy to Clipboard Copied! Toggle word wrap Toggle overflow 任意設定: 依存関係のエクスポート
値がTRUEのモジュールエントリーにexport属性を追加すると、依存関係をエクスポートできます。この属性のデフォルト値はFALSEです。<module name="org.javassist" export="TRUE" />
<module name="org.javassist" export="TRUE" />Copy to Clipboard Copied! Toggle word wrap Toggle overflow
例3.3 2 つの依存関係を持つ jboss-deployment-structure.xml
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 EAP 6 に含まれる静的モジュールの一覧は、「含まれるモジュール」を参照してください。モジュールが別のデプロイメントにある場合は、「動的モジュールの名前付け」を参照してモジュール名を判断してください。
手順3.3 モジュール依存関係が含まれる MANIFEST.MF ファイルの生成
設定の追加
プロジェクトのpom.xmlファイルにあるパッケージングプラグイン設定に次の設定を追加します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow 依存関係の一覧表示
モジュール依存関係の一覧を<Dependencies>要素に追加します。MANIFEST.MFに依存関係を追加する時と同じ形式を使用します。この形式に関する詳細は、「デプロイメントへの明示的なモジュール依存性の追加」を参照してください。<Dependencies>org.javassist, org.apache.velocity</Dependencies>
<Dependencies>org.javassist, org.apache.velocity</Dependencies>Copy to Clipboard Copied! Toggle word wrap Toggle overflow プロジェクトの構築
Maven アセンブリーゴールを用いたプロジェクトの構築mvn assembly:assembly
[Localhost ]$ mvn assembly:assemblyCopy to Clipboard Copied! Toggle word wrap Toggle overflow
MANIFEST.MF ファイルが最終アーカイブに含まれます。
例3.4 pom.xml の設定されたモジュール依存関係
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>
<jboss-deployment-structure> </jboss-deployment-structure>Copy to Clipboard Copied! Toggle word wrap Toggle overflow Web アプリケーション (WAR) では、このファイルをWEB-INFに追加します。EJB アーカイブ (JAR) では、META-INFディレクトリーに追加します。 <deployment>要素をドキュメントルート内に作成し、その中に<exclusions>要素を作成します。<deployment> <exclusions> </exclusions> </deployment>
<deployment> <exclusions> </exclusions> </deployment>Copy to Clipboard Copied! Toggle word wrap Toggle overflow - exclusions 要素内で、除外される各モジュールに対して
<module>要素を追加します。name属性をモジュールの名前に設定します。<module name="org.javassist" />
<module name="org.javassist" />Copy to Clipboard Copied! Toggle word wrap Toggle overflow
例3.5 2 つのモジュールの除外
3.5. サブシステムをデプロイメントから除外する リンクのコピーリンクがクリップボードにコピーされました!
ここではサブシステムをデプロイメントより除外するために必要な手順について説明します。jboss-deployment-structure.xml 設定ファイルを編集します。サブシステムの除外はサブシステムの削除と同じ影響がありますが、1 つのデプロイメントのみに適用されます。
手順3.5 サブシステムの除外
- テキストエディターで
jboss-deployment-structure.xmlファイルを開きます。 - 次の XML を <deployment> タグの中に追加します。
<exclude-subsystems> <subsystem name="SUBSYSTEM_NAME" /> </exclude-subsystems>
<exclude-subsystems> <subsystem name="SUBSYSTEM_NAME" /> </exclude-subsystems>Copy to Clipboard Copied! Toggle word wrap Toggle overflow jboss-deployment-structure.xmlファイルを保存します。
サブシステムが除外されます。サブシステムのデプロイメントユニットプロセッサがデプロイメント上で実行されないようになります。
例3.6 jboss-deployment-structure.xml ファイルの例
3.6. デプロイメントでのプログラムを用いたクラスローダーの使用 リンクのコピーリンクがクリップボードにコピーされました!
3.6.1. デプロイメントでのプログラムによるクラスおよびリソースのロード リンクのコピーリンクがクリップボードにコピーされました!
- Class.forName() メソッドを使用したクラスのロード
Class.forName()メソッドを使用すると、プログラムでクラスをロードおよび初期化できます。このメソッドは 2 つのシグネチャーを持ちます。プログラムでクラスをロードする場合、3 つの引数のシグネチャーを用いる方法が推奨されます。このシグネチャーを使用すると、ロード時に目的のクラスを初期化するかどうかを制御できます。また、JVM はコールスタックをチェックして、使用するクラスローダーを判断する必要がないため、クラスローダーの取得および提供がより効率的になります。コードが含まれるクラスの名前が- Class.forName(String className)
- このシグネチャーは、1 つのパラメーター (ロードする必要があるクラスの名前) のみを取ります。このメソッドシグネチャーを使用すると、現在のクラスのクラスローダーによってクラスがロードされ、デフォルトで新たにロードされたクラスが初期化されます。
- Class.forName(String className, boolean initialize, ClassLoader loader)
- このシグネチャーは、クラス名、クラスを初期化するかどうかを指定するブール値、およびクラスをロードする ClassLoader の 3 つのパラメーターを想定します。
CurrentClassである場合、Current.class.getClassLoader()メソッドを使用してクラスのクラスローダーを取得できます。以下は、ロードするクラスローダーを提供し、TargetClassクラスを初期化する例になります。例3.7 ロードするクラスローダーを提供し、TargetClass を初期化する
Class<?> targetClass = Class.forName("com.myorg.util.TargetClass", true, CurrentClass.class.getClassLoader());Class<?> targetClass = Class.forName("com.myorg.util.TargetClass", true, CurrentClass.class.getClassLoader());Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 名前ですべてのリソースを検索
- リソースの名前とパスが分かり、直接そのリソースをロードする場合、標準の JDK クラスまたは ClassLoader API を使用するのが最良の方法です。
- 単一リソースをロードする
- ご使用のクラスと同じディレクトリー、またはデプロイメントの他のクラスと同じディレクトリーにある単一のリソースをロードする場合は、
Class.getResourceAsStream()メソッドを使用できます。例3.8 デプロイメントの単一リソースをロードする
InputStream inputStream = CurrentClass.class.getResourceAsStream("targetResourceName");InputStream inputStream = CurrentClass.class.getResourceAsStream("targetResourceName");Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 単一リソースのすべてのインスタンスをロードする
- デプロイメントのクラスローダーが見える単一リソースのすべてのインスタンスをロードするには、
Class.getClassLoader().getResources(String resourceName)メソッドを使用します。resourceNameはリソースの完全修飾パスに置き換えます。このメソッドは、指定の名前でクラスローダーがアクセスできるリソースに対し、すべてのURLオブジェクトの列挙を返します。その後、URL の配列で繰り返し処理し、openStream()メソッドを使用して各ストリームを開くことができます。例3.9 リソースのすべてのインスタンスをロードし、結果で繰り返す
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注記
URL インスタンスはローカルストレージからロードされるため、openConnection()や他の関連メソッドを使用する必要はありません。ストリームの使用はより簡単で、できるだけコードが複雑にならないようにします。
- クラスローダーよりクラスファイルをロードする
- クラスがすでにロードされている場合は、以下の構文を使用して、そのクラスに対応するクラスファイルをロードできます。クラスがロードされていない場合は、クラスローダーを使用し、パスを変換する必要があります。
例3.10 すでにロードされたクラスのクラスファイルをロードする
InputStream inputStream = CurrentClass.class.getResourceAsStream(TargetClass.class.getSimpleName() + ".class");
InputStream inputStream = CurrentClass.class.getResourceAsStream(TargetClass.class.getSimpleName() + ".class");Copy to Clipboard Copied! Toggle word wrap Toggle overflow 例3.11 ロードされていないクラスのクラスファイルをロードする
String className = "com.myorg.util.TargetClass" InputStream inputStream = CurrentClass.class.getClassLoader().getResourceAsStream(className.replace('.', '/') + ".class");String className = "com.myorg.util.TargetClass" InputStream inputStream = CurrentClass.class.getClassLoader().getResourceAsStream(className.replace('.', '/') + ".class");Copy to Clipboard Copied! Toggle word wrap Toggle overflow
3.6.2. デプロイメントでのプログラムによるリソースの繰り返し リンクのコピーリンクがクリップボードにコピーされました!
MANIFEST.MF に追加する必要があります。
依存関係: org.jboss.modules
依存関係: org.jboss.modules
- デプロイメント内およびすべてのインポート内のリソースをリストする
- 場合によっては、正確なパスでリソースをルックアップできないことがあります。たとえば、正確なパスが分からなかったり、指定のパスで複数のファイルをチェックする必要がある場合などです。このような場合、JBoss Modules ライブラリーはすべてのデプロイメントを繰り返すための API を複数提供します。2 つのメソッドの 1 つを使用すると、デプロイメントでリソースを繰り返しできます。
- 単一のモジュールで見つかったすべてのリソースを繰り返す
ModuleClassLoader.iterateResources()メソッドは、このモジュールクラスローダー内のすべてのリソースを繰り返します。このメソッドは、検索を開始するディレクトリーの名前と、サブディレクトリーで再帰的に処理するかどうかを指定するブール値の 2 つの引数を取ります。以下の例は、ModuleClassLoader の取得方法と、bin/ディレクトリーにあるリソースのイテレーターの取得方法 (サブディレクトリーを再帰的に検索) を示しています。取得されたイテレーターは、一致した各リソースをチェックし、名前とサイズのクエリー (可能な場合) を行うために使用できます。また、読み取り可能ストリームを開いたり、リソースの URL を取得するために使用できます。例3.12 サブディレクトリーを再帰的に検索し、bin ディレクトリーのリソースを検索
ModuleClassLoader moduleClassLoader = (ModuleClassLoader) TargetClass.class.getClassLoader(); Iterator<Resource> mclResources = moduleClassLoader.iterateResources("bin",true);ModuleClassLoader moduleClassLoader = (ModuleClassLoader) TargetClass.class.getClassLoader(); Iterator<Resource> mclResources = moduleClassLoader.iterateResources("bin",true);Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 単一モジュールで見つかったすべてのリソースとインポートされたリソースを繰り返す
Module.iterateResources()メソッドは、このモジュール内のすべてのリソース (モジュールにインポートされたリソースを含む) を繰り返します。このメソッドは、前述のメソッドよりもはるかに大きなセットを返します。このメソッドには、特定パターンの結果を絞り込むフィルターである引数が必要になります。この代わりに、PathFilters.acceptAll() を指定してセット全体を返すことも可能です。例3.13 このモジュールで、インポートを含むすべてのリソースを検索
ModuleClassLoader moduleClassLoader = (ModuleClassLoader) TargetClass.class.getClassLoader(); Module module = moduleClassLoader.getModule(); Iterator<Resource> moduleResources = module.iterateResources(PathFilters.acceptAll());
ModuleClassLoader moduleClassLoader = (ModuleClassLoader) TargetClass.class.getClassLoader(); Module module = moduleClassLoader.getModule(); Iterator<Resource> moduleResources = module.iterateResources(PathFilters.acceptAll());Copy to Clipboard Copied! Toggle word wrap Toggle overflow
- パターンと一致するすべてのリソースを検索する
- デプロイメント内またはデプロイメントの完全なインポートセット内で特定のリソースのみを見つける必要がある場合は、リソースの繰り返しをフィルターする必要があります。JBoss Modules のフィルター API には、リソースの繰り返しをフィルターする複数のツールがあります。
- 依存関係の完全セットのチェック
- 依存関係の完全セットをチェックする必要がある場合、
Module.iterateResources()メソッドのPathFilterパラメーターを使用して、一致の各リソースの名前を確認できます。 - デプロイメント依存関係の確認
- デプロイメント内のみを検索する必要がある場合は、
ModuleClassLoader.iterateResources()メソッドを使用しますが、追加のメソッドを使用してイテレーターをフィルターする必要があります。PathFilters.filtered()メソッドは、リソースイテレーターのフィルターされたビューを提供できます。PathFiltersクラスには、さまざまな関数を実行するフィルターを作成する多くの静的メソッドが含まれています。これには、子パスや完全一致の検索、Ant 形式の glob パターンの一致などが含まれます。
- リソースのフィルターに関する追加コード例
- 以下の例は、異なる基準を基にリソースをフィルターする方法を示しています。
例3.14 デプロイメントで messages.properties という名前のファイルをすべて検索
ModuleClassLoader moduleClassLoader = (ModuleClassLoader) TargetClass.class.getClassLoader(); Iterator<Resource> mclResources = PathFilters.filtered(PathFilters.match("**/messages.properties"), moduleClassLoader.iterateResources("", true));ModuleClassLoader moduleClassLoader = (ModuleClassLoader) TargetClass.class.getClassLoader(); Iterator<Resource> mclResources = PathFilters.filtered(PathFilters.match("**/messages.properties"), moduleClassLoader.iterateResources("", true));Copy to Clipboard Copied! Toggle word wrap Toggle overflow 例3.15 デプロイメントおよびインポートで messages.properties という名前のファイルをすべて検索
ModuleClassLoader moduleClassLoader = (ModuleClassLoader) TargetClass.class.getClassLoader(); Module module = moduleClassLoader.getModule(); Iterator<Resource> moduleResources = module.iterateResources(PathFilters.match("**/message.properties));ModuleClassLoader moduleClassLoader = (ModuleClassLoader) TargetClass.class.getClassLoader(); Module module = moduleClassLoader.getModule(); Iterator<Resource> moduleResources = module.iterateResources(PathFilters.match("**/message.properties));Copy to Clipboard Copied! Toggle word wrap Toggle overflow 例3.16 デプロイメントで my-resources という名前のディレクトリー内にあるすべてのファイルを検索
ModuleClassLoader moduleClassLoader = (ModuleClassLoader) TargetClass.class.getClassLoader(); Iterator<Resource> mclResources = PathFilters.filtered(PathFilters.match("**/my-resources/**"), moduleClassLoader.iterateResources("", true));ModuleClassLoader moduleClassLoader = (ModuleClassLoader) TargetClass.class.getClassLoader(); Iterator<Resource> mclResources = PathFilters.filtered(PathFilters.match("**/my-resources/**"), moduleClassLoader.iterateResources("", true));Copy to Clipboard Copied! Toggle word wrap Toggle overflow 例3.17 デプロイメントおよびインポートで message または errors という名前のファイルをすべて検索
ModuleClassLoader moduleClassLoader = (ModuleClassLoader) TargetClass.class.getClassLoader(); Module module = moduleClassLoader.getModule(); Iterator<Resource> moduleResources = module.iterateResources(PathFilters.any(PathFilters.match("**/messages"), PathFilters.match("**/errors"));ModuleClassLoader moduleClassLoader = (ModuleClassLoader) TargetClass.class.getClassLoader(); Module module = moduleClassLoader.getModule(); Iterator<Resource> moduleResources = module.iterateResources(PathFilters.any(PathFilters.match("**/messages"), PathFilters.match("**/errors"));Copy to Clipboard Copied! Toggle word wrap Toggle overflow 例3.18 デプロイメントで特定パッケージにあるすべてのファイルを検索
ModuleClassLoader moduleClassLoader = (ModuleClassLoader) TargetClass.class.getClassLoader(); Iterator<Resource> mclResources = moduleClassLoader.iterateResources("path/form/of/packagename", false);ModuleClassLoader moduleClassLoader = (ModuleClassLoader) TargetClass.class.getClassLoader(); Iterator<Resource> mclResources = moduleClassLoader.iterateResources("path/form/of/packagename", false);Copy to Clipboard Copied! Toggle word wrap Toggle overflow
3.7. クラスローディングとサブデプロイメント リンクのコピーリンクがクリップボードにコピーされました!
3.7.1. エンタープライズアーカイブのモジュールおよびクラスロード リンクのコピーリンクがクリップボードにコピーされました!
- 各 WAR および EJB JAR サブデプロイメントはモジュールです。
- EAR アーカイブのルートにある
lib/ディレクトリーの内容はモジュールです。これは、親モジュールと呼ばれます。
- WAR サブデプロイメントでは、親モジュールとすべての EJB JAR サブデプロイメントに暗黙的な依存関係が存在します。
- EJB JAR サブデプロイメントでは、親モジュールと他のすべての EJB JAR サブデプロイメントに暗黙的な依存関係が存在します。
重要
MANIFEST.MF ファイルの Class-Path エントリーとして明示的に宣言されている場合を除き、移植可能なアプリケーションがお互いにアクセスできるサブデプロイメントに依存しないことが推奨されます。
3.7.2. サブデプロイメントクラスローダーの分離 リンクのコピーリンクがクリップボードにコピーされました!
3.7.3. EAR 内のサブデプロイメントクラスローダーの分離を無効化する リンクのコピーリンクがクリップボードにコピーされました!
重要
デプロイメント記述子ファイルの追加
jboss-deployment-structure.xmlデプロイメント記述子ファイルが存在しない場合は EAR のMETA-INFディレクトリーへ追加し、次の内容を追加します。<jboss-deployment-structure> </jboss-deployment-structure>
<jboss-deployment-structure> </jboss-deployment-structure>Copy to Clipboard Copied! Toggle word wrap Toggle overflow <ear-subdeployments-isolated>要素の追加<ear-subdeployments-isolated>要素が存在しない場合はjboss-deployment-structure.xmlファイルへ追加し、内容がfalseとなるようにします。<ear-subdeployments-isolated>false</ear-subdeployments-isolated>
<ear-subdeployments-isolated>false</ear-subdeployments-isolated>Copy to Clipboard Copied! Toggle word wrap Toggle overflow
この EAR デプロイメントに対してサブデプロイメントクラスローダーの分離が無効になります。そのため、EAR のサブデプロイメントは WAR ではないサブデプロイメントごとに自動的な依存関係を持ちます。
3.8. 参考資料 リンクのコピーリンクがクリップボードにコピーされました!
3.8.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.8.2. 含まれるモジュール リンクのコピーリンクがクリップボードにコピーされました!
asm.asmch.qos.cal10ncom.google.guavacom.h2database.h2com.sun.jsf-implcom.sun.jsf-implcom.sun.xml.bindcom.sun.xml.messaging.saajgnu.getoptjavaee.apijavax.activation.apijavax.annotation.apijavax.apijavax.ejb.apijavax.el.apijavax.enterprise.apijavax.enterprise.deploy.apijavax.faces.apijavax.faces.apijavax.inject.apijavax.interceptor.apijavax.jms.apijavax.jws.apijavax.mail.apijavax.management.j2ee.apijavax.persistence.apijavax.resource.apijavax.rmi.apijavax.security.auth.message.apijavax.security.jacc.apijavax.servlet.apijavax.servlet.jsp.apijavax.servlet.jstl.apijavax.transaction.apijavax.validation.apijavax.ws.rs.apijavax.wsdl4j.apijavax.xml.bind.apijavax.xml.jaxp-providerjavax.xml.registry.apijavax.xml.rpc.apijavax.xml.soap.apijavax.xml.stream.apijavax.xml.ws.apijlinenet.sourceforge.cssparsernet.sourceforge.htmlunitnet.sourceforge.nekohtmlnu.xomorg.antlrorg.apache.antorg.apache.commons.beanutilsorg.apache.commons.cliorg.apache.commons.codecorg.apache.commons.collectionsorg.apache.commons.ioorg.apache.commons.langorg.apache.commons.loggingorg.apache.commons.poolorg.apache.cxforg.apache.httpcomponentsorg.apache.james.mime4jorg.apache.log4jorg.apache.neethiorg.apache.santuario.xmlsecorg.apache.velocityorg.apache.ws.scoutorg.apache.ws.securityorg.apache.ws.xmlschemaorg.apache.xalanorg.apache.xercesorg.apache.xml-resolverorg.codehaus.jackson.jackson-core-aslorg.codehaus.jackson.jackson-jaxrsorg.codehaus.jackson.jackson-mapper-aslorg.codehaus.jackson.jackson-xcorg.codehaus.woodstoxorg.dom4jorg.hibernateorg.hibernate.enversorg.hibernate.infinispanorg.hibernate.validatororg.hornetqorg.hornetq.raorg.infinispanorg.infinispan.cachestore.jdbcorg.infinispan.cachestore.remoteorg.infinispan.client.hotrodorg.jacorborg.javassistorg.jaxenorg.jboss.as.aggregateorg.jboss.as.appclientorg.jboss.as.cliorg.jboss.as.clustering.apiorg.jboss.as.clustering.commonorg.jboss.as.clustering.ejb3.infinispanorg.jboss.as.clustering.implorg.jboss.as.clustering.infinispanorg.jboss.as.clustering.jgroupsorg.jboss.as.clustering.serviceorg.jboss.as.clustering.singletonorg.jboss.as.clustering.web.infinispanorg.jboss.as.clustering.web.spiorg.jboss.as.cmporg.jboss.as.connectororg.jboss.as.consoleorg.jboss.as.controllerorg.jboss.as.controller-clientorg.jboss.as.deployment-repositoryorg.jboss.as.deployment-scannerorg.jboss.as.domain-add-userorg.jboss.as.domain-http-error-contextorg.jboss.as.domain-http-interfaceorg.jboss.as.domain-managementorg.jboss.as.eeorg.jboss.as.ee.deploymentorg.jboss.as.ejb3org.jboss.as.embeddedorg.jboss.as.host-controllerorg.jboss.as.jacorborg.jboss.as.jaxrorg.jboss.as.jaxrsorg.jboss.as.jdrorg.jboss.as.jmxorg.jboss.as.jpaorg.jboss.as.jpa.hibernateorg.jboss.as.jpa.hibernateorg.jboss.as.jpa.hibernate.infinispanorg.jboss.as.jpa.openjpaorg.jboss.as.jpa.spiorg.jboss.as.jpa.utilorg.jboss.as.jsr77org.jboss.as.loggingorg.jboss.as.mailorg.jboss.as.management-client-contentorg.jboss.as.messagingorg.jboss.as.modclusterorg.jboss.as.namingorg.jboss.as.networkorg.jboss.as.osgiorg.jboss.as.platform-mbeanorg.jboss.as.pojoorg.jboss.as.process-controllerorg.jboss.as.protocolorg.jboss.as.remotingorg.jboss.as.sarorg.jboss.as.securityorg.jboss.as.serverorg.jboss.as.standaloneorg.jboss.as.threadsorg.jboss.as.transactionsorg.jboss.as.weborg.jboss.as.webservicesorg.jboss.as.webservices.server.integrationorg.jboss.as.webservices.server.jaxrpc-integrationorg.jboss.as.weldorg.jboss.as.xtsorg.jboss.classfilewriterorg.jboss.com.sun.httpserverorg.jboss.common-coreorg.jboss.dmrorg.jboss.ejb-clientorg.jboss.ejb3org.jboss.iiop-clientorg.jboss.integration.ext-contentorg.jboss.interceptororg.jboss.interceptor.spiorg.jboss.invocationorg.jboss.ironjacamar.apiorg.jboss.ironjacamar.implorg.jboss.ironjacamar.jdbcadaptersorg.jboss.jandexorg.jboss.jaxbintrosorg.jboss.jboss-transaction-spiorg.jboss.jsfunit.coreorg.jboss.jtsorg.jboss.jts.integrationorg.jboss.loggingorg.jboss.logmanagerorg.jboss.logmanager.log4jorg.jboss.marshallingorg.jboss.marshalling.riverorg.jboss.metadataorg.jboss.modulesorg.jboss.mscorg.jboss.nettyorg.jboss.osgi.deploymentorg.jboss.osgi.frameworkorg.jboss.osgi.resolverorg.jboss.osgi.spiorg.jboss.osgi.vfsorg.jboss.remoting3org.jboss.resteasy.resteasy-atom-providerorg.jboss.resteasy.resteasy-cdiorg.jboss.resteasy.resteasy-jackson-providerorg.jboss.resteasy.resteasy-jaxb-providerorg.jboss.resteasy.resteasy-jaxrsorg.jboss.resteasy.resteasy-jsapiorg.jboss.resteasy.resteasy-multipart-providerorg.jboss.saslorg.jboss.security.negotiationorg.jboss.security.xacmlorg.jboss.shrinkwrap.coreorg.jboss.staxmapperorg.jboss.stdioorg.jboss.threadsorg.jboss.vfsorg.jboss.weld.apiorg.jboss.weld.coreorg.jboss.weld.spiorg.jboss.ws.apiorg.jboss.ws.commonorg.jboss.ws.cxf.jbossws-cxf-clientorg.jboss.ws.cxf.jbossws-cxf-factoriesorg.jboss.ws.cxf.jbossws-cxf-serverorg.jboss.ws.cxf.jbossws-cxf-transports-httpserverorg.jboss.ws.jaxws-clientorg.jboss.ws.jaxws-jboss-httpserver-httpspiorg.jboss.ws.native.jbossws-native-coreorg.jboss.ws.native.jbossws-native-factoriesorg.jboss.ws.native.jbossws-native-servicesorg.jboss.ws.saaj-implorg.jboss.ws.spiorg.jboss.ws.tools.commonorg.jboss.ws.tools.wsconsumeorg.jboss.ws.tools.wsprovideorg.jboss.xborg.jboss.xnioorg.jboss.xnio.nioorg.jboss.xtsorg.jdomorg.jgroupsorg.joda.timeorg.junitorg.omg.apiorg.osgi.coreorg.picketboxorg.picketlinkorg.python.jython.standaloneorg.scannotation.scannotationorg.slf4jorg.slf4j.extorg.slf4j.implorg.slf4j.jcl-over-slf4jorg.w3c.css.sacsun.jdk
3.8.3. JBoss デプロイメント構造のデプロイメント記述子 リンクのコピーリンクがクリップボードにコピーされました!
- 明示的なモジュール依存関係を定義する。
- 特定の暗黙的な依存関係がロードされないようにする。
- デプロイメントのリソースより追加モジュールを定義する。
- EAR デプロイメントのサブデプロイメント分離の挙動を変更する。
- EAR のモジュールに追加のリソースルートを追加する。
第4章 グローバル値 リンクのコピーリンクがクリップボードにコピーされました!
4.1. バルブ リンクのコピーリンクがクリップボードにコピーされました!
4.2. グローバルバルブ リンクのコピーリンクがクリップボードにコピーされました!
4.3. オーセンティケーターバルブ リンクのコピーリンクがクリップボードにコピーされました!
org.apache.catalina.authenticator.AuthenticatorBase のサブクラスで、authenticate() メソッドを上書きします。
4.4. Web アプリケーションがバルブを使用するよう設定 リンクのコピーリンクがクリップボードにコピーされました!
jboss-web.xml デプロイメント記述子で設定する必要があります。
重要
要件
- バルブを作成し、アプリケーションのクラスパスに含める必要があります。これには、バルブがアプリケーションの WAR ファイルまたは依存関係として追加されたモジュールに含まれるようにします。このようなモジュールの例には、サーバーにインストールされた静的モジュールや EAR アーカイブの
lib/ディレクトリーにある JAR ファイル (WAR が EAR でデプロイされる場合) があります。 - アプリケーションに
jboss-web.xmlデプロイメント記述子が含まれる必要があります。
手順4.1 ローカルバルブ用にアプリケーションを設定
バルブ要素の追加
name と class-name の属性を使用してバルブ要素をアプリケーションのjboss-web.xmlファイルに追加します。name は、バルブの一意の ID であり、class-name はバルブクラスの名前です。<valve> <class-name>VALVECLASSNAME</class-name> </valve><valve> <class-name>VALVECLASSNAME</class-name> </valve>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 特定のパラメーター
バルブでパラメーターを設定できる場合は、各パラメーターのバルブ要素にparam子要素を追加し、それぞれに名前と値を指定します。<param name="PARAMNAME" value = "VALUE" />
<param name="PARAMNAME" value = "VALUE" />Copy to Clipboard Copied! Toggle word wrap Toggle overflow
例4.1 jboss-web.xml バルブ設定
<valve>
<class-name="org.jboss.samplevalves.restrictedUserAgentsValve">
<param name="restricteduseragents" value = "^.*MS Web Services Client Protocol.*$" />
</valve>
<valve>
<class-name="org.jboss.samplevalves.restrictedUserAgentsValve">
<param name="restricteduseragents" value = "^.*MS Web Services Client Protocol.*$" />
</valve>
4.5. Web アプリケーションがオーセンティケーターバルブを使用するよう設定 リンクのコピーリンクがクリップボードにコピーされました!
web.xml デプロイメント記述子を設定する必要があります。最も単純なケースでは、web.xml 設定は BASIC 認証を使用した場合と同じです。ただし、of login-config の auth-method 子要素は、設定を実行するバルブの名前に設定されます。
要件
- 認証バルブがすでに作成されている必要があります。
- 認証バルブがグローバルバルブの場合、認証バルブはすでにインストールおよび設定されている必要があります。また、設定された名前を知っている必要があります。
- アプリケーションが使用するセキュリティーレルムのレルム名を知っている必要があります。
手順4.2 アプリケーションがオーセンティケーターバルブを使用するよう設定
バルブの設定
ローカルバルブを使用する場合は、jboss-web.xmlデプロイメント記述子で設定する必要があります。「Web アプリケーションがバルブを使用するよう設定」を参照してください。グローバルバルブを使用する場合、これは不必要です。セキュリティー設定を web.xml に追加
security-constraint、login-config、security-role などの標準的な要素を使用して、セキュリティー設定をアプリケーションの web.xml ファイルに追加します。login-config 要素で、auth-method の値をオーセンティケーターバルブの名前に設定します。また、realm-name 要素を、アプリケーションが使用している JBoss セキュリティーレルムの名前に設定する必要があります。<login-config> <auth-method>VALVE_NAME</auth-method> <realm-name>REALM_NAME</realm-name> </login-config>
<login-config> <auth-method>VALVE_NAME</auth-method> <realm-name>REALM_NAME</realm-name> </login-config>Copy to Clipboard Copied! Toggle word wrap Toggle overflow
4.6. カスタムバルブの作成 リンクのコピーリンクがクリップボードにコピーされました!
手順4.3 カスタムバルブの作成
バルブクラスの作成
org.apache.catalina.valves.ValveBaseのサブクラスを作成します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow 呼び出しメソッドの実装
invoke()メソッドは、このバルブがパイプラインで実行されるときに呼び出されます。要求オブジェクトと応答オブジェクトはパラメーターとして渡されます。ここで、要求と応答の処理と変更を行います。public void invoke(Request request, Response response) { }public void invoke(Request request, Response response) { }Copy to Clipboard Copied! Toggle word wrap Toggle overflow 次のパイプラインステップの呼び出し
呼び出しメソッドが最後に実行する必要があることはパイプラインの次のステップを呼び出し、変更された要求オブジェクトと応答オブジェクトを渡すことです。これは、getNext().invoke()メソッドを使用して行われます。getNext().invoke(request, response);
getNext().invoke(request, response);Copy to Clipboard Copied! Toggle word wrap Toggle overflow 任意の設定: パラメーターの指定
バルブを設定可能にする必要がある場合は、パラメーターを追加してこれを有効にします。これは、インスタンス変数と各パラメーターに対するセッターを追加して行います。Copy to Clipboard Copied! Toggle word wrap Toggle overflow
例4.2 カスタムバルブの例
第5章 開発者向けのロギング リンクのコピーリンクがクリップボードにコピーされました!
5.1. はじめに リンクのコピーリンクがクリップボードにコピーされました!
5.1.1. ロギング リンクのコピーリンクがクリップボードにコピーされました!
5.1.2. JBoss LogManager でサポートされるアプリケーションロギングフレームワーク リンクのコピーリンクがクリップボードにコピーされました!
- JBoss Logging - JBoss EAP 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
5.1.3. ログレベル リンクのコピーリンクがクリップボードにコピーされました!
TRACE、DEBUG、INFO、WARN、ERROR および FATAL となります。
WARN レベルのログハンドラーは、WARN、ERROR、および FATAL のレベルのメッセージのみを記録します。
5.1.4. サポートされているログレベル リンクのコピーリンクがクリップボードにコピーされました!
| ログレベル | 値 | 説明 |
|---|---|---|
| FINEST | 300 |
-
|
| FINER | 400 |
-
|
| TRACE | 400 |
アプリケーションの実行状態に関する詳細情報を提供するメッセージに使用します。通常、
TRACE のログメッセージはアプリケーションのデバッグ時のみにキャプチャーされます。
|
| DEBUG | 500 |
アプリケーションの個別の要求または活動の進捗状況を表示するメッセージに使用します。
DEBUG のログメッセージは通常アプリケーションのデバッグ時のみにキャプチャーされます。
|
| FINE | 500 |
-
|
| CONFIG | 700 |
-
|
| INFO | 800 |
アプリケーションの全体的な進捗状況を示すメッセージに使用します。多くの場合、アプリケーションの起動、シャットダウン、およびその他の主要なライフサイクルイベントに使用されます。
|
| WARN | 900 |
エラーではないが、理想的とは見なされない状況を示すために使用されます。将来的にエラーをもたらす可能性のある状況を示します。
|
| WARNING | 900 |
-
|
| ERROR | 1000 |
発生したエラーの中で、現在の活動や要求の完了を妨げる可能性があるが、アプリケーション実行の妨げにはならないエラーを表示するために使用されます。
|
| SEVERE | 1000 |
-
|
| FATAL | 1100 |
クリティカルなサービス障害やアプリケーションのシャットダウンをもたらしたり、JBoss EAP 6 のシャットダウンを引き起こす可能性があるイベントを表示するのに使用します。
|
5.1.5. デフォルトのログファイルの場所 リンクのコピーリンクがクリップボードにコピーされました!
| ログファイル | 説明 |
|---|---|
EAP_HOME/standalone/log/server.log |
サーバーログ。サーバー起動メッセージなど、すべてのサーバーログメッセージが含まれます。
|
| ログファイル | 説明 |
|---|---|
EAP_HOME/domain/log/host-controller.log |
ホストコントローラーのブートログ。ホストコントローラーの起動に関連するログメッセージが含まれます。
|
EAP_HOME/domain/log/process-controller.log |
プロセスコントローラーのブートログ。プロセスコントローラーの起動に関連するログメッセージが含まれます。
|
EAP_HOME/domain/servers/SERVERNAME/log/server.log |
名前付きサーバーのサーバーログ。サーバー起動メッセージなど、そのサーバーのすべてのログメッセージが含まれます。
|
5.2. JBoss ロギングフレームワークを用いたロギング リンクのコピーリンクがクリップボードにコピーされました!
5.2.1. JBoss Logging リンクのコピーリンクがクリップボードにコピーされました!
5.2.2. JBoss Logging の機能 リンクのコピーリンクがクリップボードにコピーされました!
- 革新的かつ使いやすい「型指定された」ロガーを提供します。
- 国際化および現地化を完全サポートします。翻訳者はプロパティーファイルのメッセージバンドルを使用します。開発者はインターフェースやアノテーションを使用できます。
- 実稼働向けにはビルド時に型指定されたロガーを生成し、開発向けにはランタイムで型指定されたロガーを生成するツールです。
5.2.3. JBoss Logging を使用したアプリケーションへのロギングの追加 リンクのコピーリンクがクリップボードにコピーされました!
org.jboss.logging.Logger) を作成し、そのオブジェクトの適切なメソッドを呼び出します。このタスクは、アプリケーションにこのオブジェクトのサポートを追加するために必要な手順を示しています。
要件
- ビルドシステムとして Maven を使用している場合は、JBoss Maven リポジトリーを含めるようプロジェクトが設定されている必要があります。「Maven 設定を使用した JBoss EAP 6 Maven リポジトリーの設定」を参照してください。
- JBoss Logging JAR ファイルがアプリケーションのビルドパスに指定されている必要があります。これを行う方法は、アプリケーションのビルドに JBoss Developer Studio を使用するか、または Maven を使用するかによって異なります。
- JBoss Developer Studio を使用してビルドする場合は、JBoss Developer Studio メニューから Project -> Properties を選択し、Targeted Runtimes を選択して、JBoss EAP 6 のランタイムがチェックされていることを確認します。
- Maven を使用してビルドする場合、次の依存関係設定をプロジェクトの
pom.xmlファイルに追加します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow
JAR は、JBoss EAP 6 がデプロイされたアプリケーションに提供するため、ビルドされたアプリケーションに含める必要はありません。
インポートの追加
使用する JBoss Logging クラスネームスペースに対して import ステートメントを追加します。少なくとも、import org.jboss.logging.Loggerをインポートする必要があります。import org.jboss.logging.Logger;
import org.jboss.logging.Logger;Copy to Clipboard Copied! Toggle word wrap Toggle overflow Logger オブジェクトの作成
org.jboss.logging.Loggerのインスタンスを作成し、静的メソッドLogger.getLogger(Class)を呼び出して初期化します。各クラスに対してこれを単一のインスタンス変数として作成することが推奨されます。private static final Logger LOGGER = Logger.getLogger(HelloWorld.class);
private static final Logger LOGGER = Logger.getLogger(HelloWorld.class);Copy to Clipboard Copied! Toggle word wrap Toggle overflow ロギングメッセージの追加
Loggerオブジェクトのメソッドへの呼び出しを、ログメッセージを送信するコードに追加します。Loggerオブジェクトには、異なるタイプのメッセージ向けの、さまざまなパラメーターを持つさまざまなメソッドが含まれます。最も使用しやすいものは次のとおりです。debug(Object message)info(Object message)error(Object message)trace(Object message)fatal(Object message)これらのメソッドは、対応するログレベルとmessageパラメーターを文字列として持つログメッセージを送信します。LOGGER.error("Configuration file not found.");LOGGER.error("Configuration file not found.");Copy to Clipboard Copied! Toggle word wrap Toggle overflow JBoss Logging メソッドの完全なリストについては、JBoss EAP 6 API ドキュメンテーションのorg.jboss.loggingパッケージを参照してください。
例5.1 プロパティーファイルを開くときに JBoss Logging を使用
5.3. ロギングプロファイル リンクのコピーリンクがクリップボードにコピーされました!
5.3.1. ロギングプロファイル リンクのコピーリンクがクリップボードにコピーされました!
重要
- 一意の名前 (必須)
- ログハンドラー (数に制限なし)
- ログカテゴリー (数に制限なし)
- ルートロガー (1 つまで)
重要
5.3.2. アプリケーションにおけるロギングプロファイルの指定 リンクのコピーリンクがクリップボードにコピーされました!
MANIFEST.MF ファイルに指定します。
前提条件
- サーバー上に設定されたロギングプロファイルの名前を認識している必要があります。使用するプロファイルの名前についてはサーバー管理者に問い合わせてください。
手順5.1 ロギングプロファイル設定をアプリケーションへ追加
MANIFEST.MFの編集アプリケーションにMANIFEST.MFファイルがない場合は、以下の内容が含まれるファイルを作成します。NAME は必要なプロファイル名に置き換えてください。Manifest-Version: 1.0 Logging-Profile: NAMEManifest-Version: 1.0 Logging-Profile: NAMECopy to Clipboard Copied! Toggle word wrap Toggle overflow アプリケーションにMANIFEST.MFファイルがある場合は、以下の行を追加し、NAME を必要なプロファイル名に置き換えます。Logging-Profile: NAME
Logging-Profile: NAMECopy to Clipboard Copied! Toggle word wrap Toggle overflow
注記
maven-war-plugin を使用している場合、MANIFEST.MF ファイルを src/main/resources/META-INF/ に置き、次の設定を pom.xml ファイルに追加できます。
第6章 国際化と現地語化 リンクのコピーリンクがクリップボードにコピーされました!
6.1. はじめに リンクのコピーリンクがクリップボードにコピーされました!
6.1.1. 国際化 リンクのコピーリンクがクリップボードにコピーされました!
6.1.2. 多言語化 リンクのコピーリンクがクリップボードにコピーされました!
6.2. JBoss Logging Tools リンクのコピーリンクがクリップボードにコピーされました!
6.2.1. 概要 リンクのコピーリンクがクリップボードにコピーされました!
6.2.1.1. JBoss Logging Tools の国際化および現地語化 リンクのコピーリンクがクリップボードにコピーされました!
org.jboss.logging アノテーションが付けられたインターフェース内でメソッド定義として作成されます。JBoss ロギングがコンパイル時にインターフェースを実装するため、インターフェースを実装する必要はありません。定義すると、これらのメソッドを使用してコードでメッセージをログに記録したり、例外オブジェクトを取得することが可能です。
6.2.1.2. JBoss Logging Tools のクイックスタート リンクのコピーリンクがクリップボードにコピーされました!
logging-tools には、JBoss Logging Tools の機能を実証する単純な Maven プロジェクトが含まれています。このクイックスタートは本書のコード例で幅広く使用されています。
6.2.1.3. メッセージロガー リンクのコピーリンクがクリップボードにコピーされました!
@org.jboss.logging.MessageLogger アノテーションが付けられます。
6.2.1.4. メッセージバンドル リンクのコピーリンクがクリップボードにコピーされました!
@org.jboss.logging.MessageBundle アノテーションが付けられます。
6.2.1.5. 国際化されたログメッセージ リンクのコピーリンクがクリップボードにコピーされました!
@LogMessage と @Message アノテーションを付ける必要があり、@Message の値属性を使用してログメッセージを指定しなければなりません。国際化されたログメッセージはプロパティーファイルに翻訳を提供するとローカライズされます。
6.2.1.6. 国際化された例外 リンクのコピーリンクがクリップボードにコピーされました!
6.2.1.7. 国際化されたメッセージ リンクのコピーリンクがクリップボードにコピーされました!
6.2.1.8. 翻訳プロパティーファイル リンクのコピーリンクがクリップボードにコピーされました!
6.2.1.9. JBoss Logging Tools のプロジェクトコード リンクのコピーリンクがクリップボードにコピーされました!
@MessageLogger アノテーションの projectCode 属性で定義されます。
6.2.1.10. JBoss Logging Tools のメッセージ ID リンクのコピーリンクがクリップボードにコピーされました!
@Message アノテーションの id 属性で定義されます。
6.2.2. 国際化されたロガー、メッセージ、例外の作成 リンクのコピーリンクがクリップボードにコピーされました!
6.2.2.1. 国際化されたログメッセージの作成 リンクのコピーリンクがクリップボードにコピーされました!
logging-tools クイックスタートを参照してください。
前提条件
- Maven プロジェクトがすでに存在している必要があります。「JBoss Logging ツールの Maven 設定」を参照してください。
- JBoss Logging Tools に必要な Maven 設定がプロジェクトにある必要があります。
手順6.1 国際化されたログメッセージバンドルの作成
メッセージロガーインターフェースの作成
ログメッセージの定義が含まれるように Java インターフェースをプロジェクトに追加します。定義されるログメッセージに対し、インターフェースにその内容を表す名前を付けます。ログメッセージインターフェースの要件は次のとおりです。@org.jboss.logging.MessageLoggerアノテーションが付けられていなければなりません。org.jboss.logging.BasicLoggerを拡張しなければなりません。- このインターフェースを実装する型付きロガーのフィールドをインターフェースが定義する必要があります。
org.jboss.logging.LoggerのgetMessageLogger()メソッドで定義します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow メソッド定義の追加
各ログメッセージのインターフェースにメソッド定義を追加します。ログメッセージに対する各メソッドにその内容を表す名前を付けます。各メソッドの要件は次のとおりです。- メソッドは
voidを返さなければなりません。 @org.jboss.logging.LogMessageアノテーションが付いていなければなりません。@org.jboss.logging.Messageアノテーションが付いていなければなりません。@org.jboss.logging.Messageの値属性にはデフォルトのログインメッセージが含まれます。翻訳がない場合にこのメッセージが使用されます。
@LogMessage @Message(value = "Customer query failed, Database not available.") void customerQueryFailDBClosed();
@LogMessage @Message(value = "Customer query failed, Database not available.") void customerQueryFailDBClosed();Copy to Clipboard Copied! Toggle word wrap Toggle overflow デフォルトのログレベルはINFOです。メソッドの呼び出し
メッセージがロギングされなければならない場所にコードのインターフェースメソッドへの呼び出しを追加します。プロジェクトがコンパイルされる時にアノテーションプロセッサーがインターフェースの実装を作成するため、インターフェースの実装を作成する必要はありません。AccountsLogger.LOGGER.customerQueryFailDBClosed();
AccountsLogger.LOGGER.customerQueryFailDBClosed();Copy to Clipboard Copied! Toggle word wrap Toggle overflow カスタムのロガーは BasicLogger よりサブクラス化されるため、BasicLoggerのロギングメソッド (debug()やerror()など) を使用することもできます。国際化されていないメッセージをログに記録するため、他のロガーを作成する必要はありません。AccountsLogger.LOGGER.error("Invalid query syntax.");AccountsLogger.LOGGER.error("Invalid query syntax.");Copy to Clipboard Copied! Toggle word wrap Toggle overflow
6.2.2.2. 国際化されたメッセージの作成と使用 リンクのコピーリンクがクリップボードにコピーされました!
logging-tools クイックスタートを参照してください。
要件
- JBoss EAP 6 のリポジトリーを使用する作業用の Maven プロジェクトが存在しなければなりません。「Maven 設定を使用した JBoss EAP 6 Maven リポジトリーの設定」 を参照してください。
- JBoss Logging ツールの必要な Maven 設定が追加されている必要があります。「JBoss Logging ツールの Maven 設定」 を参照してください。
手順6.2 国際化されたメッセージの作成と使用
例外のインターフェースの作成
JBoss Logging Tools はインターフェースで国際化されたメッセージを定義します。定義されるメッセージに対し、インターフェースに記述的な名前を付けます。インターフェースの要件は次のとおりです。- パブリックとして宣言される必要があります。
@org.jboss.logging.MessageBundleアノテーションが付けられていなければなりません。- インターフェースと同じ型のメッセージバンドルであるフィールドをインターフェースが定義する必要があります。
@MessageBundle(projectCode="") public interface GreetingMessageBundle { GreetingMessageBundle MESSAGES = Messages.getBundle(GreetingMessageBundle.class); }@MessageBundle(projectCode="") public interface GreetingMessageBundle { GreetingMessageBundle MESSAGES = Messages.getBundle(GreetingMessageBundle.class); }Copy to Clipboard Copied! Toggle word wrap Toggle overflow メソッド定義の追加
各メッセージのインターフェースにメソッド定義を追加します。メッセージに対する各メソッドに記述的な名前を付けます。各メソッドの要件は次のとおりです。- 型
Stringのオブジェクトを返す必要があります。 @org.jboss.logging.Messageアノテーションが付いていなければなりません。- デフォルトメッセージに
@org.jboss.logging.Messageの値属性が設定されていなければなりません。翻訳がない場合にこのメッセージが使用されます。
@Message(value = "Hello world.") String helloworldString();
@Message(value = "Hello world.") String helloworldString();Copy to Clipboard Copied! Toggle word wrap Toggle overflow 呼び出しメソッド
メッセージを取得する必要がある場所でアプリケーションのインターフェースメソッドを呼び出します。System.console.out.println(helloworldString());
System.console.out.println(helloworldString());Copy to Clipboard Copied! Toggle word wrap Toggle overflow
6.2.2.3. 国際化された例外の作成 リンクのコピーリンクがクリップボードにコピーされました!
logging-tools クイックスタートを参照してください。
手順6.3 国際化された例外の作成と使用
JBoss Logging Tools 設定の追加
JBoss Logging Tools をサポートするために必要なプロジェクト設定を追加します。「JBoss Logging ツールの Maven 設定」を参照してください。例外のインターフェースの作成
JBoss Logging Tools はインターフェースで国際化された例外を定義します。定義される例外に対し、インターフェースにその内容を表す名前を付けます。インターフェースの要件は次のとおりです。publicとして宣言される必要があります。@org.jboss.logging.MessageBundleアノテーションが付けられていなければなりません。- インターフェースと同じ型のメッセージバンドルであるフィールドをインターフェースが定義する必要があります。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow メソッド定義の追加
各例外のインターフェースにメソッド定義を追加します。例外に対する各メソッドにその内容を表す名前を付けます。各メソッドの要件は次のとおりです。- 型
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);
@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);Copy to Clipboard Copied! Toggle word wrap Toggle overflow 呼び出しメソッド
例外を取得する必要がある場所でコードのインターフェースメソッドを呼び出します。メソッドは例外をスローしませんが、スローできる例外オブジェクトを返します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow
6.2.3. 国際化されたロガー、メッセージ、例外の現地語化 リンクのコピーリンクがクリップボードにコピーされました!
6.2.3.1. Maven での新しい翻訳プロパティーファイルの作成 リンクのコピーリンクがクリップボードにコピーされました!
logging-tools クイックスタートを参照してください。
前提条件
- 作業用の Maven プロジェクトがすでに存在している必要があります。
- JBoss Logging Tools に対してプロジェクトが設定されていなければなりません。
- 国際化されたログメッセージや例外を定義する 1 つ以上のインターフェースがプロジェクトに含まれていなければなりません。
手順6.4 Maven での新しい翻訳プロパティーファイルの作成
Maven 設定の追加
-AgenereatedTranslationFilePathコンパイラー引数を Maven コンパイラープラグイン設定に追加し、新しいファイルが作成されるパスを割り当てます。Copy to Clipboard Copied! Toggle word wrap Toggle overflow 上記の設定は Maven プロジェクトのtarget/generated-translation-filesディレクトリーに新しいファイルを作成します。プロジェクトの構築
Maven を使用してプロジェクトを構築します。mvn compile
[Localhost]$ mvn compileCopy to Clipboard Copied! Toggle word wrap Toggle overflow
@MessageBundle または @MessageLogger アノテーションが付けられたインターフェースごとに 1 つのプロパティーファイルが作成されます。各インターフェースが宣言される Java パッケージに対応するサブディレクトリーに新しいファイルが作成されます。
InterfaceName.i18n_locale_COUNTRY_VARIANT.properties という構文を使用して名前が付けられます。InterfaceName は、このファイルが生成されたインターフェースの名前になります。
6.2.3.2. 国際化されたロガーや例外、メッセージの翻訳 リンクのコピーリンクがクリップボードにコピーされました!
logging-tools クイックスタートを参照してください。
要件
- 作業用の Maven プロジェクトがすでに存在している必要があります。
- JBoss Logging Tools に対してプロジェクトが設定されていなければなりません。
- 国際化されたログメッセージや例外を定義する 1 つ以上のインターフェースがプロジェクトに含まれていなければなりません。
- テンプレート翻訳プロパティーファイルを生成するようプロジェクトが設定されている必要があります。
手順6.5 国際化されたロガーや例外、メッセージの翻訳
テンプレートプロパティーファイルの生成
mvn compileコマンドを実行し、テンプレート翻訳プロパティーファイルを作成します。プロジェクトへのテンプレートファイルの追加
翻訳したいインターフェースのテンプレートを、テンプレートが作成されたディレクトリーからプロジェクトのsrc/main/resourcesディレクトリーへコピーします。プロパティーファイルは翻訳するインターフェースと同じパッケージに存在しなければなりません。コピーしたテンプレートファイルの名前変更
GreeterLogger.i18n_fr_FR.propertiesのように、含まれる翻訳に応じてテンプレートファイルのコピーの名前を変更します。テンプレートの内容の翻訳
新しい翻訳プロパティーファイルを編集し、適切な翻訳が含まれるようにします。Level: Logger.Level.INFO Message: Hello message sent.
# Level: Logger.Level.INFO # Message: Hello message sent. logHelloMessageSent=Bonjour message envoyé.Copy to Clipboard Copied! Toggle word wrap Toggle overflow 実行された各バンドルの各翻訳に対して手順の 2、3、4 を繰り返します。
target/generated-sources/annotations/ で確認できます。
6.2.4. 国際化されたログメッセージのカスタマイズ リンクのコピーリンクがクリップボードにコピーされました!
6.2.4.1. ログメッセージへのメッセージ ID とプロジェクトコードの追加 リンクのコピーリンクがクリップボードにコピーされました!
logging-tools クイックスタートを参照してください。
要件
- 国際化されたログメッセージを持つプロジェクトが存在する必要があります。「国際化されたログメッセージの作成」を参照してください。
- 使用するプロジェクトコードを認識する必要があります。プロジェクトコードを 1 つ使用することも、各インターフェースに異なるコードを定義することも可能です。
手順6.6 メッセージ ID およびプロジェクトコードのログメッセージへの追加
インターフェースのプロジェクトコードを指定します。
カスタムのロガーインターフェースに付けられる@MessageLoggerアノテーションの projectCode 属性を使用してプロジェクトコードを指定します。インターフェースに定義されるすべてのメッセージがこのプロジェクトコードを使用します。@MessageLogger(projectCode="ACCNTS") interface AccountsLogger extends BasicLogger { }@MessageLogger(projectCode="ACCNTS") interface AccountsLogger extends BasicLogger { }Copy to Clipboard Copied! Toggle word wrap Toggle overflow メッセージ ID の指定
メッセージを定義するメソッドに付けられる @Message アノテーションの id 属性を使用して各メッセージに対してメッセージ ID を指定します。@LogMessage @Message(id=43, value = "Customer query failed, Database not available.") void customerQueryFailDBClosed();
@LogMessage @Message(id=43, value = "Customer query failed, Database not available.") void customerQueryFailDBClosed();Copy to Clipboard Copied! Toggle word wrap Toggle overflow
10:55:50,638 INFO [com.company.accounts.ejb] (MSC service thread 1-4) ACCNTS000043: Customer query failed, Database not available.
10:55:50,638 INFO [com.company.accounts.ejb] (MSC service thread 1-4) ACCNTS000043: Customer query failed, Database not available.
6.2.4.2. メッセージのログレベル設定 リンクのコピーリンクがクリップボードにコピーされました!
INFO です。ロギングメソッドに付けられた @LogMessage アノテーションの level 属性を用いて異なるログレベルを指定することが可能です。
手順6.7 メッセージのログレベルの指定
level 属性の指定
ログメッセージメソッド定義の@LogMessageアノテーションにlevel属性を追加します。ログレベルの割り当て
このメッセージに対するログレベルの値をlevel属性に割り当てます。levelに有効な値はorg.jboss.logging.Logger.Levelに定義される 6 つの列挙定数であるDEBUG、ERROR、FATAL、INFO、TRACE、WARNになります。Copy to Clipboard Copied! Toggle word wrap Toggle overflow
ERROR レベルのログメッセージが作成されます。
10:55:50,638 ERROR [com.company.app.Main] (MSC service thread 1-4) Customer query failed, Database not available.
10:55:50,638 ERROR [com.company.app.Main] (MSC service thread 1-4)
Customer query failed, Database not available.
6.2.4.3. パラメーターによるログメッセージのカスタマイズ リンクのコピーリンクがクリップボードにコピーされました!
手順6.8 パラメーターによるログメッセージのカスタマイズ
パラメーターのメソッド定義への追加
すべての型のパラメーターをメソッド定義に追加することができます。型に関係なくパラメーターの String 表現がメッセージに表示されます。パラメーター参照のログメッセージへの追加
参照は明示的なインデックスまたは通常のインデックスを使用できます。- 通常のインデックスを使用するには、各パラメーターを表示したいメッセージ文字列に
%s文字を挿入します。%sの最初のインスタンスにより最初のパラメーターが挿入され、2 番目のインスタンスにより 2 番目のパラメーターが挿入されます。 - 明示的なインデックスを使用するには、文字
%{#}をメッセージに挿入します。# は表示したいパラメーターの数に置き換えます。
重要
例6.1 通常のインデックスを使用したメッセージパラメーター
@LogMessage(level=Logger.Level.DEBUG) @Message(id=2, value="Customer query failed, customerid:%s, user:%s") void customerLookupFailed(Long customerid, String username);
@LogMessage(level=Logger.Level.DEBUG)
@Message(id=2, value="Customer query failed, customerid:%s, user:%s")
void customerLookupFailed(Long customerid, String username);
例6.2 明示的なインデックスを使用したメッセージパラメーター
@LogMessage(level=Logger.Level.DEBUG)
@Message(id=2, value="Customer query failed, customerid:%{1}, user:%{2}")
void customerLookupFailed(Long customerid, String username);
@LogMessage(level=Logger.Level.DEBUG)
@Message(id=2, value="Customer query failed, customerid:%{1}, user:%{2}")
void customerLookupFailed(Long customerid, String username);
6.2.4.4. 例外をログメッセージの原因として指定 リンクのコピーリンクがクリップボードにコピーされました!
Throwable 型とするか、サブクラスのいずれかに @Cause アノテーションを付ける必要があります。このパラメーターは、他のパラメーターのようにログメッセージで参照することはできず、ログメッセージの後に表示されます。
手順6.9 例外をログメッセージの原因として指定
パラメーターの追加
Throwable型のパラメーターまたはサブクラスをメソッドに追加します。@Message(id=404, value="Loading configuration failed. Config file:%s") void loadConfigFailed(Exception ex, File file);
@Message(id=404, value="Loading configuration failed. Config file:%s") void loadConfigFailed(Exception ex, File file);Copy to Clipboard Copied! Toggle word wrap Toggle overflow アノテーションの追加
パラメーターに@Causeアノテーションを追加します。import org.jboss.logging.Cause @Message(value = "Loading configuration failed. Config file: %s") void loadConfigFailed(@Cause Exception ex, File file);
import org.jboss.logging.Cause @Message(value = "Loading configuration failed. Config file: %s") void loadConfigFailed(@Cause Exception ex, File file);Copy to Clipboard Copied! Toggle word wrap Toggle overflow メソッドの呼び出し
コードでメソッドが呼び出されると、正しい型のオブジェクトが渡され、ログメッセージの後に表示されます。Copy to Clipboard Copied! Toggle word wrap Toggle overflow コードがFileNotFoundException型の例外をスローした場合、上記コード例の出力は次のようになります。Copy to Clipboard Copied! Toggle word wrap Toggle overflow
6.2.5. 国際化された例外のカスタマイズ リンクのコピーリンクがクリップボードにコピーされました!
6.2.5.1. メッセージ ID およびプロジェクトコードの例外メッセージへの追加 リンクのコピーリンクがクリップボードにコピーされました!
要件
- 国際化された例外を持つプロジェクトが存在する必要があります。「国際化された例外の作成」を参照してください。
- 使用するプロジェクトコードを認識する必要があります。プロジェクトコードを 1 つ使用することも、各インターフェースに異なるコードを定義することも可能です。
手順6.10 メッセージ ID およびプロジェクトコードの例外メッセージへの追加
プロジェクトコードの指定
例外バンドルインターフェースに付けられる@MessageBundleアノテーションのprojectCode属性を使用して、プロジェクトコードを指定します。インターフェースに定義されるすべてのメッセージがこのプロジェクトコードを使用します。@MessageBundle(projectCode="ACCTS") interface ExceptionBundle { ExceptionBundle EXCEPTIONS = Messages.getBundle(ExceptionBundle.class); }@MessageBundle(projectCode="ACCTS") interface ExceptionBundle { ExceptionBundle EXCEPTIONS = Messages.getBundle(ExceptionBundle.class); }Copy to Clipboard Copied! Toggle word wrap Toggle overflow メッセージ ID の指定
例外を定義するメソッドに付けられる@Messageアノテーションのid属性を使用して、各例外に対してメッセージ ID を指定します。@Message(id=143, value = "The config file could not be opened.") IOException configFileAccessError();
@Message(id=143, value = "The config file could not be opened.") IOException configFileAccessError();Copy to Clipboard Copied! Toggle word wrap Toggle overflow
重要
例6.3 国際化された例外の作成
throw ExceptionBundle.EXCEPTIONS.configFileAccessError();
throw ExceptionBundle.EXCEPTIONS.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)
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)
6.2.5.2. パラメーターによる例外メッセージのカスタマイズ リンクのコピーリンクがクリップボードにコピーされました!
手順6.11 パラメーターによる例外メッセージのカスタマイズ
パラメーターのメソッド定義への追加
すべての型のパラメーターをメソッド定義に追加できます。型に関係なく、パラメーターのString表現がメッセージに表示されます。パラメーター参照の例外メッセージへの追加
参照は明示的なインデックスまたは通常のインデックスを使用できます。- 通常のインデックスを使用するには、各パラメーターを表示したいメッセージ文字列に
%s文字を挿入します。%sの最初のインスタンスにより最初のパラメーターが挿入され、2 番目のインスタンスにより 2 番目のパラメーターが挿入されます。 - 明示的なインデックスを使用するには、文字
%{#}をメッセージに挿入します。#は表示したいパラメーターの数に置き換えます。
明示的なインデックスを使用すると、メッセージのパラメーター参照の順番がメソッドで定義される順番とは異なるようになります。これは、異なるパラメーターの順番が必要な翻訳メッセージで重要になります。
重要
@Cause アノテーションが付けられたパラメーターはパラメーターの数には含まれません。
例6.4 通常のインデックスを使用
@Message(id=143, value = "The config file %s could not be opened.") IOException configFileAccessError(File config);
@Message(id=143, value = "The config file %s could not be opened.")
IOException configFileAccessError(File config);
例6.5 明示的なインデックスを使用
@Message(id=143, value = "The config file %{1} could not be opened.")
IOException configFileAccessError(File config);
@Message(id=143, value = "The config file %{1} could not be opened.")
IOException configFileAccessError(File config);
6.2.5.3. 別の例外の原因として 1 つの例外を指定 リンクのコピーリンクがクリップボードにコピーされました!
手順6.12 別の例外の原因として 1 つの例外を指定
パラメーターの追加
Throwable型のパラメーターまたはサブクラスをメソッドに追加します。@Message(id=328, value = "Error calculating: %s.") ArithmeticException calculationError(Throwable cause, String msg);
@Message(id=328, value = "Error calculating: %s.") ArithmeticException calculationError(Throwable cause, String msg);Copy to Clipboard Copied! Toggle word wrap Toggle overflow アノテーションの追加
パラメーターに@Causeアノテーションを追加します。import org.jboss.logging.Cause @Message(id=328, value = "Error calculating: %s.") ArithmeticException calculationError(@Cause Throwable cause, String msg);
import org.jboss.logging.Cause @Message(id=328, value = "Error calculating: %s.") ArithmeticException calculationError(@Cause Throwable cause, String msg);Copy to Clipboard Copied! Toggle word wrap Toggle overflow メソッドの呼び出し
例外オブジェクトを取得するため、インターフェースメソッドを呼び出します。キャッチした例外を原因として使用し、キャッチブロックより新しい例外をスローするのが最も一般的なユースケースになります。Copy to Clipboard Copied! Toggle word wrap Toggle overflow
例6.6 別の例外の原因として 1 つの例外を指定
6.2.6. 参考資料 リンクのコピーリンクがクリップボードにコピーされました!
6.2.6.1. JBoss Logging ツールの Maven 設定 リンクのコピーリンクがクリップボードにコピーされました!
pom.xml ファイルのプロジェクトの設定を次のように変更する必要があります。
pom.xml ファイルの例については、logging-tools クイックスタートを参照してください。
- プロジェクトに対して JBoss Maven リポジトリーが有効になっている必要があります。「Maven 設定を使用した JBoss EAP 6 Maven リポジトリーの設定」 を参照してください。
jboss-loggingとjboss-logging-processorの Maven 依存関係を追加する必要があります。これらの依存関係は両方 JBoss EAP 6 で使用可能であるため、各依存関係の scope 要素を次のようにprovidedに設定できます。Copy to Clipboard Copied! Toggle word wrap Toggle overflow maven-compiler-pluginのバージョンは2.2以上である必要があり、1.6のターゲットソースおよび生成されたソースに対して設定する必要があります。Copy to Clipboard Copied! Toggle word wrap Toggle overflow
6.2.6.2. 翻訳プロパティーファイルの形式 リンクのコピーリンクがクリップボードにコピーされました!
java.util.Properties クラスのドキュメントに記載されている単純な行指向の key=value ペア形式です。
InterfaceName.i18n_locale_COUNTRY_VARIANT.properties
InterfaceName.i18n_locale_COUNTRY_VARIANT.properties
InterfaceNameは翻訳が適用されるインターフェースの名前です。locale、COUNTRY、およびVARIANTは翻訳が適用される地域設定を識別します。localeは ISO-639 言語コードを使用して言語を指定し、COUNTRYは ISO-3166 国名コードを使用して国を指定します。COUNTRYは任意です。VARIANTは特定のオペレーティングシステムやブラウザーのみに適用される翻訳を識別するために使用される任意の識別子です。
例6.7 翻訳プロパティーファイルの例
GreeterService.i18n_fr_FR_POSIX.properties
Level: Logger.Level.INFO Message: Hello message sent.
# Level: Logger.Level.INFO
# Message: Hello message sent.
logHelloMessageSent=Bonjour message envoyé.
6.2.6.3. JBoss Logging Tools のアノテーションに関する参考資料 リンクのコピーリンクがクリップボードにコピーされました!
| アノテーション | ターゲット | 説明 | 属性 |
|---|---|---|---|
@MessageBundle | インターフェース |
インターフェースをメッセージバンドルとして定義します。
| projectCode |
@MessageLogger | インターフェース |
インターフェースをメッセージロガーとして定義します。
| projectCode |
@Message | メソッド |
メッセージバンドルとメッセージロガーで使用できます。メッセージロガーでは、多言語化されたロガーとしてメソッドを定義します。メッセージバンドルでは、多言語化された文字列または例外オブジェクトを返すメソッドとして定義します。
| value、id |
@LogMessage | メソッド |
メッセージロガーのメソッドをロギングメソッドとして定義します。
| level (デフォルトは INFO) |
@Cause | パラメーター |
ログメッセージまたは他の例外が発生したときに例外を渡すパラメーターとして定義します。
| - |
@Param | パラメーター |
例外のコンストラクターへ渡されるパラメーターとして定義します。
| - |
第7章 Enterprise JavaBeans リンクのコピーリンクがクリップボードにコピーされました!
7.1. はじめに リンクのコピーリンクがクリップボードにコピーされました!
7.1.1. Enterprise JavaBeans の概要 リンクのコピーリンクがクリップボードにコピーされました!
7.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 サービス (エンドポイントおよびクライアントビュー)
7.1.3. EJB 3.1 Lite リンクのコピーリンクがクリップボードにコピーされました!
- Web アプリケーションに適切な機能のみをサポートします。
- EJB を同じ WAR ファイルで Web アプリケーションとしてデプロイできます。
7.1.4. EJB 3.1 Lite の機能 リンクのコピーリンクがクリップボードにコピーされました!
- ステートレス、ステートフル、およびシングルトンセッション Bean
- ローカルビジネスインターフェースおよび「インターフェースなしの」Bean
- インターセプター
- コンテナ管理および Bean 管理トランザクション
- 宣言およびプログラミング可能なセキュリティー
- 埋め込み API
- リモートインターフェース
- RMI と IIOP の相互運用性
- JAX-WS Web サービスエンドポイント
- EJB タイマーサービス
- 非同期セッション Bean 呼び出し
- メッセージ駆動型 Bean
7.1.5. エンタープライズ Bean リンクのコピーリンクがクリップボードにコピーされました!
重要
7.1.6. エンタープライズ Bean の記述 リンクのコピーリンクがクリップボードにコピーされました!
7.1.7. セッション Bean ビジネスインターフェース リンクのコピーリンクがクリップボードにコピーされました!
7.1.7.1. エンタープライズ Bean のビジネスインターフェース リンクのコピーリンクがクリップボードにコピーされました!
7.1.7.2. EJB ローカルビジネスインターフェース リンクのコピーリンクがクリップボードにコピーされました!
7.1.7.3. EJB リモートビジネスインターフェース リンクのコピーリンクがクリップボードにコピーされました!
7.1.7.4. EJB のインターフェースなしの Bean リンクのコピーリンクがクリップボードにコピーされました!
7.2. エンタープライズ Bean プロジェクトの作成 リンクのコピーリンクがクリップボードにコピーされました!
7.2.1. JBoss Developer Studio を使用した EJB アーカイブプロジェクトの作成 リンクのコピーリンクがクリップボードにコピーされました!
要件
- JBoss EAP 6 のサーバーとサーバーランタイムが設定されている必要があります。
手順7.1 JBoss Developer Studio での EJB プロジェクトの作成
新規プロジェクトの作成
新規 EJB プロジェクトウィザードを開くには、 メニューで を選択し、次に を選択します。図7.1 New EJB Project ウィザード
詳細の指定
次の詳細を入力します。- プロジェクト名JBoss Developer Studio で表示されるプロジェクト名ですが、デプロイされた JAR ファイルのデフォルトのファイル名にもなります。
- プロジェクトの場所プロジェクトのファイルが保存されるディレクトリーです。現在のワークスペースのディレクトリーがデフォルトになります。
- ターゲットランタイムプロジェクトに使用されるサーバーランタイムです。デプロイするサーバーによって使用される JBoss EAP 6 ランタイムに設定する必要があります。
- EJB モジュールバージョン。エンタープライズ Bean が準拠する EJB 仕様のバージョンになります。Red Hat は
3.1の使用を推奨します。 - これでプロジェクトのサポート対象機能を調整できるようになります。選択したランタイムにデフォルト設定を使用します。
クリックして作業を継続します。Java 構築設定
この画面では、Java ソースファイルが格納されるディレクトリーや構築された出力が置かれるディレクトリーをカスタマイズできます。この設定は変更せずに をクリックします。EJB モジュール設定
デプロイメント記述子が必要な場合は Generate ejb-jar.xml deployment descriptor チェックボックスにチェックマークを付けます。EJB 3.1 ではデプロイメント記述子は任意で、必要な場合は後で追加できます。をクリックするとプロジェクトが作成され、Project Explorer に表示されます。図7.2 Project Explorer の新規作成された EJB プロジェクト
構築アーティファクトのサーバーへの追加
サーバータブにて、構築アーティファクトをデプロイしたいサーバーを右クリックし、 Add and Remove ダイアログを開きます。Add and Remove を選択します。Available カラムよりデプロイするリソースを選択し、 ボタンをクリックします。リソースが Configured カラムに移動します。 をクリックしてダイアログを閉じます。図7.3 ダイアログの追加と削除
ビルドし、指定のサーバーにデプロイできる EJB プロジェクトが JBoss Developer Studio で作成されます。
7.2.2. Maven での EJB アーカイブプロジェクトの作成 リンクのコピーリンクがクリップボードにコピーされました!
前提条件
- Maven がすでにインストールされている必要があります。
- Maven の基本的な使用法を理解している必要があります。
手順7.2 Maven における EJB アーカイブプロジェクトの作成
Maven プロジェクトの作成
Maven のアーキタイプシステムとejb-javaee6アーキタイプを使用して EJB プロジェクトを作成できます。作成するには、以下のパラメーターを用いてmvnコマンドを実行します。mvn archetype:generate -DarchetypeGroupId=org.codehaus.mojo.archetypes -DarchetypeArtifactId=ejb-javaee6
mvn archetype:generate -DarchetypeGroupId=org.codehaus.mojo.archetypes -DarchetypeArtifactId=ejb-javaee6Copy to Clipboard Copied! Toggle word wrap Toggle overflow プロジェクトのgroupId、artifactId、version、およびpackageを指定するよう要求されます。Copy to Clipboard Copied! Toggle word wrap Toggle overflow エンタープライズ Bean の追加
エンタープライズ Bean を作成し、Bean のパッケージに適切なサブディレクトリーにあるsrc/main/javaディレクトリー下のプロジェクトに追加します。プロジェクトの構築
プロジェクトを構築するには、pom.xmlファイルと同じディレクトリーでmvn packageコマンドを実行します。このコマンドを実行すると、Java クラスがコンパイルされ、JAR ファイルがパッケージ化されます。ビルドされた JAR ファイルにはartifactId-version.jarという名前が付けられ、target/ディレクトリーに置かれます。
7.2.3. EJB プロジェクトが含まれる EAR プロジェクトの作成 リンクのコピーリンクがクリップボードにコピーされました!
要件
- JBoss EAP 6 のサーバーとサーバーランタイムが設定されている必要があります。詳細は「JBoss EAP 6 サーバーを JBoss Developer Studio へ追加」を参照してください。
手順7.3 EJB プロジェクトが含まれる EAR プロジェクトの作成
新しい EAR アプリケーションプロジェクトウィザードを開く
メニューより 、 の順に選択すると、New Project ウィザードが表示されます。 を選択し、 をクリックします。図7.4 新しい EAR アプリケーションウィザード
詳細の入力
次の詳細を入力します。- プロジェクト名JBoss Developer Studio で表示されるプロジェクト名ですが、デプロイされた EAR ファイルのデフォルトのファイル名にもなります。
- プロジェクトの場所プロジェクトのファイルが保存されるディレクトリーです。現在のワークスペースのディレクトリーがデフォルトになります。
- ターゲットランタイムプロジェクトに使用されるサーバーランタイムです。デプロイするサーバーによって使用される JBoss EAP 6 ランタイムに設定する必要があります。
- EAR バージョンプロジェクトが準拠する Java Enterprise Edition 仕様のバージョンになります。Red Hat は
6の使用を推奨します。 - これでプロジェクトのサポート対象機能を調整できるようになります。選択したランタイムにデフォルト設定を使用します。
クリックして作業を継続します。新しい EJB モジュールの追加
新しいモジュールはウィザードの Enterprise Application ページより追加することができます。次の手順に従って新しい EJB プロジェクトをモジュールとして追加します。新しい EJB モジュールの追加
をクリックし、 Create Default Modules チェックボックスのチェックを外します。Enterprise Java Bean を選択し、 をクリックすると New EJB Project ウィザードが表示されます。EJB プロジェクトの作成
New EJB Project ウィザードは、新しいスタンドアローン EJB プロジェクトを作成するために使用するウィザードと同じで、「JBoss Developer Studio を使用した EJB アーカイブプロジェクトの作成」に説明されています。プロジェクト作成のために最低限必要な情報は次のとおりです。- プロジェクト名
- ターゲットランタイム
- EJB モジュールのバージョン
- 設定
ウィザードの他の手順はすべて任意の手順となります。 をクリックして EJB プロジェクトの作成を完了します。
新規作成された EJB プロジェクトは Java EE モジュールの依存関係に一覧表示され、チェックボックスにチェックが付けられます。任意の作業: application.xml デプロイメント記述子の追加
必要な場合は Generate application.xml deployment descriptor チェックボックスにチェックを付けます。Finish のクリック
EJB プロジェクトと EAR プロジェクトの 2 つの新しいプロジェクトが表示されます。デプロイメントに対して構築アーティファクトをサーバーに追加する
Servers タブにて、構築アーティファクトをデプロイしたいサーバーを右クリックし、 Add and Remove ダイアログを開きます。 を選択します。Available カラムよりデプロイする EAR リソースを選択し、 ボタンをクリックします。リソースが Configured カラムに移動します。 をクリックしてダイアログを閉じます。図7.5 ダイアログの追加と削除
メンバーの EJB プロジェクトを持つ Enterprise Application プロジェクトが作成されます。この Enterprise Application プロジェクトはビルドされ、EJB サブデプロイメントが含まれる単一の EAR デプロイメントとして指定のサーバーにデプロイされます。
7.2.4. EJB プロジェクトへのデプロイメント記述子の追加 リンクのコピーリンクがクリップボードにコピーされました!
前提条件
- EJB デプロイメント記述子を追加したい EJB プロジェクトが JBoss Developer Studio に存在している必要があります。
手順7.4 EJB プロジェクトにデプロイメント記述子を追加する
プロジェクトを開く
JBoss Developer Studio でプロジェクトを開きます。デプロイメント記述子の追加
プロジェクトビューの Deployment Descriptor フォルダーを右クリックし、 を選択します。図7.6 デプロイメント記述子の追加
ejb-jar.xml が ejbModule/META-INF/ に作成されます。
7.3. セッション Bean リンクのコピーリンクがクリップボードにコピーされました!
7.3.1. セッション Bean リンクのコピーリンクがクリップボードにコピーされました!
7.3.2. ステートレスセッション Bean リンクのコピーリンクがクリップボードにコピーされました!
7.3.3. ステートフルセッション Bean リンクのコピーリンクがクリップボードにコピーされました!
7.3.4. シングルトンセッション Bean リンクのコピーリンクがクリップボードにコピーされました!
7.3.5. セッション Bean の JBoss Developer Studio プロジェクトへの追加 リンクのコピーリンクがクリップボードにコピーされました!
前提条件
- 1 つ以上のセッション Bean を追加したい EJB または動的 Web プロジェクトが JBoss Developer Studio に存在する必要があります。
手順7.5 セッション Bean の JBoss Developer Studio プロジェクトへの追加
プロジェクトを開く
JBoss Developer Studio でプロジェクトを開きます。Create EJB 3.x Session Bean ウィザードを開く
Create EJB 3.x Session Bean ウィザードを開くには、 メニューへ移動し、 を選択してから を選択します。図7.7 Create EJB 3.x Session Bean ウィザード
クラス情報の指定
次の詳細を入力します。- プロジェクト正しいプロジェクトが選択されているか検証します。
- ソースホルダーJava ソースファイルが作成されるフォルダーになります。通常、変更する必要はありません。
- パッケージクラスが属するパッケージを指定します。
- クラス名セッション Bean になるクラスの名前を指定します。
- スーパークラスセッション Bean クラスはスーパークラスより継承することができます。セッションにスーパークラスがあるかどうかをここに指定します。
- ステートタイプセッション Bean のステートタイプ (ステートレス、ステートフル、シングルトン) を指定します。
- ビジネスインターフェースデフォルトでは No-interface ボックスにチェックマークが付けられているため、インターフェースは作成されません。定義したいインターフェースのボックスにチェックマークを付け、必要な場合は名前を調整します。Web アーカイブ (WAR) のエンタープライズ Bean は EJB 3.1 Lite のみをサポートするため、リモートビジネスインターフェースは含まれません。
をクリックします。セッション Bean の特定情報
ここに追加情報を入力してセッション Bean を更にカスタマイズすることが可能です。ここで情報を変更する必要はありません。変更できる項目は次のとおりです。- Bean 名。
- マッピングされた名前。
- トランザクションタイプ (コンテナ管理または Bean 管理)。
- Bean が実装しなければならない追加のインターフェースを入力できます。
- 必要な場合は、EJB 2.x のホームインターフェースやコンポーネントインターフェースを指定することもできます。
完了
をクリックすると、新しいセッション Bean が作成され、プロジェクトに追加されます。指定された場合、新しいビジネスインターフェースのファイルも作成されます。
図7.8 JBoss Developer Studio の新しいセッション Bean
7.4. メッセージ駆動型 Bean リンクのコピーリンクがクリップボードにコピーされました!
7.4.1. メッセージ駆動型 Bean リンクのコピーリンクがクリップボードにコピーされました!
7.4.2. リソースアダプター リンクのコピーリンクがクリップボードにコピーされました!
7.4.3. JBoss Developer Studio での JMS ベースメッセージ駆動型 Bean の作成 リンクのコピーリンクがクリップボードにコピーされました!
前提条件
- JBoss Developer Studio で既存のプロジェクトが開かれている必要があります。
- Bean がリッスンする JMS 宛先の名前とタイプを認識している必要があります。
- この Bean がデプロイされる JBoss EAP 6 の設定で Java Messaging Service (JMS) のサポートが有効になっている必要があります。
手順7.6 JBoss Developer Studio での JMS ベースメッセージ駆動型 Bean の追加
Create EJB 3.x Message-Driven Bean ウィザードを開く
→ → と移動します。EJB/Message-Driven Bean (EJB 3.x) を選択し、 ボタンをクリックします。図7.9 Create EJB 3.x Message-Driven Bean ウィザード
クラスファイルの宛先詳細の指定
Bean クラスに対して指定する詳細のセットは、プロジェクト、Java クラス、メッセージの宛先の 3 つがあります。- プロジェクト
- Workspace に複数のプロジェクトが存在する場合は、 メニューで正しいプロジェクトが選択されるようにしてください。
- 新しい Bean のソースファイルが作成されるフォルダーは、選択されたディレクトリー下の
ejbModuleに作成されます。特定の要件がある場合のみこのフォルダーを変更します。
- Java クラス
- 必須のフィールドは Java package と class name になります。
- アプリケーションのビジネスロジックがスーパークラスを必要とする場合を除き、Superclass を入力する必要はありません。
- メッセージの宛先
- JMS ベースのメッセージ駆動型 Bean に提供する必要がある詳細は次のとおりです。
- Destination name。これは、Bean が応答するメッセージに含まれるキューまたはトピック名です。
- デフォルトでは JMS チェックボックスが選択されます。これは変更しないでください。
- Destination type を必要に応じて Queue または Topic に設定します。
ボタンをクリックします。メッセージ駆動型 Bean 固有の情報入力
以下のデフォルト値は、コンテナ管理トランザクションを使用する JMS ベースのメッセージ駆動型 Bean に適するデフォルト値となります。- Bean が Bean 管理トランザクションを使用する場合は、トランザクションタイプを Bean に変更します。
- クラス名とは異なる Bean 名が必要な場合は、Bean 名を変更します。
- JMS メッセージリスナーインターフェースがリストされているはずです。インターフェースがアプリケーションのビジネスロジックに固有する場合を除き、インターフェースの追加や削除は必要ありません。
- メソッドスタブ作成のチェックボックスはそのまま選択された状態にしてきます。
ボタンをクリックします。
onMessage() メソッドによってメッセージ駆動型 Bean が作成されます。JBoss Developer Studio のエディターウィンドウが対応するファイルによって開かれます。
7.5. セッション Bean の呼び出し リンクのコピーリンクがクリップボードにコピーされました!
7.5.1. JNDI を使用したリモートでのセッション Bean の呼び出し リンクのコピーリンクがクリップボードにコピーされました!
ejb-remote クイックスタートには、この機能のデモを行う Maven プロジェクトが含まれています。このクイックスタートには、デプロイするセッション Bean のプロジェクトとリモートクライアントのプロジェクトの両方が含まれています。下記のコード例はリモートクライアントのプロジェクトから引用されています。
前提条件
- Maven プロジェクトが作成され、使用できる状態です。
- JBoss EAP 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 ポートを覚えておく必要があります。
手順7.7 セッション Bean のリモート呼び出しに対する Maven プロジェクト設定の追加
必要なプロジェクト依存関係の追加
必要な依存関係が含まれるようにするため、プロジェクトのpom.xmlを更新する必要があります。jboss-ejb-client.propertiesファイルの追加JBoss EJB クライアント API は、JNDI サービスの接続情報が含まれるjboss-ejb-client.propertiesという名前のプロジェクトのルートにファイルがあることを想定します。このファイルを以下の内容と共にプロジェクトのsrc/main/resources/ディレクトリーに追加します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow ホスト名とポートを変更してサーバーと一致するようにします。4447がデフォルトのポート番号です。 安全な接続の場合、SSL_ENABLED行をtrueに設定し、SSL_STARTTLS行をアンコメントします。コンテナ内のリモーティングインターフェースは同じポートを使用して安全な接続と安全でない接続をサポートします。リモートビジネスインターフェースの依存関係の追加
セッション Bean のリモートビジネスインターフェースに対するpom.xmlに Maven の依存関係を追加します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow
手順7.8 JNDI を使用した Bean プロキシの取得および Bean のメソッドの呼び出し
チェック例外の処理
次のコードに使用されるメソッドの 2 つ (InitialContext()およびlookup()) は、タイプjavax.naming.NamingExceptionのチェック済み例外を持っています。これらのメソッド呼び出しは、NamingExceptionをキャッチする try/catch ブロックか、NamingExceptionのスローが宣言されたメソッドでエンクローズされる必要があります。ejb-remoteクイックスタートでは、2 つ目の方法を使用します。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);
final Hashtable jndiProperties = new Hashtable(); jndiProperties.put(Context.URL_PKG_PREFIXES, "org.jboss.ejb.client.naming"); final Context context = new InitialContext(jndiProperties);Copy to Clipboard Copied! Toggle word wrap Toggle overflow JNDI サービスの接続プロパティーはjboss-ejb-client.propertiesファイルから読み取られます。JNDI コンテキストの lookup() メソッドを使用した Bean プロキシの取得
Bean プロキシのlookup()メソッドを呼び出し、必要なセッション Bean の JNDI 名 へ渡します。これにより、呼び出したいメソッドが含まれるリモートビジネスインターフェースのタイプへキャストされなければならないオブジェクトが返されます。final RemoteCalculator statelessRemoteCalculator = (RemoteCalculator) context.lookup( "ejb:/jboss-as-ejb-remote-server-side/CalculatorBean!" + RemoteCalculator.class.getName());final RemoteCalculator statelessRemoteCalculator = (RemoteCalculator) context.lookup( "ejb:/jboss-as-ejb-remote-server-side/CalculatorBean!" + RemoteCalculator.class.getName());Copy to Clipboard Copied! Toggle word wrap Toggle overflow セッション Bean の JNDI 名は特別な構文によって定義されます。詳細は、「EJB 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);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);Copy to Clipboard Copied! Toggle word wrap Toggle overflow メソッド呼び出し要求が実行されるサーバー上で、プロキシ Bean がメソッド呼び出し要求をセッション Bean へ渡します。結果はプロキシ Bean へ返され、プロキシ Bean によって結果が呼び出し側へ返されます。プロキシ Bean とリモートセッション Bean 間の通信は呼び出し側に透過的です。
7.5.2. EJB クライアントコンテキスト リンクのコピーリンクがクリップボードにコピーされました!
- リモートクライアント。スタンドアロン Java アプリケーションとして実行されます。
- リモートクライアント。別の JBoss EAP 6 インスタンス内で実行されます。
7.5.3. 単一 EJB コンテキストを使用する場合の留意事項 リンクのコピーリンクがクリップボードにコピーされました!
スタンドアロンリモートクライアントで単一 EJB クライアントコンテキストを使用する場合は、アプリケーション要件を考慮する必要があります。異なるタイプのリモートクライアントの詳細については、「EJB クライアントコンテキスト 」 を参照してください。
一般的に、リモートスタンドアロンクライアントは任意の数の EJB レシーバーにより支援された唯一の EJB クライアントコンテキストを持っています。以下に、スタンドアロンリモートクライアントアプリケーションの例を示します。
jboss-ejb-client.properties ファイルにより支援され、このファイルは EJB クライアントコンテキストと EJB レシーバーをセットアップするために使用されます。また、この設定には、セキュリティークレデンシャルが含まれ、このセキュリティークレデンシャルは JBoss EAP 6 サーバーに接続する EJB レシーバーを作成するために使用されます。上記のコードが呼び出された場合、EJB クライアント API は EJB クライアントコンテキストを探します。この EJB クライアントコンテキストは EJB 呼び出し要求を受け取り処理する EJB レシーバーを選択するために使用されます。この場合は、EJB クライアントコンテキストが 1 つしかないため、Bean を呼び出すためにそのコンテキストが上記のコードにより使用されます。JNDI をリモートで使用してセッション Bean を呼び出す手順の詳細については、「JNDI を使用したリモートでのセッション Bean の呼び出し」 を参照してください。
ユーザーアプリケーションが Bean を複数回呼び出す場合に、異なるセキュリティークレデンシャルを使用して JBoss EAP 6 サーバーに接続したいことがあります。以下に、同じ Bean を 2 回呼び出すスタンドアロンリモートクライアントアプリケーションの例を示します。
スコープ EJB クライアントコンテキストを使用するとこの問題を解決できます。スコープ EJB クライアントコンテキストにより、EJB クライアントコンテキストと、関連する JNDI コンテキスト (一般的に EJB 呼び出しに使用されます) を細かく制御できるようになります。スコープ EJB クライアントコンテキストの詳細については、「スコープ EJB クライアントコンテキストの使用」 と「スコープ EJB クライアントコンテキストを使用した EJB の設定」 を参照してください。
7.5.4. スコープ EJB クライアントコンテキストの使用 リンクのコピーリンクがクリップボードにコピーされました!
JBoss EAP 6 の初期バージョンで EJB を呼び出すには、通常 JNDI コンテキストを作成し、PROVIDER_URL (ターゲットサーバーを示します) に渡します。JNDI コンテキストを使用してルックアップされた EJB プロキシに対して行われたすべての呼び出しは最終的にそのサーバーに対して行われます。スコープ EJB クライアントコンテキストにより、ユーザーアプリケーションは特定の呼び出しに使用される EJB レシーバーを制御できます。
スコープ EJB クライアントコンテキストが導入される前に、コンテキストは通常クライアントアプリケーションにスコープ指定されていました。スコープクライアントコンテキストにより、EJB クライアントコンテキストを JNDI コンテキストでスコープ指定できるようになりました。以下に、スコープ EJB クライアントコンテキストを使用して同じ Bean を 2 回呼び出すスタンドアロンリモートクライアントアプリケーションの例を示します。
jboss-ejb-client.properties ファイルで使用されるのと同じプロパティーセットです。EJB クライアントコンテキストを JNDI コンテキストにスコープ指定するには、org.jboss.ejb.client.scoped.context プロパティーを指定し、その値を true に設定する必要があります。このプロパティーは、EJB クライアント API に、EJB クライアントコンテキスト (EJB レシーバーにより支援される) を作成する必要があることと、作成されたコンテキストが作成元の JNDI コンテキストに対してのみスコープ指定されるか、可視状態であることを通知します。この JNDI コンテキストを使用してルックアップされた、または呼び出されたすべての EJB プロキシは、この JNDI コンテキストに関連付けられた EJB クライアントコンテキストのみを認識します。EJB をルックアップし、呼び出すためにアプリケーションにより使用される他の JNDI コンテキストは、他のスコープ EJB クライアントコンテキストについて認識しません。
org.jboss.ejb.client.scoped.context プロパティーを渡さず、EJB クライアントコンテキストにスコープ指定されない JNDI コンテキストはデフォルトの動作を使用します。デフォルトの動作では、一般的にアプリケーション全体に割り当てられた既存の EJB クライアントコンテキストを使用します。
注記
InitialContext を閉じる必要があります。InitialContext が閉じられると、リソースは即座にリリースされます。バインドされたプロキシーは無効になり、呼び出しによって例外がスローされます。InitialContext を閉じないと、リソースおよびパフォーマンスの問題が発生することがあります。
7.5.5. スコープ EJB クライアントコンテキストを使用した EJB の設定 リンクのコピーリンクがクリップボードにコピーされました!
EJB は、マップベースのスコープ指定されたコンテキストを使用して設定できます。これは、プログラムで、jboss-ejb-client.properties にある標準的なプロパティーを使用して Properties マップに値を入力し、org.jboss.ejb.client.scoped.context プロパティーに true を指定して、InitialContext のプロパティーを渡すことにより実現されます。
手順7.9 マップベースのスコープ指定されたコンテキストを使用した EJB の設定
プロパティーの設定
EJB クライアントプロパティーをプログラムで設定し、標準的なjboss-ejb-client.propertiesファイルで使用されたのと同じプロパティーセットを指定します。スコープ指定されたコンテキストを有効にするには、org.jboss.ejb.client.scoped.contextプロパティーを指定し、その値をtrueに設定する必要があります。以下は、プロパティーをプログラムで設定する例です。Copy to Clipboard Copied! Toggle word wrap Toggle overflow コンテキスト作成でプロパティーを渡す
// Create the context using the configured properties InitialContext ic = new InitialContext(ejbClientContextProps); MySLSB bean = ic.lookup("ejb:myapp/ejb//MySLSBBean!" + MySLSB.class.getName());// Create the context using the configured properties InitialContext ic = new InitialContext(ejbClientContextProps); MySLSB bean = ic.lookup("ejb:myapp/ejb//MySLSBBean!" + MySLSB.class.getName());Copy to Clipboard Copied! Toggle word wrap Toggle overflow
- ルックアップ EJB プロキシーにより生成されたコンテキストは、このスコープコンテキストによりバインドされ、重要な接続パラメーターのみを使用します。これにより、さまざまなコンテキストを作成してクライアントアプリケーション内のデータにアクセスしたり、さまざまなログインを使用してサーバーに独立してアクセスしたりできます。
- クライアントでは、スコープ指定された
InitialContextとスコープ指定されたプロキシーの両方がスレッドに渡され、各スレッドが該当するコンテキストで動作することが可能になります。また、プロキシーを同時に使用できる複数のスレッドにプロキシーを渡すことができます。 - スコープ指定されたコンテキスト EJB プロキシーは、リモートコールでシリアライズされ、サーバーでデシリアライズされます。デシリアライズされるとき、スコープ指定されたコンテキストの情報が削除され、デフォルト状態に戻ります。デシリアライズされたプロキシーがリモートサーバーで使用される場合は、作成時に使用されたスコープコンテキストを持たなくなるため、
EJBCLIENT000025エラーが発生したり、EJB 名を使用して間違った対象を呼び出したりすることがあります。
7.5.6. EJB クライアントプロパティー リンクのコピーリンクがクリップボードにコピーされました!
以下の表は、プログラムまたは jboss-ejb-client.properties ファイルで設定できるプロパティーを示しています。
以下の表は、同じスコープ内のライブラリー全体で有効なプロパティーを示しています。
| プロパティー名 | 説明 |
|---|---|
endpoint.name |
クライアントエンドポイントの名前。設定されない場合、デフォルト値は
client-endpoint です。
スレッド名にはこのプロパティーが含まれるため、異なるエンドポイント設定を区別するのに役に立つことがあります。
|
remote.connectionprovider.create.options.org.xnio.Options.SSL_ENABLED |
すべての接続に対して SSL プロトコルが有効であるかどうかを指定するブール値。
|
deployment.node.selector | org.jboss.ejb.client.DeploymentNodeSelector の実装の完全修飾名。
これは、EJB の呼び出しを負荷分散するために使用されます。
|
invocation.timeout |
EJB ハンドシェイクまたはメソッド呼び出し要求/応答サイクルのタイムアウト。この値はミリ秒単位です。
実行にタイムアウト時間よりも長い時間がかかった場合は、任意のメソッドの呼び出しで
java.util.concurrent.TimeoutException がスローされます。実行が完了し、サーバーは中断されません。
|
reconnect.tasks.timeout |
バックグラウンド再接続タスクのタイムアウト。この値はミリ秒単位です。
複数の接続がダウンしている場合は、次のクライアント EJB 呼び出しで、適切なノードを見つけるために再接続が必要かどうかを決定するアルゴリズムが使用されます。
|
org.jboss.ejb.client.scoped.context |
スコープ EJB クライアントコンテキストを有効にするかどうかを指定するブール値。デフォルトは、
false です。
true に設定された場合、EJB クライアントは JNDI コンテキストに割り当てられたスコープコンテキストを使用します。その他の場合、EJB クライアントコンテキストは JVM でグローバルセレクターを使用して、リモート EJB およびホストを呼び出すために使用されるプロパティーを決定します。
|
接続プロパティーは、接頭辞 remote.connection.CONNECTION_NAME で始まります。CONNECTION_NAME は、接続を一意に識別するためにのみ使用されるローカル ID です。
| プロパティー名 | 説明 |
|---|---|
remote.connections |
アクティブな
connection-names のカンマ区切りのリスト。各接続はこの名前を使用して設定されます。
|
|
接続のホスト名または IP。
|
|
接続のポート。デフォルト値は 4447 です。
|
|
接続セキュリティーを認証するために使用されるユーザー名。
|
|
ユーザーを認証するために使用されるパスワード
|
|
初期接続のタイムアウト時間。この時間が経過すると、再接続タスクにより、接続を確立できるかどうかが定期的に確認されます。値はミリ秒単位です。
|
| CallbackHandler クラスの完全修飾名。これは、接続を確立するために使用され、接続がオープンである限り変更できません。
|
channel.options.org.jboss.remoting3.RemotingOptions.MAX_OUTBOUND_MESSAGES
|
アウトバウンド要求の最大数を指定する整数値。デフォルト値は 80 です。
すべての呼び出しを処理するために、サーバーに対してクライアント (JVM) からの接続が 1 つだけあります。
|
connect.options.org.xnio.Options.SASL_POLICY_NOANONYMOUS
|
正常に接続するためにクライアントがクレデンシャルを提供する必要があるかどうかを決定するブール値。デフォルト値は
true です。
true に設定された場合、クライアントはクレデンシャルを提供する必要があります。false に設定された場合は、リモートコネクターがセキュリティーレルムを要求しない限り、呼び出しが許可されます。
|
connect.options.org.xnio.Options.SASL_DISALLOWED_MECHANISMS
|
接続作成中に認証に使用される特定の SASL メカニズムを無効にします。
JBOSS_LOCAL_USER の場合は、サイレント認証メカニズム (クライアントとサーバーが同じマシンにあるときに使用されます) が無効になります。
|
connect.options.org.xnio.Options.SASL_POLICY_NOPLAINTEXT
|
認証中のプレーンテキストメッセージの使用を有効または無効にするブール値。JAAS を使用する場合は、プレーンテキストパスワードを許可するために false に設定する必要があります。
|
connect.options.org.xnio.Options.SSL_ENABLED
|
この接続に対して SSL プロトコルが有効であるかどうかを指定するブール値。
|
connect.options.org.jboss.remoting3.RemotingOptions.HEARTBEAT_INTERVAL
|
自動的なクローズ (ファイアウォールの場合など) を回避するためにクライアントとサーバー間でハートビートを送信する間隔。値はミリ秒単位です。
|
初期接続でクラスター環境に接続する場合は、クラスターのトポロジーが自動的に非同期で受信されます。これらのプロパティーは、受信された各メンバーに接続するために使用されます。各プロパティーは、接頭辞 remote.cluster.CLUSTER_NAME で始まります。CLUSTER_NAME は、関連するサーバーの Infinispan サブシステム設定を参照します。
| プロパティー名 | 説明 |
|---|---|
clusternode.selector
| org.jboss.ejb.client.ClusterNodeSelector の実装の完全修飾名。
このクラス (
org.jboss.ejb.clientDeploymentNodeSelector ではない) は、クラスター環境で EJB 呼び出しを負荷分散するために使用されます。クラスターが完全にダウンしている場合、呼び出しは No ejb receiver available で失敗します。
|
channel.options.org.jboss.remoting3.RemotingOptions.MAX_OUTBOUND_MESSAGES
|
クラスター全体に対して実行できるアウトバウンド要求の最大数を指定する整数値。
|
node.NODE_NAME. channel.options.org.jboss.remoting3.RemotingOptions.MAX_OUTBOUND_MESSAGES
|
この特定のクラスターノードに対して実行できるアウトバウンド要求の最大数を指定する整数値。
|
7.6. コンテナインタープリター リンクのコピーリンクがクリップボードにコピーされました!
7.6.1. コンテナーインターセプター リンクのコピーリンクがクリップボードにコピーされました!
ejb-jar.xml ファイルで許可されたのと同じ XSD 要素が使用されます)。
EJB に設定されたコンテナーインターセプターは、JBoss EAP 6.1 がセキュリティーインターセプター、トランザクション管理インターセプター、他のサーバーにより提供されたインターセプターを提供する前に実行されることが保証されます。これにより、ユーザーアプリケーション固有コンテナーインターセプターは呼び出しが続行される前に関連するすべてのコンテキストデータを処理または設定できます。
コンテナーインターセプターは Java EE インターセプターに似ていますが、API セマンティクスでいくつかの違いがあります。たとえば、コンテナーインターセプターが javax.interceptor.InvocationContext.getTarget() メソッドを呼び出すことは禁止されています。これは、EJB コンポーネントがセットアップまたはインスタンス化されるよりかなり前にこれらのインターセプターが呼び出されるためです。
7.6.2. コンテナーインターセプタークラスの作成 リンクのコピーリンクがクリップボードにコピーされました!
コンテナーインターセプタークラスは、単純な Plain Old Java Object (POJO) です。@javax.annotation.AroundInvoke を使用して、Bean での呼び出し中に呼び出されるメソッドを指定します。
iAmAround メソッドをマークするコンテナーインターセプタークラスの例は次のとおりです。
例7.1 コンテナーインターセプタークラスの例
jboss-ejb3.xml ファイルを参照してください ( 「コンテナーインターセプターの設定」)。
7.6.3. コンテナーインターセプターの設定 リンクのコピーリンクがクリップボードにコピーされました!
コンテナーインターセプターは標準的な Java EE インターセプターライブラリーを使用します (つまり、3.1 バージョンの ejb-jar デプロイメント記述子用 ejb-jar.xml ファイルで許可されたのと同じ XSD 要素を使用します)。コンテナーインターセプターは標準的な Jave EE インターセプターライブラリーに基づくため、デプロイメント記述子を使用してのみ設定できます。これにより、アプリケーションは JBoss 固有のアノテーションまたは他のライブラリー依存関係を必要としなくなります。コンテナーインターセプターの詳細については、 「コンテナーインターセプター」を参照してください。
手順7.10 記述子ファイルを作成してコンテナーインターセプターを設定
- EJB デプロイメントの
META-INFディレクトリーでjboss-ejb3.xmlファイルを作成します。 - 記述子ファイルでコンテナーインターセプター要素を設定します。
urn:container-interceptors:1.0ネームスペースを使用してコンテナーインターセプター要素の設定を指定します。<container-interceptors>要素を使用してコンテナーインターセプターを指定します。<interceptor-binding>要素を使用してコンテナーインターセプターを EJB にバインドします。インターセプターは、以下のいずれかの方法でバインドできます。*ワイルドカードを使用して、デプロイメントのすべての EJB にインターセプターをバインドします。- 特定の EJB 名を使用して個別 Bean レベルでインターセプターをバインドします。
- EJB の特定のメソッドレベルでインターセプターをバインドします。
注記
これらの要素は、Java EE インターセプターの場合と同様に EJB 3.1 XSD を使用して設定されます。
- 上記の要素の例として以下の記述ファイルを参照してください。
例7.2 jboss-ejb3.xml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow urn:container-interceptors:1.0ネームスペース用の XSD はEAP_HOME/docs/schema/jboss-ejb-container-interceptors_1_0.xsdにあります。
7.6.4. セキュリティーコンテキスト ID の変更 リンクのコピーリンクがクリップボードにコピーされました!
デフォルトでは、アプリケーションサーバーにデプロイされた EJB にリモートコールを行う場合は、サーバーへの接続が認証され、この接続を介して受信されたすべての要求が、接続を認証した ID として実行されます。これは、クライアントとサーバー間のコールとサーバー間のコールの両方に適用されます。同じクライアントから異なる ID を使用する必要がある場合は、通常、サーバーに対して複数の接続を開き、各接続が異なる ID として認証されるようにする必要があります。複数のクライアント接続を開く代わりに、認証済みユーザーに別のユーザーとして要求を実行するパーミッションを与えることができます。
ejb-security-interceptors クイックスタートを参照してください。以下のコード例は、クイックスタートのコードを抜粋したものです。
手順7.11 セキュリティーコンテキストの ID の変更
クライアントサイドインターセプターを作成する
このインターセプターは、org.jboss.ejb.client.EJBClientInterceptorを実装する必要があります。インターセプターは、コンテキストデータマップを介して要求された ID を渡すことが期待されます。このコンテキストデータマップは、EJBClientInvocationContext.getContextData()への呼び出しを介して取得できます。クライアントサイドインターセプターの例は、以下のとおりです。Copy to Clipboard Copied! Toggle word wrap Toggle overflow ユーザーアプリケーションは、以下のいずれかの方法でEJBClientContextのインターセプターに接続できます。プログラミング
この方法では、org.jboss.ejb.client.EJBClientContext.registerInterceptor(int order, EJBClientInterceptor interceptor)API を呼び出し、orderおよびinterceptorインスタンスを渡します。orderは、このinterceptorが置かれるクライアントインターセプターチェーンの位置を決定するために使用されます。ServiceLoader メカニズム
この方法では、META-INF/services/org.jboss.ejb.client.EJBClientInterceptorファイルを作成し、クライアントアプリケーションのクラスパスに配置またはパッケージ化する必要があります。ファイルのルールは、Java ServiceLoader メカニズムにより決まります。このファイルでは、EJB クライアントインターセプター実装の完全修飾名が各行に含まれることが期待されます。EJB クライアントインターセプタークラスがクラスパスで利用可能である必要があります。ServiceLoaderメカニズムを使用して追加された EJB クライアントインターセプターは、クライアントインターセプターチェーンの最後に、クラスパスに指定された順序で追加されます。ejb-security-interceptorsクイックスタートでは、この方法が使用されます。
サーバーサイドコンテナーインターセプターを作成および設定する
コンテナーインターセプタークラスは、単純な Plain Old Java Object (POJO) です。@javax.annotation.AroundInvokeを使用して、Bean での呼び出し中に呼び出されるメソッドを指定します。コンテナーインターセプターの詳細については、 「コンテナーインターセプター」を参照してください。コンテナーインターセプターを作成する
このインターセプターは、ID でInvocationContextを受け取り、切り替えを要求します。実際のコード例を抜き出したものは以下のとおりです。Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注記
上記のコード例は、JBoss EAP プライベート API の一部である org.jboss.as.controller.security.SubjectUserInfo と org.jboss.as.domain.management.security.RealmUser の 2 つのクラスを使用します。パブリック API は EAP 6.3 で利用可能になる予定です。プライベートクラスは廃止されますが、EAP 6.x のリリースサイクルが終了するまで維持され、使用可能です。コンテナーインターセプターを設定する
サーバーサイドコンテナーインターセプターの設定方法については、 「コンテナーインターセプターの設定」を参照してください。
JAAS LoginModule を作成する
このコンポーネントは、ユーザが要求された ID として要求を実行することが許可されていることを確認します。以下のコード例は、ログインと検証を実行するメソッドを示しています。Copy to Clipboard Copied! Toggle word wrap Toggle overflow Copy to Clipboard Copied! Toggle word wrap Toggle overflow
README ファイルを参照してください。
7.6.5. EJB 認証のために追加セキュリティーを提供する リンクのコピーリンクがクリップボードにコピーされました!
デフォルトでは、アプリケーションサーバーにデプロイされた EJB にリモートコールを行う場合は、サーバーへの接続が認証され、この接続を介して受信されたすべての要求が、接続を認証したクレデンシャルを使用して実行されます。接続レベルでの認証は、基礎となる SASL (Simple Authentication and Security Layer) の機能に依存します。カスタム SASL メカニズムを記述する代わりに、サーバーに対する接続を開いて認証し、EJB を呼び出す前にセキュリティートークンを追加できます。このトピックでは、EJB 認証のために既存のクライアント接続で追加情報を渡す方法について説明します。
手順7.12 EJB 認証のためにセキュリティー情報を渡す
クライアントサイドインターセプターを作成する
このインターセプターは、org.jboss.ejb.client.EJBClientInterceptorを実装する必要があります。インターセプターは、コンテキストデータマップを介して追加セキュリティートークンを渡すことが期待されます。このコンテキストデータマップは、EJBClientInvocationContext.getContextData()への呼び出しを介して取得できます。追加セキュリティートークンを作成するクライアントサイドインターセプターコードの例は、以下のとおりです。Copy to Clipboard Copied! Toggle word wrap Toggle overflow クライアントインターセプターをアプリケーションに接続する方法については、 「アプリケーションでのクライアントサイドインターセプターの使用」を参照してください。サーバーサイドコンテナーインターセプターを作成および設定する
コンテナーインターセプタークラスは、単純な Plain Old Java Object (POJO) です。@javax.annotation.AroundInvokeを使用して、Bean での呼び出し中に呼び出されるメソッドを指定します。コンテナーインターセプターの詳細については、 「コンテナーインターセプター」を参照してください。コンテナーインターセプターを作成する
このインターセプターは、コンテキストからセキュリティー認証トークンを取得し、認証のために JAAS (Java Authentication and Authorization Service) ドメインに渡します。コンテナーインターセプターコードの例は以下のとおりです。Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注記
上記のコード例は、JBoss EAP プライベート API の一部である org.jboss.as.controller.security.SubjectUserInfo と org.jboss.as.domain.management.security.RealmUser の 2 つのクラスを使用します。パブリック API は EAP 6.3 で利用可能になる予定です。プライベートクラスは廃止されますが、EAP 6.x のリリースサイクルが終了するまで維持され、使用可能です。コンテナーインターセプターを設定する
サーバーサイドコンテナーインターセプターの設定方法については、 「コンテナーインターセプターの設定」を参照してください。
JAAS LoginModule を作成する
このカスタムモジュールは、既存の認証済み接続情報と追加セキュリティートークンを使用して認証を実行します。追加セキュリティートークンを使用し、認証を実行するコードの例は以下のとおりです。Copy to Clipboard Copied! Toggle word wrap Toggle overflow カスタム LoginModule をチェーンに追加する
新しいカスタム LoginModule はチェーンの正しい場所に追加して正しい順序で呼び出されるようにする必要があります。この例では、SaslPlusLoginModuleは、password-stackingオプションセットでロールをロードする LoginModule の前にチェーンする必要があります。管理 CLI を使用して LoginModule 順序を設定する
password-stackingオプションを設定するRealmDirectLoginModule の前にカスタムSaslPlusLoginModuleをチェーンする管理 CLI コマンドの例は以下のとおりです。管理 CLI の詳細については、カスタマーポータル (https://access.redhat.com/site/documentation/JBoss_Enterprise_Application_Platform/) にある JBoss EAP 6 向け 『管理および設定ガイド』 の章「管理インターフェース」を参照してください。[standalone@localhost:9999 /] ./subsystem=security/security-domain=quickstart-domain:add(cache-type=default)[standalone@localhost:9999 /] ./subsystem=security/security-domain=quickstart-domain/authentication=classic:add[standalone@localhost:9999 /] ./subsystem=security/security-domain=quickstart-domain/authentication=classic/login-module=DelegationLoginModule:add(code=org.jboss.as.quickstarts.ejb_security_plus.SaslPlusLoginModule,flag=optional,module-options={password-stacking=useFirstPass})[standalone@localhost:9999 /] ./subsystem=security/security-domain=quickstart-domain/authentication=classic/login-module=RealmDirect:add(code=RealmDirect,flag=required,module-options={password-stacking=useFirstPass})[standalone@localhost:9999 /] ./subsystem=security/security-domain=quickstart-domain:add(cache-type=default)[standalone@localhost:9999 /] ./subsystem=security/security-domain=quickstart-domain/authentication=classic:add[standalone@localhost:9999 /] ./subsystem=security/security-domain=quickstart-domain/authentication=classic/login-module=DelegationLoginModule:add(code=org.jboss.as.quickstarts.ejb_security_plus.SaslPlusLoginModule,flag=optional,module-options={password-stacking=useFirstPass})[standalone@localhost:9999 /] ./subsystem=security/security-domain=quickstart-domain/authentication=classic/login-module=RealmDirect:add(code=RealmDirect,flag=required,module-options={password-stacking=useFirstPass})Copy to Clipboard Copied! Toggle word wrap Toggle overflow LoginModule 順序を手動で設定する
以下に、サーバー設定ファイルのsecurityサブシステムで LoginModule 順序を設定する XML の例を示します。カスタムSaslPlusLoginModuleはRealmDirectLoginModule より前に指定してユーザーロールがロードされ、password-stackingオプションが設定される前にリモートユーザーを確認できるようにする必要があります。Copy to Clipboard Copied! Toggle word wrap Toggle overflow
リモートクライアントを作成する
以下のコード例では、上記の JAAS LoginModule によりアクセスされるadditional-secret.propertiesファイルに以下のプロパティーが含まれることを前提とします。quickstartUser=7f5cc521-5061-4a5b-b814-bdc37f021acc
quickstartUser=7f5cc521-5061-4a5b-b814-bdc37f021accCopy to Clipboard Copied! Toggle word wrap Toggle overflow 以下のコードは、EJB 呼び出しの前にセキュリティートークンを作成し、設定する方法を示しています。シークレットトークンはデモ目的のためにのみハードコーディングされています。このクライアントは、単に結果をコンソールに出力します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow
7.6.6. アプリケーションでのクライアントサイドインターセプターの使用 リンクのコピーリンクがクリップボードにコピーされました!
プログラミングまたは ServiceLoader メカニズムを使用して、クライアントサイドインターセプターをアプリケーションに接続できます。この 2 つの方法の詳細は以下のとおりです。
手順7.13 インターセプターを接続する
プログラミング
この方法では、org.jboss.ejb.client.EJBClientContext.registerInterceptor(int order, EJBClientInterceptor interceptor)API を呼び出し、orderおよびinterceptorインスタンスを渡します。orderは、このinterceptorが置かれるクライアントインターセプターチェーンの位置を決定するために使用されます。ServiceLoader メカニズム
この方法では、META-INF/services/org.jboss.ejb.client.EJBClientInterceptorファイルを作成し、クライアントアプリケーションのクラスパスに配置またはパッケージ化する必要があります。ファイルのルールは、Java ServiceLoader メカニズムにより決まります。このファイルでは、EJB クライアントインターセプター実装の完全修飾名が各行に含まれることが期待されます。EJB クライアントインターセプタークラスがクラスパスで利用可能である必要があります。ServiceLoaderメカニズムを使用して追加された EJB クライアントインターセプターは、クライアントインターセプターチェーンの最後に、クラスパスに指定された順序で追加されます。
7.7. クラスター化された Enterprise JavaBeans リンクのコピーリンクがクリップボードにコピーされました!
7.7.1. クラスター化された Enterprise JavaBean (EJB) リンクのコピーリンクがクリップボードにコピーされました!
注記
7.8. 参考資料 リンクのコピーリンクがクリップボードにコピーされました!
7.8.1. EJB JNDI の名前に関する参考資料 リンクのコピーリンクがクリップボードにコピーされました!
ejb:<appName>/<moduleName>/<distinctName>/<beanName>!<viewClassName>?stateful
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 EAP 6 では、各デプロイメントが任意の個別名を指定することができます。デプロイメントの個別名がない場合は空白のままにしておきます。
<beanName>- Bean 名は呼び出されるセッション Bean のクラス名です。
<viewClassName>- ビュークラス名はリモートインターフェースの完全修飾クラス名です。インターフェースのパッケージ名が含まれます。
?stateful- JNDI 名がステートフルセッション Bean を参照する時に
?statefulサフィックスが必要となります。他の Bean タイプでは含まれていません。
7.8.2. EJB 参照の解決 リンクのコピーリンクがクリップボードにコピーされました!
@EJB や @Resource を実装する方法について説明します。XML は常にアノテーションを上書きしますが、同じルールが適用されることに注意してください。
@EJB アノテーションのルール
@EJBアノテーションはmappedName()属性を持っています。仕様はこのベンダー固有のメタデータを無視しますが、 JBoss は参照しているEJBのグローバル JNDI 名としてmappedName()を認識します。mappedName()を指定した場合、他の属性はすべて無視され、このグローバル JNDI 名がバインディングに使用されます。- 以下のように属性を定義せずに
@EJBを指定するとします。@EJB ProcessPayment myEjbref;
@EJB ProcessPayment myEjbref;Copy to Clipboard Copied! Toggle word wrap Toggle overflow この場合、次のルールが適用されます。- 参照する 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 仕様を参照してください。
7.8.3. リモート EJB クライアントのプロジェクト依存関係 リンクのコピーリンクがクリップボードにコピーされました!
| GroupID | ArtifactID |
|---|---|
| org.jboss.spec | jboss-javaee-6.0 |
| org.jboss.as | jboss-as-ejb-client-bom |
| 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 |
| org.jboss.xnio | xnio-api |
| org.jboss.xnio | xnio-nio |
| org.jboss.remoting3 | jboss-remoting |
| org.jboss.sasl | jboss-sasl |
| org.jboss.marshalling | jboss-marshalling-river |
jboss-javaee-6.0 と jboss-as-ejb-client-bom を除き、これらの依存関係を pom.xml ファイルの <dependencies> セクションに追加する必要があります。
jboss-javaee-6.0 と jboss-as-ejb-client-bom の依存関係は、スコープが import の pom.xml の <dependencyManagement> セクションに追加する必要があります。
注記
artifactID のバージョンは変更される可能性があります。該当バージョンについては、Maven リポジトリーを参照してください。
remote-ejb/client/pom.xml を参照してください。
7.8.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"
xmlns:c="urn:clustering:1.0"Copy to Clipboard Copied! Toggle word wrap Toggle overflow これにより、EJB がクラスター化されているとマーク付けすることができます。これは@org.jboss.ejb3.annotation.Clusteredに相当するデプロイメント記述子です。<c:clustering> <ejb-name>DDBasedClusteredSFSB</ejb-name> <c:clustered>true</c:clustered> </c:clustering>
<c:clustering> <ejb-name>DDBasedClusteredSFSB</ejb-name> <c:clustered>true</c:clustered> </c:clustering>Copy to Clipboard Copied! Toggle word wrap Toggle overflow - セキュリティー名前空間 (
urn:security) xmlns:s="urn:security"
xmlns:s="urn:security"Copy to Clipboard Copied! Toggle word wrap Toggle overflow これにより、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>
<s:security> <ejb-name>*</ejb-name> <s:security-domain>myDomain</s:security-domain> <s:run-as-principal>myPrincipal</s:run-as-principal> </s:security>Copy to Clipboard Copied! Toggle word wrap Toggle overflow - リソースアダプター名前空間:
urn:resource-adapter-binding xmlns:r="urn:resource-adapter-binding"
xmlns:r="urn:resource-adapter-binding"Copy to Clipboard Copied! Toggle word wrap Toggle overflow これにより、メッセージ駆動型 Bean にリソースアダプターを設定できます。<r:resource-adapter-binding> <ejb-name>*</ejb-name> <r:resource-adapter-name>myResourceAdaptor</r:resource-adapter-name> </r:resource-adapter-binding>
<r:resource-adapter-binding> <ejb-name>*</ejb-name> <r:resource-adapter-name>myResourceAdaptor</r:resource-adapter-name> </r:resource-adapter-binding>Copy to Clipboard Copied! Toggle word wrap Toggle overflow - IIOP 名前空間:
urn:iiop xmlns:u="urn:iiop"
xmlns:u="urn:iiop"Copy to Clipboard Copied! Toggle word wrap Toggle overflow IIOP 名前空間には IIOP が設定されます。- プール名前空間:
urn:ejb-pool:1.0 xmlns:p="urn:ejb-pool:1.0"
xmlns:p="urn:ejb-pool:1.0"Copy to Clipboard Copied! Toggle word wrap Toggle overflow これにより、含まれるステートレスセッション Bean やメッセージ駆動型 Bean によって使用されるプールを選択できます。プールはサーバー設定で定義されます。<p:pool> <ejb-name>*</ejb-name> <p:bean-instance-pool-ref>my-pool</p:bean-instance-pool-ref> </p:pool>
<p:pool> <ejb-name>*</ejb-name> <p:bean-instance-pool-ref>my-pool</p:bean-instance-pool-ref> </p:pool>Copy to Clipboard Copied! Toggle word wrap Toggle overflow - キャッシュ名前空間:
urn:ejb-cache:1.0 xmlns:c="urn:ejb-cache:1.0"
xmlns:c="urn:ejb-cache:1.0"Copy to Clipboard Copied! Toggle word wrap Toggle overflow これにより、含まれるステートフルセッション Bean によって使用されるキャッシュを選択できます。キャッシュはサーバー設定で定義されます。<c:cache> <ejb-name>*</ejb-name> <c:cache-ref>my-cache</c:cache-ref> </c:cache>
<c:cache> <ejb-name>*</ejb-name> <c:cache-ref>my-cache</c:cache-ref> </c:cache>Copy to Clipboard Copied! Toggle word wrap Toggle overflow
例7.3 jboss-ejb3.xml ファイルの例
第8章 Web アプリケーションのクラスター化 リンクのコピーリンクがクリップボードにコピーされました!
8.1. セッションレプリケーション リンクのコピーリンクがクリップボードにコピーされました!
8.1.1. HTTP セッションレプリケーション リンクのコピーリンクがクリップボードにコピーされました!
8.1.2. Web セッションキャッシュ リンクのコピーリンクがクリップボードにコピーされました!
standalone-ha.xml プロファイルを含むいずれかの HA プロファイル、管理対象ドメインプロファイル ha または full-ha を使用するときに設定できます。最も一般的に設定される要素は、キャッシュモードと分散キャッシュのキャッシュオーナーの数です。
キャッシュモードは、REPL (デフォルト値) または DIST のいずれかになります。
- REPL
REPLモードでは、クラスターの他のノードそれぞれにキャッシュ全体がレプリケートされます。これは、最も安全なオプションですが、オーバーヘッドが増加します。- DIST
DISTモードは、以前の実装で提供されたバディモードに似ています。このモードでは、ownersパラメーターで指定された数のノードにキャッシュを分散することによりオーバーヘッドが削減されます。オーナーのこの数のデフォルト値は2です。
owners パラメーターは、セッションのレプリケートされたコピーを保持するクラスターノード数を制御します。デフォルト値は、2 です。
8.1.3. Web セッションキャッシュの設定 リンクのコピーリンクがクリップボードにコピーされました!
REPL です。DIST モードを使用する場合は、管理 CLI で次の 2 つのコマンドを実行します。異なるプロファイルを使用する場合は、コマンドでプロファイル名を変更します。スタンドアロンサーバーを使用する場合は、コマンドの /profile=ha 部分を削除します。
手順8.1 Web セッションキャッシュの設定
デフォルトキャッシュモードを
DISTに変更します。/profile=ha/subsystem=infinispan/cache-container=web/:write-attribute(name=default-cache,value=dist)
/profile=ha/subsystem=infinispan/cache-container=web/:write-attribute(name=default-cache,value=dist)Copy to Clipboard Copied! Toggle word wrap Toggle overflow 分散キャッシュのオーナー数を設定します。
以下のコマンドでは、5つのオーナーが設定されます。デフォルト値は2です。/profile=ha/subsystem=infinispan/cache-container=web/distributed-cache=dist/:write-attribute(name=owners,value=5)
/profile=ha/subsystem=infinispan/cache-container=web/distributed-cache=dist/:write-attribute(name=owners,value=5)Copy to Clipboard Copied! Toggle word wrap Toggle overflow デフォルトキャッシュモードを
REPLに戻します。/profile=ha/subsystem=infinispan/cache-container=web/:write-attribute(name=default-cache,value=repl)
/profile=ha/subsystem=infinispan/cache-container=web/:write-attribute(name=default-cache,value=repl)Copy to Clipboard Copied! Toggle word wrap Toggle overflow サーバーの再起動
Web キャッシュモードの変更後は、サーバーを再起動する必要があります。
サーバーでセッションレプリケーションが設定されます。独自のアプリケーションでセッションレプリケーションを使用するには、「アプリケーションにおけるセッションレプリケーションの有効化」を参照してください。
8.1.4. アプリケーションにおけるセッションレプリケーションの有効化 リンクのコピーリンクがクリップボードにコピーされました!
JBoss EAP 6 の高可用性 (HA) 機能を利用するには、アプリケーションが配布可能になるよう設定する必要があります。ここでは配布可能にする手順を説明した後、使用可能な高度な設定オプションの一部について解説します。
手順8.2 アプリケーションを配布可能にする
要件: アプリケーションが配布可能であることを示します。
アプリケーションが配布可能になっていないと、セッションが配布されません。アプリケーションのweb.xml記述子ファイルの<web-app>タグ内に<distributable/>要素を追加します。例は次のとおりです。例8.1 配布可能なアプリケーションの最低限の設定
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 希望する場合はデフォルトのレプリケーション動作を変更します。
セッションレプリケーションに影響する値を変更したい場合は、<jboss-web>要素の子要素である<replication-config>要素内で値を上書きします。デフォルトを上書きしたい場合のみ、指定の要素が含まれるようにします。以下の例に、全デフォルト設定の一覧と、最も一般的に変更されるオプションを説明する表を示します。例8.2 デフォルトの
<replication-config>値Copy to Clipboard Copied! Toggle word wrap Toggle overflow
|
オプション
|
説明
|
|---|---|
<replication-trigger>
|
クラスター全体でセッションデータのレプリケーションが引き起こされるのはどのような状態であるかを制御します。セッション属性として保存された可変オブジェクトがセッションからアクセスされた後、メソッド
setAttribute() が直接呼び出されない限り、オブジェクトが変更されレプリケーションが必要であるかをコンテナは明確に認識できないため、このオプションは必須となります。
設定に関係なく、
setAttribute() を呼び出すと常にセッションレプリケーションが引き起こされます。
|
<replication-granularity>
|
レプリケートされるデータの細かさを決定します。デフォルトは
SESSION ですが、ATTRIBUTE を設定すると、ほとんどの属性は変更されずにセッションのパフォーマンスを向上することができます。
|
|
オプション
|
説明
|
|---|---|
<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 へサーブレット仕様の通知が送信されたかどうかを管理します。
|
8.2. HttpSession の非活性化および活性化 リンクのコピーリンクがクリップボードにコピーされました!
8.2.1. HTTP セッションパッシベーションおよびアクティベーション リンクのコピーリンクがクリップボードにコピーされました!
- コンテナが新規セッションの作成を要求する時に現在アクティブなセッションの数が設定上限を越えている場合、サーバーはセッションの一部をパッシベートして新規セッションを作成できるようにします。
- 設定された間隔で、定期的にバックグラウンドタスクがセッションをパッシベートすべきかをチェックします。
- ある Web アプリケーションがデプロイされ、他のサーバーでアクティブなセッションのバックアップコピーが、この Web アプリケーションのセッションマネージャーによって取得された場合、セッションはパッシベートされることがあります。
- セッションが、アイドル時間の設定上限を越えた期間使用されていない。
- アクティブなセッションの数が設定上限を越えず、セッションがアイドル時間の設定下限を超えていない。
8.2.2. アプリケーションにおける HttpSession パッシベーションの設定 リンクのコピーリンクがクリップボードにコピーされました!
HttpSession パッシベーションはアプリケーションの WEB_INF/jboss-web.xml ファイルまたは META_INF/jboss-web.xml ファイルで設定されます。
例8.3 jboss-web.xml ファイルの例
パッシベーション設定要素
<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> を設定してください。また、他のノードからレプリケートされるセッションの数は、REPL または DIST キャッシュモードが有効であるかどうかによっても異なります。REPL キャッシュモードでは、各セッションは各ノードにレプリケートされます。DIST キャッシュモードでは、各セッションは、owner パラメーターによって指定された数のノードにのみレプリケートされます。セッションキャッシュモードの設定については、「Web セッションキャッシュ」および「Web セッションキャッシュの設定」を参照してください。
REPL キャッシュモードでは、各ノードはメモリーに 800 のセッションを保存します。DIST キャッシュモードが有効であり、デフォルトの owners 設定が 2 である場合、各ノードはメモリーに 200 のセッションを保存します。
8.3. クッキードメイン リンクのコピーリンクがクリップボードにコピーされました!
8.3.1. クッキードメイン リンクのコピーリンクがクリップボードにコピーされました!
/ です。これは、発行ホストのみがクッキーの内容を読み取りできます。特定のクッキードメインを設定すると、さまざまなホストがクッキーの内容を読み取ることができるようになります。クッキードメインの設定は「クッキードメインの設定」を参照してください。
8.3.2. クッキードメインの設定 リンクのコピーリンクがクリップボードにコピーされました!
http://app1.xyz.com および http://app2.xyz.com 上のアプリケーションが SSO コンテキストを共有できるようにします。
例8.4 クッキードメインの設定例
<Valve className="org.jboss.web.tomcat.service.sso.ClusteredSingleSignOn"
cookieDomain="xyz.com" />
<Valve className="org.jboss.web.tomcat.service.sso.ClusteredSingleSignOn"
cookieDomain="xyz.com" />
8.4. HA シングルトンの実装 リンクのコピーリンクがクリップボードにコピーされました!
JBoss EAP 5 では、HA シングルトンアーカイブは他のデプロイメントとは別に deploy-hasingleton/ ディレクトリーにデプロイされていました。これは自動デプロイメントが発生しないようにするためで、また確実に HASingletonDeployer サービスがデプロイメントを制御し、クラスターのマスターノードのみにアーカイブがデプロイされるようにするための処置でした。ホットデプロイメント機能がなかったため、再デプロイメントにはサーバーの再起動が必要でした。また、マスターノードに障害が発生し、他のノードがマスターとして引き継ぐ必要がある場合、シングルトンサービスはサービスを提供するためにデプロイメントプロセス全体を実行する必要がありました。
手順8.3 HA シングルトンサービスの実装
HA シングルトンサービスアプリケーションを作成します。
シングルトンサービスとしてデプロイされる SingletonService デコレーターでラッピングされたサービスの簡単な例は次のとおりです。シングルトンサービスを作成します。
以下のリストは、シングルトンサービスの例です。Copy to Clipboard Copied! Toggle word wrap Toggle overflow サーバー起動時にサービスを SingletonService として起動するためにシングルトン EJB を作成します。
以下のリストは、サーバー起動時に SingletonService を起動するシングルトン EJB の例です。Copy to Clipboard Copied! Toggle word wrap Toggle overflow クライアントよりサービスへアクセスするためステートレスセッション Bean を作成します。
以下は、クライアントからサービスにアクセスするステートレスセッション Bean の例です。Copy to Clipboard Copied! Toggle word wrap Toggle overflow SingletonService のビジネスロジックインターフェースを作成します。
以下は、SingletonService に対するビジネスロジックインターフェースの例です。Copy to Clipboard Copied! Toggle word wrap Toggle overflow
クラスタリングが有効な状態で各 JBoss EAP 6 インスタンスを起動します。
クラスターを有効化する方法は、サーバーがスタンドアローンであるか管理対象ドメインで実行されているかによって異なります。管理対象ドメインで実行されているサーバーに対してクラスタリングを有効にします。
管理 CLI を使用してクラスタリングを有効にするか、設定ファイルを手動で編集できます。管理 CLI を使用してクラスタリングを有効にします。
ドメインコントローラーを起動します。
オペレーティングシステムのコマンドプロンプトを開きます。
ドメインコントローラーの IP アドレスまたは DNS 名を渡して管理 CLI に接続します。
この例では、ドメインコントローラーの IP アドレスが192.168.0.14であることを前提とします。- Linux の場合は、コマンドラインで以下を入力します。
EAP_HOME/bin/jboss-cli.sh --connect --controller=192.168.0.14
$ EAP_HOME/bin/jboss-cli.sh --connect --controller=192.168.0.14Copy to Clipboard Copied! Toggle word wrap Toggle overflow - Windows の場合は、コマンドラインで以下を入力します。
C:\>EAP_HOME\bin\jboss-cli.bat --connect --controller=192.168.0.14
C:\>EAP_HOME\bin\jboss-cli.bat --connect --controller=192.168.0.14Copy to Clipboard Copied! Toggle word wrap Toggle overflow
次の応答が表示されるはずです。Connected to domain controller at 192.168.0.14
Connected to domain controller at 192.168.0.14Copy to Clipboard Copied! Toggle word wrap Toggle overflow main-serverサーバーグループを追加します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow server-oneという名前のサーバーを作成し、main-serverサーバーグループに追加します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow main-serverサーバーグループに対して JVM を設定します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow server-twoという名前のサーバーを作成し、別のサーバーグループに置き、ポートオフセットを 100 に設定します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow
サーバー設定ファイルを手動で編集してクラスタリングを有効にします。
JBoss EAP 6 サーバーを停止します。
重要
変更がサーバーの再起動後にも維持されるようにするには、サーバー設定ファイルの編集前にサーバーを停止する必要があります。domain.xml設定ファイルを開いて編集します。haプロファイルとha-socketsソケットバインディンググループを使用するサーバーグループを指定します。例は次のとおりです。Copy to Clipboard Copied! Toggle word wrap Toggle overflow host.xml設定ファイルを開いて編集します。以下のようにファイルを変更します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow サーバーを起動します。
- 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
第9章 CDI リンクのコピーリンクがクリップボードにコピーされました!
9.1. CDI の概要 リンクのコピーリンクがクリップボードにコピーされました!
9.1.1. CDI の概要 リンクのコピーリンクがクリップボードにコピーされました!
9.1.2. コンテキストと依存性の注入 (CDI) リンクのコピーリンクがクリップボードにコピーされました!
9.1.3. CDI の利点 リンクのコピーリンクがクリップボードにコピーされました!
- CDI を使用すると、多くのコードをアノテーションに置き換えることにより、コードベースが単純化および削減されます。
- CDI は柔軟であり、CDI を使用すると、インジェクションおよびイベントを無効または有効にしたり、代替の Bean を使用したり、非 CDI オブジェクトを簡単にインジェクトしたりできます。
- CDI で古いコードを使用することは簡単です。これを行うには
beans.xmlをMETA-INF/またはWEB-INF/ディレクトリーに配置します。このファイルは空白である場合があります。 - CDI を使用すると、パッケージ化とデプロイメントが簡略化され、デプロイメントに追加する必要がある XML の量が減少します。
- CDI により、コンテキストを使用したライフサイクル管理が提供されます。インジェクションを要求、セッション、会話、またはカスタムコンテキストに割り当てできます。
- また、CDI により、文字列ベースのインジェクションよりも安全かつ簡単にデバッグを行える、タイプセーフな依存性の注入が提供されます。
- CDI はインターセプターと Bean を切り離します。
- CDI では、複雑なイベント通知も提供されます。
9.1.4. タイプセーフの依存性の注入 リンクのコピーリンクがクリップボードにコピーされました!
9.1.5. Weld、Seam 2、および JavaServer Faces 間の関係 リンクのコピーリンクがクリップボードにコピーされました!
9.2. CDI の使用 リンクのコピーリンクがクリップボードにコピーされました!
9.2.1. 最初の手順 リンクのコピーリンクがクリップボードにコピーされました!
9.2.1.1. CDI の有効化 リンクのコピーリンクがクリップボードにコピーされました!
コンテキストと依存性の注入 (CDI: Contexts and Dependency Injection) は、JBoss EAP 6 の中核的なテクノロジーの 1 つであり、デフォルトで有効になります。何らかの理由で無効になっている場合は、以下の手順に従って有効にする必要があります。
手順9.1 JBoss EAP 6 での CDI の有効化
設定ファイルで、CDI サブシステムの詳細がコメントアウトされているかどうかを確認します。
サブシステムは、domain.xmlまたはstandalone.xml設定ファイルの該当するセクションをコメントアウトするか、該当するセクション全体を削除することにより、無効にできます。EAP_HOME/domain/configuration/domain.xmlまたはEAP_HOME/standalone/configuration/standalone.xmlで CDI サブシステムを検索するには、以下の文字列を検索します。この文字列が存在する場合、<extensions> セクション内部に存在します。<extension module="org.jboss.as.weld"/>
<extension module="org.jboss.as.weld"/>Copy to Clipboard Copied! Toggle word wrap Toggle overflow また、使用しているプロファイルに以下の行が含まれている必要があります。プロファイルは、<profiles> セクション内の個別の <profile> 要素です。<subsystem xmlns="urn:jboss:domain:weld:1.0"/>
<subsystem xmlns="urn:jboss:domain:weld:1.0"/>Copy to Clipboard Copied! Toggle word wrap Toggle overflow ファイルを編集する前に、JBoss EAP 6 を停止します。
JBoss EAP 6 により実行中に設定ファイルが変更されるため、設定ファイルを直接編集する前にサーバーを停止する必要があります。CDI サブシステムを復元するよう設定ファイルを編集します。
CDI サブシステムがコメントアウトされている場合は、コメントを削除します。CDI サブシステムが完全に削除されたら、次の行を、</extensions> タグのすぐ上にある新しい行に追加することにより、CDI サブシステムを復元します。<extension module="org.jboss.as.weld"/>
<extension module="org.jboss.as.weld"/>Copy to Clipboard Copied! Toggle word wrap Toggle overflow - さらに、以下の行を <profiles> セクションの関係するプロファイルに追加する必要があります。
<subsystem xmlns="urn:jboss:domain:weld:1.0"/>
<subsystem xmlns="urn:jboss:domain:weld:1.0"/>Copy to Clipboard Copied! Toggle word wrap Toggle overflow JBoss EAP 6 を再起動します。
更新された設定で JBoss EAP 6 を起動します。
JBoss EAP 6 は、CDI サブシステムが有効になった状態で起動します。
9.2.2. CDI を使用したアプリケーションの開発 リンクのコピーリンクがクリップボードにコピーされました!
9.2.2.1. CDI を使用したアプリケーションの開発 リンクのコピーリンクがクリップボードにコピーされました!
コンテキストと依存性の注入 (CDI: Contexts and Dependency Injection) を使用すると、アプリケーションの開発、コードの再利用、デプロイメント時または実行時のコードの調整、およびユニットテストを非常に柔軟に実行できます。JBoss EAP 6 には、CDI の参照実装である Weld が含まれます。これらのタスクは、エンタープライズアプリケーションで CDI を使用する方法を示しています。
9.2.2.2. 既存のコードでの CDI の使用 リンクのコピーリンクがクリップボードにコピーされました!
META-INF/ または WEB-INF/ ディレクトリーにある beans.xml という名前のファイルのみです。このファイルは空白の場合があります。
手順9.2 CDI アプリケーションでのレガシー Bean の使用
Bean をアーカイブにパッケージ化します。
Bean を JAR または WAR アーカイブにパッケージ化します。beans.xmlファイルをアーカイブに含めます。beans.xmlファイルを JAR アーカイブのMETA-INF/ディレクトリーまたは WAR アーカイブのWEB-INF/ディレクトリーに配置します。このファイルは空白の場合があります。
これらの Bean を CDI で使用できます。コンテナは、Bean のインスタンスを作成および破棄し、指定されたコンテキストに関連付け、他の Bean にインジェクトし、EL 式で使用して、修飾子アノテーションで特殊化し、インターセプターとデコレーターをこれらに追加できます (既存のコードを変更しません)。状況によっては、いくつかのアノテーションを追加する必要がある場合があります。
9.2.2.3. スキャンプロセスからの Bean の除外 リンクのコピーリンクがクリップボードにコピーされました!
Weld の機能の 1 つである JBoss EAP 6 の CDI 実装は、スキャンからアーカイブのクラスを除外する機能であり、コンテナライフサイクルイベントを発生させ、Bean としてデプロイされます。これは、JSR-299 仕様の一部ではありません。
例9.1 Bean からのパッケージの除外
- 最初のタグでは、すべての Swing クラスが除外されます。
- 2 番目のタグでは、Google Web Toolkit がインストールされていない場合に Google Web Toolkit クラスが除外されます。
- 3 番目のタグでは、文字列
Blether(通常の式を使用) で終了するクラスが除外されます (システムプロパティー verbosity がlowに設定されている場合)。 - 4 番目のタグでは、Java Server Faces (JSF) クラスが除外されます (Wicket クラスが存在し、viewlayer システムプロパティーが設定されてない場合)。
9.2.2.4. インジェクションを使用した実装の拡張 リンクのコピーリンクがクリップボードにコピーされました!
インジェクションを使用して、既存のコードの機能を追加または変更できます。この例は、既存のクラスに翻訳機能を追加する方法を示しています。翻訳機能は架空の機能であり、例での実装方法は擬似コードで、説明を目的としています。
buildPhrase を持つ Welcome クラスがすでにあることを前提とします。buildPhrase メソッドは、都市の名前を引数として取得し、"Welcome to Boston." などのフレーズを出力します。ここでの目標は、このような挨拶を別の言語に翻訳できる Welcome クラスのバージョンを作成することです。
例9.2 Translator Bean を Welcome クラスにインジェクトする
Translator オブジェクトを Welcome クラスにインジェクトします。Translator オブジェクトは、文をある言語から別の言語に翻訳できる EJB ステートレス Bean または別のタイプの Bean になります。この例では、挨拶全体を翻訳するために Translator が使用されます。元の Welcome クラスは実際にはまったく変更されません。Translator は、buildPhrase メソッドが実装される前にインジェクトされます。
9.2.3. あいまいな依存関係または満たされていない依存関係 リンクのコピーリンクがクリップボードにコピーされました!
9.2.3.1. 依存関係があいまいな場合、あるいは満たされていない場合 リンクのコピーリンクがクリップボードにコピーされました!
- インジェクションポイントの Bean 型を実装する全 Bean にある修飾子アノテーションを解決します。
- 無効となっている Bean をフィルタリングします。無効な Bean とは、明示的に有効化されていない @Alternative Bean のことです。
9.2.3.2. 修飾子 リンクのコピーリンクがクリップボードにコピーされました!
例9.3 @Synchronous 修飾子と @Asynchronous 修飾子の定義
@Qualifier
@Retention(RUNTIME)
@Target({TYPE, METHOD, FIELD, PARAMETER})
public @interface Synchronous {}
@Qualifier
@Retention(RUNTIME)
@Target({TYPE, METHOD, FIELD, PARAMETER})
public @interface Synchronous {}
@Qualifier
@Retention(RUNTIME)
@Target({TYPE, METHOD, FIELD, PARAMETER})
public @interface Asynchronous {}
@Qualifier
@Retention(RUNTIME)
@Target({TYPE, METHOD, FIELD, PARAMETER})
public @interface Asynchronous {}
例9.4 @Synchronous 修飾子と @Asynchronous 修飾子の使用
9.2.3.3. 修飾子を使用したあいまいなインジェクションの解決 リンクのコピーリンクがクリップボードにコピーされました!
このタスクでは、あいまいなインジェクションを示し、修飾子を用いてあいまいさを取り除きます。あいまいなインジェクションの詳細は、「依存関係があいまいな場合、あるいは満たされていない場合」を参照してください。
例9.5 あいまいなインジェクション
Welcome の 2 つの実装があり、1 つは翻訳を行い、もう 1 つは翻訳を行わないとします。このような場合、以下のインジェクションがあいまいであり、翻訳を行う Welcome を使用するよう指定する必要があります。
手順9.3 修飾子を使用したあいまいなインジェクションの解決
@Translatingという修飾子アノテーションを作成します。@Qualifier @Retention(RUNTIME) @Target({TYPE,METHOD,FIELD,PARAMETERS}) public @interface Translating{}@Qualifier @Retention(RUNTIME) @Target({TYPE,METHOD,FIELD,PARAMETERS}) public @interface Translating{}Copy to Clipboard Copied! Toggle word wrap Toggle overflow 翻訳を行う
Welcomeに@Translatingアノテーションを付けます。Copy to Clipboard Copied! Toggle word wrap Toggle overflow インジェクションで、翻訳を行う
Welcomeを要求します。ファクトリーメソッドパターンの場合と同様に、修飾された実装を明示的に要求する必要があります。あいまいさはインジェクションポイントで解決されます。Copy to Clipboard Copied! Toggle word wrap Toggle overflow
TranslatingWelcome が使用され、あいまいさがなくなります。
9.2.4. 管理 Bean リンクのコピーリンクがクリップボードにコピーされました!
9.2.4.1. 管理対象 Bean リンクのコピーリンクがクリップボードにコピーされました!
9.2.4.2. Bean であるクラスのタイプ リンクのコピーリンクがクリップボードにコピーされました!
@ManagedBean をアノテートすることで明示的に管理対象 Bean を宣言できますが、CDI ではその必要はありません。この仕様によると、CDI コンテナでは、以下の条件を満たすクラスはすべて管理対象 Bean として扱われます。
- 非静的な内部クラスではないこと。
- 具象クラス、あるいは
@Decoratorアノテーションが付与されている。 - EJB コンポーネントを定義するアノテーションが付与されていないこと、あるいは
ejb-jar.xmlで EJB Bean クラスとして宣言されていること。 - インターフェース
javax.enterprise.inject.spi.Extensionが実装されていないこと。 - パラメーターのないコンストラクターか、
@Injectアノテーションが付与されたコンストラクターがあること。
9.2.4.3. CDI を用いたオブジェクトの Bean へのインジェクト リンクのコピーリンクがクリップボードにコピーされました!
META-INF/beans.xml または WEB-INF/beans.xml ファイルが含まれる場合、CDI を使用してデプロイメントの各オブジェクトをインジェクトできます。
@Injectアノテーションを用いてオブジェクトを Bean の一部にインジェクトします。Bean 内でクラスのインスタンスを取得するには、フィールドに@Injectアノテーションを付けます。例9.6
TranslateControllerへTextTranslatorインスタンスをインジェクトするpublic class TranslateController { @Inject TextTranslator textTranslator; ...public class TranslateController { @Inject TextTranslator textTranslator; ...Copy to Clipboard Copied! Toggle word wrap Toggle overflow インジェクトしたオブジェクトのメソッドを使用する
挿入したオブジェクトのメソッドを直接使用することが可能です。TextTranslatorにメソッドtranslateがあることを前提とします。例9.7 インジェクトしたオブジェクトのメソッドを使用する
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Bean のコンストラクターで挿入を使用する
ファクトリーやサービスロケーターを使用して作成する代わりに、Bean のコンストラクターへオブジェクトをインジェクトできます。例9.8 Bean のコンストラクターでインジェクションを使用する
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Instance(<T>)インターフェースを使用し、プログラムを用いてインスタンスを取得します。Bean 型でパラメーター化されると、Instanceインターフェースは TextTranslator のインスタンスを返すことができます。例9.9 プログラムを用いてインスタンスを取得する
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
オブジェクトを Bean にインジェクトすると、Bean は全オブジェクトのメソッドとプロパティーを使用できるようになります。Bean のコンストラクターにインジェクトすると、インジェクションがすでに存在するインスタンスを参照する場合以外は、Bean のコンストラクターが呼び出されるとインジェクトされたオブジェクトのインスタンスが作成されます。たとえば、セッションのライフタイムの間にセッションスコープ付けされた Bean をインジェクトしても、新しいインスタンスは作成されません。
9.2.5. コンテキスト、スコープ、依存関係 リンクのコピーリンクがクリップボードにコピーされました!
9.2.5.1. コンテキストおよびスコープ リンクのコピーリンクがクリップボードにコピーされました!
@RequestScoped、@SessionScoped、および @ConversationScope です。
9.2.5.2. 利用可能なコンテキスト リンクのコピーリンクがクリップボードにコピーされました!
| コンテキスト | 説明 |
|---|---|
| @Dependent | Bean は、参照を保持する Bean のライフサイクルにバインドされます。 |
| @ApplicationScoped | アプリケーションのライフサイクルにバインドされます。 |
| @RequestScoped | 要求のライフサイクルにバインドされます。 |
| @SessionScoped | セッションのライフサイクルにバインドされます。 |
| @ConversationScoped | 会話のライフサイクルにバインドされます。会話スコープは、要求の長さとセッションの間であり、アプリケーションによって制御されます。 |
| カスタムスコープ | 上記のコンテキストで対応できない場合は、カスタムスコープを定義できます。 |
9.2.6. Bean ライフサイクル リンクのコピーリンクがクリップボードにコピーされました!
9.2.6.1. Bean のライフサイクルの管理 リンクのコピーリンクがクリップボードにコピーされました!
このタスクは、要求の残存期間の間 Bean を保存する方法を示しています。他の複数のスコープが存在し、独自のスコープを定義できます。
@Dependent です。つまり、Bean のライフサイクルは、参照を保持する Bean のライフサイクルに依存します。詳細については、「コンテキストおよびスコープ」を参照してください。
手順9.4 Bean ライフサイクルの管理
必要なスコープに対応するスコープで Bean にアノテーションを付与します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Bean が JSF ビューで使用されると、Bean は状態を保持します。
<h:form> <h:inputText value="#{greeter.city}"/> <h:commandButton value="Welcome visitors" action="#{greeter.welcomeVisitors}"/> </h:form><h:form> <h:inputText value="#{greeter.city}"/> <h:commandButton value="Welcome visitors" action="#{greeter.welcomeVisitors}"/> </h:form>Copy to Clipboard Copied! Toggle word wrap Toggle overflow
Bean は、指定するスコープに関連するコンテキストに保存され、スコープが適用される限り存続します。
9.2.6.2. プロデューサーメソッドの使用 リンクのコピーリンクがクリップボードにコピーされました!
このタスクは、インジェクション用の Bean ではないさまざまなオブジェクトを生成するプロデューサーメソッドを使用する方法を示しています。
例9.10 代替の代わりにプロデューサーメソッドを使用してデプロイメント後のポリモーフィズムを可能にする
@Preferred アノテーションは、修飾子アノテーションです。修飾子の詳細については、「修飾子」を参照してください。
@Inject @Preferred PaymentStrategy paymentStrategy;
@Inject @Preferred PaymentStrategy paymentStrategy;
例9.11 プロデューサーメソッドへのスコープの割り当て
@Dependent です。スコープを Bean に割り当てた場合、スコープは適切なコンテキストにバインドされます。この例のプロデューサーメソッドは、1 つのセッションあたり一度だけ呼び出されます。
@Produces @Preferred @SessionScoped
public PaymentStrategy getPaymentStrategy() {
...
}
@Produces @Preferred @SessionScoped
public PaymentStrategy getPaymentStrategy() {
...
}
例9.12 プロデューサーメソッド内部でのインジェクションの使用
注記
プロデューサーメソッドを使用して、Bean ではないオブジェクトをインジェクトし、コードを動的に変更できます。
9.2.7. 名前付き Bean と代替の Bean リンクのコピーリンクがクリップボードにコピーされました!
9.2.7.1. 名前付き Bean リンクのコピーリンクがクリップボードにコピーされました!
@Named アノテーションを使用して名前が付けられます。Bean を命名することにより、Bean を Java Server Faces (JSF) で直接使用できるようになります。
@Named アノテーションは、Bean 名であるオプションパラメーターを取ります。このパラメーターが省略された場合は、小文字の Bean 名が名前として使用されます。
9.2.7.2. 名前付き Bean の使用 リンクのコピーリンクがクリップボードにコピーされました!
@Namedアノテーションを使用して名前を Bean に割り当てます。Copy to Clipboard Copied! Toggle word wrap Toggle overflow Bean 名自体はオプションです。省略された場合、クラス名に基づいて Bean に名前が付けられます (最初の文字は小文字になります)。上記の例では、デフォルトの名前はgreeterBeanになります。JSF ビューで名前付き Bean を使用します。
<h:form> <h:commandButton value="Welcome visitors" action="#{greeter.welcomeVisitors}"/> </h:form><h:form> <h:commandButton value="Welcome visitors" action="#{greeter.welcomeVisitors}"/> </h:form>Copy to Clipboard Copied! Toggle word wrap Toggle overflow
名前付き Bean が、JSF ビューでアクションとしてコントロールに割り当てられ、コーディングが最小化されます。
9.2.7.3. 代替の Bean リンクのコピーリンクがクリップボードにコピーされました!
例9.13 代替の定義
beans.xml ファイルを編集することにより、特定の Bean アーカイブに対して有効になります。
9.2.7.4. 代替を用いたインジェクションのオーバーライド リンクのコピーリンクがクリップボードにコピーされました!
代替の Bean を使用すると、既存の Bean をオーバーライドできます。これらは、同じ役割を満たすクラスをプラグインする方法として考慮できますが、動作が異なります。代替の Bean はデフォルトで無効になります。このタスクは、代替を指定し、有効にする方法を示しています。
手順9.5 インジェクションのオーバーライド
TranslatingWelcome クラスがすでにあることを前提としています。ただし、これを MockTranslatingWelcome クラスでオーバーライドするとします。これは、実際の Translator Bean を使用できないテストデプロイメントのケースに該当します。
代替を定義します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 代替を置換します。
置換実装をアクティベートするために、完全修飾クラス名をMETA-INF/beans.xmlまたはWEB-INF/beans.xmlファイルに追加します。<beans> <alternatives> <class>com.acme.MockTranslatingWelcome</class> </alternatives> </beans><beans> <alternatives> <class>com.acme.MockTranslatingWelcome</class> </alternatives> </beans>Copy to Clipboard Copied! Toggle word wrap Toggle overflow
元の実装の代わりに代替実装が使用されます。
9.2.8. ステレオタイプ リンクのコピーリンクがクリップボードにコピーされました!
9.2.8.1. ステレオタイプ リンクのコピーリンクがクリップボードにコピーされました!
- デフォルトスコープ
- インターセプターバインディングのセット
- ステレオタイプを持つすべての Bean にデフォルトの Bean EL 名がある
- ステレオタイプを持つすべての Bean が代替である
@Named アノテーションを持つ場合、配置された Bean はデフォルトの Bean 名を持ちます。この Bean は、@Named アノテーションが Bean で直接指定された場合に、この名前をオーバーライドできます。名前付き Bean の詳細については、「名前付き Bean 」を参照してください。
9.2.8.2. ステレオタイプの使用 リンクのコピーリンクがクリップボードにコピーされました!
ステレオタイプを使用しないと、アノテーションが煩雑になる可能性があります。このタスクは、ステレオタイプを使用してコードを減らし、すっきりさせる方法を示しています。ステレオタイプの詳細については、「ステレオタイプ」を参照してください。
例9.14 アノテーションの煩雑さ
手順9.6 ステレオタイプの定義および使用
ステレオタイプを定義します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow ステレオタイプを使用します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
ステレオタイプにより、コードが削減され、単純化されます。
9.2.9. オブザーバーメソッド リンクのコピーリンクがクリップボードにコピーされました!
9.2.9.1. オブザーバーメソッド リンクのコピーリンクがクリップボードにコピーされました!
9.2.9.2. イベントの発生と確認 リンクのコピーリンクがクリップボードにコピーされました!
例9.15 イベントの発生
例9.16 修飾子を使用したイベントの発生
例9.17 イベントの確認
@Observes アノテーションを使用します。
例9.18 修飾されたイベントの確認
9.2.10. インターセプター リンクのコピーリンクがクリップボードにコピーされました!
9.2.10.1. インターセプター リンクのコピーリンクがクリップボードにコピーされました!
インターセプションポイント
- ビジネスメソッドのインターセプション
- ビジネスメソッドのインターセプターは、Bean のクライアントによる Bean のメソッド呼び出しに適用されます。
- ライフサイクルコールバックのインターセプション
- ライフサイクルのコールバックインターセプションは、コンテナによるライフサイクルコールバックの呼び出しに適用されます。
- タイムアウトメソッドのインターセプション
- タイムアウトメソッドのインターセプターは、コンテナによる EJB タイムアウトメソッドの呼び出しに適用されます。
9.2.10.2. CDI とのインターセプターの使用 リンクのコピーリンクがクリップボードにコピーされました!
例9.19 CDI のないインターセプター
- Bean は、インターセプター実装を直接指定する必要があります。
- アプリケーションの各 Bean は、インターセプターの完全なセットを適切な順序で指定する必要があります。この場合、アプリケーション全体でインターセプターを追加または削除するには時間がかかり、エラーが発生する傾向があります。
手順9.7 CDI とのインターセプターの使用
インターセプターバインディングタイプを定義します。
@InterceptorBinding @Retention(RUNTIME) @Target({TYPE, METHOD}) public @interface Secure {}@InterceptorBinding @Retention(RUNTIME) @Target({TYPE, METHOD}) public @interface Secure {}Copy to Clipboard Copied! Toggle word wrap Toggle overflow インターセプター実装をマークします。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow ビジネスコードでインターセプターを使用します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow インターセプターを
META-INF/beans.xmlまたはWEB-INF/beans.xmlに追加することにより、インターセプターをデプロイメントで有効にします。Copy to Clipboard Copied! Toggle word wrap Toggle overflow インターセプターは、リストされた順序で適用されます。
CDI により、インターセプターコードが単純化され、ビジネスコードへの適用が簡単になります。
9.2.11. デコレーター リンクのコピーリンクがクリップボードにコピーされました!
@Decorator アノテーションが付けられます。
例9.20 デコレーターの例
9.2.12. 移植可能な拡張機能 リンクのコピーリンクがクリップボードにコピーされました!
- ビジネスプロセス管理エンジンとの統合
- Spring、Seam、GWT、Wicket などのサードパーティーフレームワークとの統合
- CDI プログラミングモデルに基づく新しいテクノロジー
- 独自の Bean、インターセプター、およびデコレーターをコンテナに提供します。
- 依存性注入サービスを使用した独自のオブジェクトへの依存性のインジェクション
- カスタムスコープのコンテキスト実装を提供します。
- アノテーションベースのメタデータを他のソースからのメタデータで拡大またはオーバーライドします。
9.2.13. Bean プロキシ リンクのコピーリンクがクリップボードにコピーされました!
9.2.13.1. Bean プロキシ リンクのコピーリンクがクリップボードにコピーされました!
プロキシを使用することで解決される、依存性注入の問題
- パフォーマンス - プロキシは依存性の注入よりも速度が早いため、高パフォーマンスを必要とする Bean に使用できます。
- スレッドセーフ - 複数のスレッドが同時に Bean にアクセスしている場合でも、プロキシは適切な Bean インスタンスにリクエストを転送します。依存性の注入はスレッドの安全性を保証しません。
プロキシ化できないクラス型
- プリミティブ型あるいはアレイ型
finalのクラスあるいはfinalメソッドを持つクラス- プライベートではないデフォルトのコンストラクターを持つクラス
9.2.13.2. インジェクションでのプロキシの使用 リンクのコピーリンクがクリップボードにコピーされました!
各 Bean のライフサイクルが異なる場合に、インジェクションにプロキシが使用されます。プロキシは起動時に作成された Bean のサブクラスで、Bean クラスのプライベートメソッド以外のメソッドをすべて上書きします。プロキシは実際の Bean インスタンスへ呼び出しを転送します。
PaymentProcessor インスタンスは直接 Shop へインジェクトされません。その代わりにプロキシがインジェクトされ、processPayment() メソッドが呼び出されるとプロキシが現在の PaymentProcessor Bean インスタンスをルックアップし、processPayment() メソッドを呼び出します。
例9.21 プロキシのインジェクション
第10章 Java トランザクション API (JTA) リンクのコピーリンクがクリップボードにコピーされました!
10.1. 概要 リンクのコピーリンクがクリップボードにコピーされました!
10.1.1. Java トランザクション API (JTA) の概要 リンクのコピーリンクがクリップボードにコピーされました!
これらのトピックは、 Java トランザクション API (JTA) の基礎的な内容について取り上げます。
10.2. トランザクションの概念 リンクのコピーリンクがクリップボードにコピーされました!
10.2.1. トランザクション リンクのコピーリンクがクリップボードにコピーされました!
10.2.2. トランザクションの ACID プロパティー リンクのコピーリンクがクリップボードにコピーされました!
Atomicity)、一貫性 (Consistency)、独立性 (Isolation)、永続性 (Durability) の略語です。通常、この用語はデータベースやトランザクション操作において使用されます。
ACID の定義
- 原子性 (Atomicity)
- トランザクションの原子性を保つには、トランザクション内の全メンバーが同じ決定をする必要があります。つまり、全メンバーがコミットまたはロールバックを行う必要があります。原子性が保たれない場合の結果をヒューリスティックな結果と言います。
- 一貫性 (Consistency)
- 一貫性とは、データベーススキーマの観点から、データベースに書き込まれたデータが有効なデータであることを保証するという意味です。データベースあるいは他のデータソースは常に一貫した状態でなければなりません。一貫性のない状態の例には、操作が中断される前にデータの半分が書き込まれてしまったフィールドなどがあります。すべてのデータが書き込まれた場合や、書き込みが完了しなかった時に書き込みがロールバックされた場合に、一貫した状態となります。
- 独立性 (Isolation)
- 独立性とは、トランザクションのスコープ外のプロセスがデータを変更できないように、トランザクションで操作されたデータが変更前にロックされる必要があることを意味します。
- 永続性 (Durability)
- 永続性とは、トランザクションのメンバーにコミットの指示を出してから外部で問題が発生した場合、問題が解決されると全メンバーがトランザクションのコミットを継続できるという意味です。ここで言う問題とは、ハードウェア、ソフトウェア、ネットワークなどのシステムが関係する問題のことです。
10.2.3. トラザクションコーディネーターまたはトランザクションマネージャー リンクのコピーリンクがクリップボードにコピーされました!
10.2.4. トランザクションの参加者 リンクのコピーリンクがクリップボードにコピーされました!
10.2.5. Java Transactions API (JTA) リンクのコピーリンクがクリップボードにコピーされました!
10.2.6. Java Transaction Service (JTS) リンクのコピーリンクがクリップボードにコピーされました!
注記
10.2.7. XA データソースおよび XA トランザクション リンクのコピーリンクがクリップボードにコピーされました!
10.2.8. XA リカバリー リンクのコピーリンクがクリップボードにコピーされました!
10.2.9. 2 相コミットプロトコル リンクのコピーリンクがクリップボードにコピーされました!
最初のフェーズでは、トランザクションをコミットできるか、あるいはロールバックする必要があるかをトランザクションの参加者がトランザクションコーディネーターに通知します。
2 番目のフェーズでは、トランザクションコーディネーターが全体のトランザクションをコミットするか、またはロールバックするかを決定します。参加者が 1 つでもコミットできない場合、トランザクションはロールバックしなければなりません。参加者がすべてコミットできる場合はトランザクションはコミットできます。コーディネーターは何を行うかをトランザクションに指示し、トランザクションは何を行ったかをコーディネーターに通知します。この時点で、トランザクションが完了します。
10.2.10. トランザクションタイムアウト リンクのコピーリンクがクリップボードにコピーされました!
10.2.11. 分散トランザクション リンクのコピーリンクがクリップボードにコピーされました!
10.2.12. ORB 移植性 API リンクのコピーリンクがクリップボードにコピーされました!
ORB 移植性 API のクラス
com.arjuna.orbportability.orbcom.arjuna.orbportability.oa
10.2.13. ネストされたトランザクション リンクのコピーリンクがクリップボードにコピーされました!
ネストされたトランザクションの利点
- 障害の分離
- 使用しているオブジェクトが失敗したためサブトランザクションがロールバックされた場合、囲んでいるトランザクションはロールバックする必要がありません。
- モジュール性
- 新しいトランザクションが開始されるときにトランザクションがすでに呼び出しに関連付けられている場合は、新しいトランザクションがそのトランザクション内にネストされます。したがって、オブジェクトでトランザクションが必要なことがわかっている場合は、オブジェクト内でトランザクションを開始できます。オブジェクトのメソッドがクライアントトランザクションなしで呼び出された場合は、オブジェクトのトランザクションは最上位レベルです。それ以外の場合、これらのトランザクションはクライアントのトランザクションのスコープ内でネストされます。同様に、クライアントはオブジェクトがトランザクション対応であるかどうかを知る必要がありません。クライアントは、独自のトランザクションを開始できます。
10.3. トランザクションの最適化 リンクのコピーリンクがクリップボードにコピーされました!
10.3.1. トランザクション最適化の概要 リンクのコピーリンクがクリップボードにコピーされました!
JBoss EAP 6 のトランザクションサブシステムには複数の最適化機能が含まれており、お使いのアプリケーションでご活用いただけます。
10.3.2. 1相コミット (1PC) の LRCO 最適化 リンクのコピーリンクがクリップボードにコピーされました!
10.3.3. 推定中止 (presumed-abort) 最適化 リンクのコピーリンクがクリップボードにコピーされました!
10.3.4. 読み取り専用の最適化 リンクのコピーリンクがクリップボードにコピーされました!
10.4. トランザクションの結果 リンクのコピーリンクがクリップボードにコピーされました!
10.4.1. トランザクションの結果 リンクのコピーリンクがクリップボードにコピーされました!
- ロールバック
- トランザクションの参加者のいずれかがコミットできなかったり、トランザクションコーディネーターが参加者にコミットを指示できない場合、トランザクションがロールバックされます。詳細は 「トランザクションロールバック 」 を参照してください。
- コミット
- トランザクションの参加者すべてがコミットできる場合、トランザクションコーディネーターはコミットの実行を指示します。詳細は 「トランザクションのコミット 」 を参照してください。
- ヒューリスティックな結果
- トランザクションの参加者の一部がコミットし、他の参加者がロールバックした場合をヒューリスティックな結果と呼びます。ヒューリスティックな結果が発生すると、人的な介入が必要になります。詳細は 「ヒューリスティックな結果 」 を参照してください。
10.4.2. トランザクションのコミット リンクのコピーリンクがクリップボードにコピーされました!
10.4.3. トランザクションロールバック リンクのコピーリンクがクリップボードにコピーされました!
10.4.4. ヒューリスティックな結果 リンクのコピーリンクがクリップボードにコピーされました!
- ヒューリスティックロールバック
- 参加者の一部あるいはすべてが一方的にトランザクションをロールバックしたため、コミット操作に失敗します。
- ヒューリスティックコミット
- 参加者のすべてが一方的にコミットしたため、ロールバック操作に失敗します。たとえば、コーディネーターが正常にトランザクションを準備したにも関わらず、ログ更新の失敗などでコーディネーター側で障害が発生したため、ロールバックの実行を決定した場合などに発生します。暫定的に参加者がコミットの実行を決定する場合があります。
- ヒューリスティック混合
- 一部の参加者がコミットし、その他の参加者はロールバックした状態です。
- ヒューリスティックハザード
- 更新の一部の結果が不明な状態です。既知の更新結果はすべてコミットまたはロールバックします。
10.4.5. JBoss Transactions エラーと例外 リンクのコピーリンクがクリップボードにコピーされました!
UserTransaction クラスのメソッドがスローする例外に関する詳細は、http://download.oracle.com/javaee/1.3/api/javax/transaction/UserTransaction.html の 『UserTransaction API』 の仕様を参照してください。
10.5. JTA トランザクションの概要 リンクのコピーリンクがクリップボードにコピーされました!
10.5.1. Java Transactions API (JTA) リンクのコピーリンクがクリップボードにコピーされました!
10.5.2. JTA トランザクションのライフサイクル リンクのコピーリンクがクリップボードにコピーされました!
アプリケーションが新しいトランザクションを開始する
トランザクションを開始するため、アプリケーションは JNDI から (EJB の場合はアノテーションから)UserTransactionクラスのインスタンスを取得します。UserTransactionインターフェースには、トップレベルのトランザクションを開始、コミット、およびロールバックするメソッドが含まれています。新規作成されたトランザクションは、そのトランザクションを呼び出すスレッドと自動的に関連付けされます。ネストされたトランザクションは JTA ではサポートされないため、すべてのトランザクションがトップレベルのトランザクションとなります。UserTransaction.begin()を呼び出すと、新しいトランザクションが開始されます。この時点以降に使用されたリソースは、このトランザクションと関連付けられます。2 つ以上のリソースが登録された場合、このトランザクションは XA トランザクションになり、コミット時に 2 相コミットプロトコルに参加します。アプリケーションが状態を変更する
次に、トランザクションが作業を実行し、状態を変更します。アプリケーションがコミットまたはロールバックを決定する
お使いのアプリケーションが状態の変更を終了すると、コミットまたはロールバックするかを決定し、適切なメソッドを呼び出します。UserTransaction.commit()またはUserTransaction.rollback()を呼び出します。2 つ以上のリソースが登録された場合は、ここで 2 相コミットプロトコル (2PC) が発生します。「2 相コミットプロトコル 」トランザクションマネージャーがトランザクションを記録から削除する
コミットあるいはロールバックが完了すると、トランザクションマネージャーは記録をクリーンアップし、トランザクションに関する情報を削除します。
障害回復は自動的に行われます。リソース、トランザクションの参加者、またはアプリケーションサーバーが使用できなくなった場合、この問題が解決した時にトランザクションマネージャーがリカバリー処理を行います。
10.6. トランザクションサブシステムの設定 リンクのコピーリンクがクリップボードにコピーされました!
10.6.1. トランザクション設定の概要 リンクのコピーリンクがクリップボードにコピーされました!
次の手順は、JBoss EAP 6 のトランザクションサブシステムを設定する方法を示しています。
10.6.2. トランザクションデータソースの設定 リンクのコピーリンクがクリップボードにコピーされました!
10.6.2.1. JTA トランザクションを使用するようにデータソースを設定 リンクのコピーリンクがクリップボードにコピーされました!
ここでは、データソースで Java Transactions API (JTA) を有効にする方法を説明します。
このタスクを続行するには、次の条件を満たしている必要があります。
- お使いのデータベースまたはその他のリソースが JTA をサポートしている必要があります。不明な場合は、データソースまたはリソースの文書を参照してください。
- データベースを作成する必要があります。「管理インターフェースによる非 XA データソースの作成」 を参照してください。
- JBoss EAP 6 を停止します。
- テキストエディターで設定ファイルを直接編集できる権限を持たなければなりません。
手順10.1 JTA トランザクションを使用するようデータソースを設定する
テキストエディターで設定ファイルを開きます。
JBoss EAP 6 を管理対象ドメインまたはスタンドアロンサーバーで実行するかによって、設定ファイルの場所は異なります。管理対象ドメイン
管理対象ドメインのデフォルトの設定ファイルは、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">
<datasource jndi-name="java:jboss/datasources/ExampleDS" pool-name="H2DS" enabled="true" jta="true" use-java-context="true" use-ccm="true">Copy to Clipboard Copied! Toggle word wrap Toggle overflow jta属性をtrueに設定します。上記のように、jta="true"を<datasource>タグの内容に追加します。設定ファイルを保存します。
設定ファイルを保存しテキストエディターを終了します。JBoss EAP 6 を起動します。
JBoss EAP 6 サーバーを再起動します。
JBoss EAP 6 が起動し、データソースが JTA トランザクションを使用するように設定されます。
10.6.2.2. XA Datasource の設定 リンクのコピーリンクがクリップボードにコピーされました!
XA Datasource を追加するには、管理コンソールにログインする必要があります。詳細は 「管理コンソールへログイン」 を参照してください。
新しいデータソースを追加します。
新しいデータソースを JBoss EAP 6 に追加します。「管理インターフェースによる非 XA データソースの作成」 の手順に従いますが、上部の XA Datasource タブをクリックしてください。必要に応じて他のプロパティーを設定します。
データソースパラメーターの一覧は 「データソースのパラメーター」 にあります。
XA Datasource が設定され、使用する準備ができました。
10.6.2.3. 管理コンソールへログイン リンクのコピーリンクがクリップボードにコピーされました!
要件
- JBoss EAP 6 が稼働している必要があります。
手順10.2 管理コンソールへログイン
管理コンソールのスタートページに移動
Web ブラウザーで管理コンソールに移動します。デフォルトの場所は http://localhost:9990/console/ です。ポート 9990 は管理コンソールのソケットバインディングとして事前定義されています。管理コンソールへログイン
以前作成したアカウントのユーザー名とパスワードを入力し、管理コンソールのログイン画面でログインします。図10.1 管理コンソールのログイン画面
結果
- 管理対象ドメイン
- スタンドアロンサーバー
10.6.2.4. 管理インターフェースによる非 XA データソースの作成 リンクのコピーリンクがクリップボードにコピーされました!
ここでは、管理コンソールまたは管理 CLI のいずれかを使用して非 XA データソースを作成する手順について取り上げます。
要件
- JBoss EAP 6 サーバーが稼働している必要があります。
注記
手順10.3 管理 CLI または管理コンソールのいずれかを使用したデータソースの作成
管理 CLI
- CLI ツールを起動し、サーバーに接続します。
- 以下のコマンドを実行して非 XA データソースを作成し、適切に変数を設定します。
data-source add --name=DATASOURCE_NAME --jndi-name=JNDI_NAME --driver-name=DRIVER_NAME --connection-url=CONNECTION_URL
data-source add --name=DATASOURCE_NAME --jndi-name=JNDI_NAME --driver-name=DRIVER_NAME --connection-url=CONNECTION_URLCopy to Clipboard Copied! Toggle word wrap Toggle overflow - データソースを有効にします。
data-source enable --name=DATASOURCE_NAME
data-source enable --name=DATASOURCE_NAMECopy to Clipboard Copied! Toggle word wrap Toggle overflow
管理コンソール
- 管理コンソールへログインします。
管理コンソールの Datasources パネルに移動します。
スタンドアロンモード
コンソールの右上より Profile タブを選択します。ドメインモード
- コンソールの右上より Profiles タブを選択します。
- 左上のドロップダウンボックスより該当するプロファイルを選択します。
- コンソールの左側にある メニューを展開します。
- コンソールの左側にあるメニューより → と選択します。
図10.2 データソースパネル
新しいデータソースの作成
- Datasources パネル上部にある ボタンを選択します。
- Create Datasource ウィザードで新しいデータソースの属性を入力し、 ボタンを押します。
- Create Datasource ウィザードで JDBC ドライバーの詳細を入力し、 ボタンを押します。
- Create Datasource ウィザードで接続設定を入力し、 ボタンを押します。
非 XA データソースがサーバーに追加されます。standalone.xml または domain.xml ファイル、および管理インターフェースで追加を確認することができます。
10.6.2.5. データソースのパラメーター リンクのコピーリンクがクリップボードにコピーされました!
| パラメーター | 説明 |
|---|---|
| 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 |
セキュリティー設定である子要素が含まれます。表10.6「セキュリティーパラメーター」 を参照してください。
|
| validation |
検証設定である子要素が含まれます。表10.7「検証パラメーター」 を参照してください。
|
| timeout |
タイムアウト設定である子要素が含まれます。表10.8「タイムアウトパラメーター」 を参照してください。
|
| statement |
ステートメント設定である子要素が含まれます。表10.9「ステートメントのパラメーター」 を参照してください。
|
| パラメーター | 説明 |
|---|---|
| jta | 非 XA データソースの JTA 統合を有効にします。XA データソースには適用されません。 |
| connection-url | JDBC ドライバーの接続 URL。 |
| driver-class | JDBC ドライバークラスの完全修飾名。 |
| connection-property | Driver.connect(url,props) メソッドに渡される任意の接続プロパティー。各 connection-property は、文字列名と値のペアを指定します。プロパティー名は名前、値は要素の内容に基づいています。
|
| pool |
プーリング設定である子要素が含まれます。表10.4「非 XA および 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 |
プーリング設定である子要素が含まれます。表10.4「非 XA および XA データソースに共通のプールパラメーター」 および 表10.5「XA プールパラメーター」 を参照してください。
|
| recovery |
リカバリー設定である子要素が含まれます。表10.10「リカバリーパラメーター」 を参照してください。
|
| パラメーター | 説明 |
|---|---|
| min-pool-size | プールが保持する最小接続数 |
| max-pool-size | プールが保持可能な最大接続数 |
| prefill | 接続プールのプレフィルを試行するかどうか。要素が空の場合は true を示します。デフォルトは、false です。 |
| use-strict-min | pool-size が厳密かどうか。デフォルトは false に設定されています。 |
| flush-strategy |
エラーの場合にプールがフラッシュされるかどうか。有効な値は次のとおりです。
デフォルトは
FailingConnectionOnly です。
|
| allow-multiple-users | 複数のユーザーが getConnection(user, password) メソッドを介してデータソースにアクセスするかどうかを指定します。また、この動作が内部プールタイプによるものかどうかを指定します。 |
| パラメーター | 説明 |
|---|---|
| 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 |
XAResource を
org.jboss.tm.XAResourceWrapper インスタンスでラップするかどうか。
|
| パラメーター | 説明 |
|---|---|
| user-name | 新規接続の作成に使うユーザー名 |
| password | 新規接続の作成に使うパスワード |
| security-domain | 認証処理を行う JAAS security-manager 名が入ります。この名前は、JAAS ログイン設定のapplication-policy/name 属性を相関します。 |
| reauth-plugin | 物理接続の再認証に使う再認証プラグインを定義します。 |
| パラメーター | 説明 |
|---|---|
| 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 |
接続ファクトリーが指定のセットに対して管理された接続をマッチしようとした時に接続レベルの検証を実行するかどうかを示します。
通常、
validate-on-match に true を指定した時に background-validation を true に指定することはありません。クライアントが使用する前に接続を検証する必要がある場合に Validate-on-match が必要になります。このパラメーターはデフォルトでは true になっています。
|
| background-validation |
接続がバックグラウンドスレッドで検証されることを指定します。
validate-on-match を使用しない場合、バックグラウンドの検証はパフォーマンスを最適化します。validate-on-match が true の時に background-validation を使用すると、チェックが冗長になることがあります。バックグラウンド検証では、不良の接続がクライアントに提供される可能性があります (検証スキャンと接続がクライアントに提供されるまでの間に接続が悪くなります)。そのため、クライアントアプリケーションはこの接続不良の可能性に対応する必要があります。
|
| background-validation-millis | バックグラウンド検証を実行する期間 (ミリ秒単位)。 |
| use-fast-fail |
true の場合、接続が無効であれば最初に接続を割り当てしようとした時点で失敗します。デフォルトは
false です。
|
| stale-connection-checker |
ブール値の
isStaleConnection(SQLException e) メソッドを提供する org.jboss.jca.adapters.jdbc.StaleConnectionChecker のインスタンス。このメソッドが true を返すと、SQLException のサブクラスである org.jboss.jca.adapters.jdbc.StaleConnectionException に例外がラップされます。
|
| exception-sorter |
ブール値である
isExceptionFatal(SQLException e) メソッドを提供する org.jboss.jca.adapters.jdbc.ExceptionSorter のインスタンス。このメソッドは、例外が connectionErrorOccurred メッセージとして javax.resource.spi.ConnectionEventListener のすべてのインスタンスへブロードキャストされるかどうかを検証します。
|
| パラメーター | 説明 |
|---|---|
| use-try-lock | lock() の代わりに tryLock() を使用します。これは、ロックが使用できない場合に即座に失敗するのではなく、設定された秒数間ロックの取得を試みます。デフォルトは 60 秒です。たとえば、タイムアウトを 5 分に設定するには、<use-try-lock>300</use-try-lock> を設定します。 |
| blocking-timeout-millis | 接続待機中にブロックする最大時間 (ミリ秒)。この時間を超過すると、例外がスローされます。これは、接続許可の待機中のみブロックし、新規接続の作成に長時間要している場合は例外をスローしません。デフォルトは 30000 (30 秒) です。 |
| idle-timeout-minutes |
アイドル接続が切断されるまでの最大時間 (分単位)。実際の最大時間は idleRemover のスキャン時間によって異なります。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 メソッドへ渡されます。
|
| パラメーター | 説明 |
|---|---|
| track-statements |
接続がプールへ返され、ステートメントが準備済みステートメントキャッシュへ返された時に、閉じられていないステートメントをチェックするかどうか。false の場合、ステートメントは追跡されません。
|
| prepared-statement-cache-size | LRU (Least Recently Used) キャッシュにある接続毎の準備済みステートメントの数。 |
| share-prepared-statements |
閉じずに同じステートメントを 2 回要求した場合に、同じ基盤の準備済みステートメントを使用するかどうか。デフォルトは
false です。
|
| パラメーター | 説明 |
|---|---|
| recover-credential | リカバリーに使用するユーザー名とパスワードのペア、あるいはセキュリティドメイン。 |
| recover-plugin |
リカバリーに使用される
org.jboss.jca.core.spi.recoveryRecoveryPlugin クラスの実装。
|
10.6.3. トランザクションロギング リンクのコピーリンクがクリップボードにコピーされました!
10.6.3.1. トランザクションログメッセージ リンクのコピーリンクがクリップボードにコピーされました!
DEBUG ログレベルを使用します。詳細なデバッグでは TRACE ログレベルを使用します。トランザクションロガーの設定に関する詳細は 「トランザクションサブシステムのログ設定」 を参照してください。
TRACE ログレベルに設定すると、トランザクションマネージャーは多くのロギング情報を生成できます。一般的に表示されるメッセージの一部は次のとおりです。他のメッセージが表示されることもあります。
| トランザクションの開始 |
トランザクションが開始されると、次のコードが実行されます。
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());
その後、上記のように同じスレッドがトランザクションをロールバックすることが確認できます。
|
10.6.3.2. トランザクションサブシステムのログ設定 リンクのコピーリンクがクリップボードにコピーされました!
JBoss EAP 6 の他のログ設定に依存せずにトランザクションログの情報量を制御する手順を説明します。主に Web ベースの管理コンソールを用いた手順を説明し、管理 CLI のコマンドはその説明の後で取り上げます。
手順10.4 管理コンソールを使用したトランザクションロガーの設定
ログ設定エリアへの移動
管理コンソールにて画面の左上にある Profiles タブをクリックします。管理対象ドメインを使用する場合は、右上の Profile 選択ボックスから設定したいサーバープロファイルを選択します。Core メニューを展開して、Logging ラベルをクリックします。com.arjuna属性を編集します。ページの下の方にある Details セクションの Edit ボタンをクリックします。ここにクラス固有のログ情報を追加できます。com.arjunaクラスはすでに存在しています。ログレベルと、親ハンドラーの使用の有無を変更できます。- ログレベル
- デフォルトのログレベルは
WARNです。トランザクションはログを大量に出力できるため、標準的なログレベルの意味は、トランザクションロガーでは若干異なります。通常、選択したレベルより重要度が低いレベルでタグ付けされたメッセージは破棄されます。トランザクションログのレベル (詳細度が最高レベルから最低レベルまで)
- TRACE
- DEBUG
- INFO
- WARN
- ERROR
- FAILURE
- 親ハンドラーの使用
- ロガーがログ出力を親ロガーに送信するかどうかを指定します。デフォルトの動作は
trueです。
- 変更は直ちに反映されます。
10.6.3.3. トランザクションの参照と管理 リンクのコピーリンクがクリップボードにコピーされました!
log-store と呼ばれるリソースとして公開します。probe と呼ばれる API 操作はトランザクションログを読み取り、各ログに対してノードを作成します。probe コマンドは、log-store を更新する必要があるときに、いつでも手動で呼び出すことができます。トランザクションログが即座に表示され、非表示になるのは、正常な挙動です。
例10.1 ログストアの更新
default を使用するサーバーグループに対してログストアを更新します。スタンドアローンサーバーの場合は、コマンドから profile=default を削除します。
/profile=default/subsystem=transactions/log-store=log-store/:probe
/profile=default/subsystem=transactions/log-store=log-store/:probe
例10.2 準備されたすべてのトランザクションの表示
ls コマンドに類似した機能を持つ次のコマンドを実行します。
ls /profile=default/subsystem=transactions/log-store=log-store/transactions
ls /profile=default/subsystem=transactions/log-store=log-store/transactions
トランザクションの管理
- トランザクションの属性を表示します。
- JNDI 名、EIS 製品名およびバージョン、ステータスなどのトランザクションに関する情報を表示するには、
:read-resourceCLIコマンドを使用します。/profile=default/subsystem=transactions/log-store=log-store/transactions=0\:ffff7f000001\:-b66efc2\:4f9e6f8f\:9:read-resource
/profile=default/subsystem=transactions/log-store=log-store/transactions=0\:ffff7f000001\:-b66efc2\:4f9e6f8f\:9:read-resourceCopy to Clipboard Copied! Toggle word wrap Toggle overflow - トランザクションの参加者を表示します。
- 各トランザクションログには、
participants(参加者) と呼ばれる子要素が含まれます。トランザクションの参加者を確認するには、この要素に対してread-resourceCLI コマンドを使用します。参加者は、JNDI 名によって識別されます。/profile=default/subsystem=transactions/log-store=log-store/transactions=0\:ffff7f000001\:-b66efc2\:4f9e6f8f\:9/participants=java\:\/JmsXA:read-resource
/profile=default/subsystem=transactions/log-store=log-store/transactions=0\:ffff7f000001\:-b66efc2\:4f9e6f8f\:9/participants=java\:\/JmsXA:read-resourceCopy to Clipboard Copied! Toggle word wrap Toggle overflow 結果は以下のようになります。Copy to Clipboard Copied! Toggle word wrap Toggle overflow ここで示された結果ステータスはHEURISTICであり、リカバリーが可能です。詳細については、トランザクションをリカバリーします。 を参照してください。 - トランザクションを削除します。
- 各トランザクションログは、トランザクションを表すトランザクションログを削除するために、
:delete操作をサポートします。/profile=default/subsystem=transactions/log-store=log-store/transactions=0\:ffff7f000001\:-b66efc2\:4f9e6f8f\:9:delete
/profile=default/subsystem=transactions/log-store=log-store/transactions=0\:ffff7f000001\:-b66efc2\:4f9e6f8f\:9:deleteCopy to Clipboard Copied! Toggle word wrap Toggle overflow - トランザクションをリカバリーします。
- 各トランザクションログは、
:recoverCLI コマンドを使用したリカバリーをサポートします。ヒューリスティックなトランザクションと参加者のリカバリー
- トランザクションのステータスが
HEURISTICである場合は、リカバリー操作によって、ステータスがPREPAREに変わり、リカバリーがトリガーされます。 - トランザクションの参加者の 1 つがヒューリスティックな場合、復元操作により、
commit操作の応答が試行されます。成功した場合、トランザクションログから参加者が削除されます。これを確認するには、log-store上で:probe操作を再実行し、参加者がリストされていないことを確認します。これが最後の参加者の場合は、トランザクションも削除されます。
- リカバリーが必要なトランザクションのステータスを更新します。
- トランザクションをリカバリーする必要がある場合は、リカバリーを試行する前に
:refreshCLI コマンドを使用して、トランザクションのリカバリーが必要であるかを確認できます。/profile=default/subsystem=transactions/log-store=log-store/transactions=0\:ffff7f000001\:-b66efc2\:4f9e6f8f\:9:refresh
/profile=default/subsystem=transactions/log-store=log-store/transactions=0\:ffff7f000001\:-b66efc2\:4f9e6f8f\:9:refreshCopy to Clipboard Copied! Toggle word wrap Toggle overflow
トランザクションマネージャー (TM) の統計が有効になっていると、トランザクションマネージャーおよびトランザクションサブシステムに関する統計を表示できます。TM の統計を有効にする方法は「トランザクションマネージャーの設定」 を参照してください。
| 統計 | 説明 | CLI コマンド |
|---|---|---|
| 合計 |
このサーバー上でトランザクションマネージャーにより処理されるトランザクションの合計数。
|
/host=master/server=server-one/subsystem=transactions/:read-attribute(name=number-of-transactions,include-defaults=true)
|
| コミット済み |
このサーバー上でトランザクションマネージャーにより処理されるコミット済みトランザクションの数。
|
/host=master/server=server-one/subsystem=transactions/:read-attribute(name=number-of-committed-transactions,include-defaults=true)
|
| アボート |
このサーバー上でトランザクションマネージャーにより処理されるアボートされたトランザクションの数。
|
/host=master/server=server-one/subsystem=transactions/:read-attribute(name=number-of-aborted-transactions,include-defaults=true)
|
| タイムアウト |
このサーバー上でトランザクションマネージャーにより処理されるタイムアウトのトランザクションの数。
|
/host=master/server=server-one/subsystem=transactions/:read-attribute(name=number-of-timed-out-transactions,include-defaults=true)
|
| ヒューリスティック |
管理コンソールで利用不可です。ヒューリスティック状態のトランザクションの数。
|
/host=master/server=server-one/subsystem=transactions/:read-attribute(name=number-of-heuristics,include-defaults=true)
|
| フライト状態のトランザクション |
管理コンソールでは使用できません。開始した未終了のトランザクションの数。
|
/host=master/server=server-one/subsystem=transactions/:read-attribute(name=number-of-inflight-transactions,include-defaults=true)
|
| 障害の原因 - アプリケーション |
障害の原因がアプリケーションであった失敗トランザクションの数。
|
/host=master/server=server-one/subsystem=transactions/:read-attribute(name=number-of-application-rollbacks,include-defaults=true)
|
| 障害の原因 - リソース |
障害の原因がリソースであった失敗トランザクションの数。
|
/host=master/server=server-one/subsystem=transactions/:read-attribute(name=number-of-resource-rollbacks,include-defaults=true)
|
10.7. JTA トランザクションの使用 リンクのコピーリンクがクリップボードにコピーされました!
10.7.1. トランザクション JTA タスクの概要 リンクのコピーリンクがクリップボードにコピーされました!
次の手順は、アプリケーションでトランザクションを使用する必要がある場合に役に立ちます。
10.7.2. トランザクションの制御 リンクのコピーリンクがクリップボードにコピーされました!
この手順のリストでは、JTA または JTS API を使用するアプリケーションでトランザクションを制御するさまざまな方法を概説します。
10.7.3. トランザクションの開始 リンクのコピーリンクがクリップボードにコピーされました!
分散トランザクションでは、トランザクション参加者が複数のサーバー上の個別アプリケーションに存在します。参加者が新しいトランザクションコンテキストを作成する代わりに、すでに存在するトランザクションに参加する場合は、コンテキストを共有する 2 人以上の参加者が分散トランザクションに参加します。分散トランザクションを使用するには、ORB を設定する必要があります。ORB 設定の詳細については、『管理および設定ガイド』の項「ORB 設定」を参照してください。
UserTransactionのインスタンスを取得します。@TransactionManagement(TransactionManagementType.BEAN)アノテーションを用いると、 JNDI やインジェクション (EJB が Bean 管理のトランザクションを使用する場合は EJB の EjbContext) を使用してインスタンスを取得できます。JNDI
new InitialContext().lookup("java:comp/UserTransaction")new InitialContext().lookup("java:comp/UserTransaction")Copy to Clipboard Copied! Toggle word wrap Toggle overflow インジェクション
@Resource UserTransaction userTransaction;
@Resource UserTransaction userTransaction;Copy to Clipboard Copied! Toggle word wrap Toggle overflow EjbContext
EjbContext.getUserTransaction()
EjbContext.getUserTransaction()Copy to Clipboard Copied! Toggle word wrap Toggle overflow
データソースに接続後、
UserTransaction.begin()を呼び出します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow
EJB の利点の 1 つは、コンテナがすべてのトランザクションを管理することです。ORB をセットアップした場合は、コンテナによって分散トランザクションが管理されます。
トランザクションが開始します。トランザクションをコミットまたはロールバックするまで、データソースのすべての使用でトランザクションに対応します。
注記
10.7.4. トランザクションのネスト リンクのコピーリンクがクリップボードにコピーされました!
prepare フェーズと commit フェーズまたは abort フェーズの 2 つのフェーズがあります。このようなネストされたトランザクションでは、コミット中にサブトランザクションコーディネーターがリソースがコミットできないことを検出するなどの、不整合な結果が生じることがあります。コーディネーターはコミットされたリソースを中止するよう指示できないことがあり、このような場合はヒューリスティックな結果が生じます。この厳密な OTS のネストされたトランザクションは、CosTransactions::SubtransactionAwareResource インターフェースを介して利用できます。
ArjunaOTS::ArjunaSubtranAwareResource を介して利用でき、ネストされたトランザクションをコミットするたびに 2 相コミットプロトコルにより駆動されます。
10.7.5. トランザクションのコミット リンクのコピーリンクがクリップボードにコピーされました!
トランザクションは、コミットする前に開始する必要があります。トランザクションの開始方法については、「トランザクションの開始」を参照してください。
UserTransactionのcommit()メソッドを呼び出します。UserTransactionのcommit()メソッドを呼び出すと、トランザクションマネージャーがトランザクションをコミットしようとします。Copy to Clipboard Copied! Toggle word wrap Toggle overflow コンテナ管理トランザクション (CMT) を使用する場合は、手動でコミットする必要がありません。
Bean がコンテナ管理トランザクションを使用するよう設定すると、コンテナはコードで設定したアノテーションに基づいてトランザクションライフサイクルを管理します。
データソースがコミットされ、トランザクションが終了します。そうでない場合は、例外がスローされます。
注記
10.7.6. トランザクションのロールバック リンクのコピーリンクがクリップボードにコピーされました!
トランザクションは、ロールバックする前に開始する必要があります。トランザクションの開始方法については、「トランザクションの開始」を参照してください。
UserTransactionのrollback()メソッドを呼び出します。UserTransactionのrollback()メソッドを呼び出すと、トランザクションマネージャーがトランザクションをロールバックし、データを前の状態に戻そうとします。Copy to Clipboard Copied! Toggle word wrap Toggle overflow コンテナ管理トランザクション (CMT) を使用する場合は、手動でトランザクションをロールバックする必要がありません。
Bean がコンテナ管理トランザクションを使用するよう設定すると、コンテナはコードで設定したアノテーションに基づいてトランザクションライフサイクルを管理します。
トランザクションマネージャーにより、トランザクションがロールバックされます。
注記
10.7.7. トランザクションにおけるヒューリスティックな結果の処理方法 リンクのコピーリンクがクリップボードにコピーされました!
手順10.5 トランザクションでのヒューリスティックな結果の処理方法
原因を特定する
トランザクションのヒューリスティックな結果の全体的な原因は、リソースマネージャーがコミットまたはロールバックの実行を約束したにも関わらず、失敗したことにあります。原因としては、サードパーティーコンポーネント、サードパーティーコンポーネントと JBoss EAP 6 間の統合レイヤー、または JBoss EAP 6 自体に問題がある可能性があります。ヒューリスティックなエラーの最も一般的な原因として圧倒的に多いのが、環境の一時的な障害とリソースマネージャーを扱うコードのコーディングエラーの 2 つです。環境内の一時的な障害を修正する
通常、環境内で一時的な障害が発生した場合、ヒューリスティックなエラーを発見する前に気づくはずです。原因としては、ネットワークの停止、ハードウェア障害、データベース障害、電源異常など、さまざまな原因が考えられます。ストレステストの実施中にテスト環境でヒューリスティックな結果が発生した場合は、使用している環境の脆弱性に関する情報が提供されます。警告
JBoss EAP 6 は、障害発生時に非ヒューリスティックな状態にあるトランザクションの自動回復を行いますが、ヒューリスティックなトランザクションの回復は試行しません。リソースマネージャーのベンダーに連絡する
明らかに使用している環境に障害がない場合や、ヒューリスティックな結果が容易に再現可能な場合は、コーディングエラーである可能性があります。サードパーティーのベンダーに連絡して、解決方法の有無を確認してください。JBoss EAP 6 のトランザクションマネージャー自体に問題があると思われる場合は、Red Hat グローバルサポートサービスにご連絡ください。テスト環境の場合は、ログを削除して JBoss EAP 6 を再起動する
テスト環境である場合や、データの整合性を気にしない場合は、トランザクションログを削除して JBoss EAP 6 を再起動すると、ヒューリスティックな結果はなくなります。デフォルトのトランザクションログの場所はスタンドアロンサーバーではEAP_HOME/standalone/data/tx-object-store/、管理対象ドメインではEAP_HOME/domain/servers/SERVER_NAME/data/tx-object-storeになります。管理対象ドメインの SERVER_NAME は、サーバーグループに参加している個々のサーバー名になります。手作業で結果を解決する
トランザクションの結果を手作業で解決するプロセスは、障害の厳密な状況によって大きく左右されます。通常は、以下の手順に従って、それぞれの状況に適用する必要があります。- 関連するリソースマネージャーを特定する。
- トランザクションマネージャーの状態とリソースマネージャーを調べる。
- 関与する 1 つ以上のコンポーネント内でログのクリーンアップとデータ調整を手動で強制する。
これらの手順を実行する方法の詳細は、本書の範囲外となります。
10.7.8. トランザクションのタイムアウト リンクのコピーリンクがクリップボードにコピーされました!
10.7.8.1. トランザクションタイムアウト リンクのコピーリンクがクリップボードにコピーされました!
10.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 で始まります。
| オプション | 説明 | CLI コマンド |
|---|---|---|
|
統計の有効化 (Enable Statistics)
|
トランザクションの統計を有効にするかどうかを指定します。統計は Runtime タブの Subsystem Metrics セクションにある管理コンソールで閲覧できます。
| /profile=default/subsystem=transactions/:write-attribute(name=enable-statistics,value=true)
|
|
TSM ステータスの有効化 (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 EAP 6 のデータディレクトリーで、
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 EAP 6 のデータディレクトリーで、
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)
|
| オプション | 説明 | 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 トランザクションを使用することは推奨されません。
| /profile=default/subsystem=transactions/:write-attribute(name=use-hornetq-store,value=false)
|
10.7.9. JTA トランザクションのエラー処理 リンクのコピーリンクがクリップボードにコピーされました!
10.7.9.1. トランザクションエラーの処理 リンクのコピーリンクがクリップボードにコピーされました!
注記
多くの場合、このようなエラーは、Hibernate がレイジーロードのためにデータベース接続を取得できない場合に発生します。頻繁に発生する場合は、タイムアウト値を大きくできます。「トランザクションマネージャーの設定」 を参照してください。
NotSupportedException 例外が発生します。
NotSupportedException 例外は、通常、JTA トランザクションをネストしようとし、ネストがサポートされていないことを示します。トランザクションをネストしようとしないときは、多くの場合、スレッドプールタスクで別のトランザクションが開始されますが、トランザクションを中断または終了せずにタスクが終了します。
UserTransaction を使用します。その場合は、フレームワークに問題があることがあります。
TransactionManager メソッドまたは Transaction メソッドを直接使用する場合は、トランザクションをコミットまたはロールバックするときに次の動作に注意してください。コードで TransactionManager メソッドを使用してトランザクションを制御する場合は、トランザクションをコミットまたはロールバックすると、現在のスレッドからトランザクションの関連付けが解除されます。ただし、コードで Transaction メソッドを使用する場合は、トランザクションを、実行中のスレッドに関連付けることができず、スレッドプールにスレッドを返す前にスレッドからトランザクションの関連付けを手動で解除する必要があります。
このエラーは、2 番目の非 XA リソースをトランザクションに登録しようとした場合に、発生します。1 つのトランザクションで複数のリソースが必要な場合、それらのリソースは XA である必要があります。
10.8. ORB 設定 リンクのコピーリンクがクリップボードにコピーされました!
10.8.1. Common Object Request Broker Architecture (CORBA) リンクのコピーリンクがクリップボードにコピーされました!
10.8.2. JTS トランザクション用 ORB の設定 リンクのコピーリンクがクリップボードにコピーされました!
注記
full および full-ha プロファイルでのみ利用可能です。スタンドアロンサーバーでは、standalone-full.xml または standalone-full-ha.xml 設定で利用可能です。
手順10.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 部分を省略します。
例10.3 セキュリティーインターセプターの有効化
/profile=full/subsystem=jacorb/:write-attribute(name=security,value=on)
/profile=full/subsystem=jacorb/:write-attribute(name=security,value=on)
例10.4 JTS 用 ORB の有効化
/profile=full/subsystem=jacorb/:write-attribute(name=transactions,value=on)
/profile=full/subsystem=jacorb/:write-attribute(name=transactions,value=on)
例10.5 JacORB サブシステムでのトラザクションの有効化
/profile=full/subsystem=jacorb/:write-attribute(name=transactions,value=on)
/profile=full/subsystem=jacorb/:write-attribute(name=transactions,value=on)
例10.6 トランザクションサブシステムでの JTS の有効化
/subsystem=transactions:write-attribute(name=jts,value=true)
/subsystem=transactions:write-attribute(name=jts,value=true)
10.9. トランザクションに関する参考資料 リンクのコピーリンクがクリップボードにコピーされました!
10.9.1. JBoss Transactions エラーと例外 リンクのコピーリンクがクリップボードにコピーされました!
UserTransaction クラスのメソッドがスローする例外に関する詳細は、http://download.oracle.com/javaee/1.3/api/javax/transaction/UserTransaction.html の 『UserTransaction API』 の仕様を参照してください。
10.9.2. JTA クラスタリングの制限事項 リンクのコピーリンクがクリップボードにコピーされました!
10.9.3. JTA トランザクションの例 リンクのコピーリンクがクリップボードにコピーされました!
例10.7 JTA トランザクションの例
10.9.4. JBoss トランザクション JTA 向け API ドキュメンテーション リンクのコピーリンクがクリップボードにコピーされました!
第11章 Hibernate リンクのコピーリンクがクリップボードにコピーされました!
11.1. Hibernate Core リンクのコピーリンクがクリップボードにコピーされました!
11.2. Java 永続 API (JPA) リンクのコピーリンクがクリップボードにコピーされました!
11.2.1. JPA リンクのコピーリンクがクリップボードにコピーされました!
bean-validation、greeter、および kitchensink クイックスタートを参照してください。
11.2.2. Hibernate EntityManager リンクのコピーリンクがクリップボードにコピーされました!
11.2.3. 使用開始 リンクのコピーリンクがクリップボードにコピーされました!
11.2.3.1. JBoss Developer Studio での JPA プロジェクトの作成 リンクのコピーリンクがクリップボードにコピーされました!
この例では、JBoss Developer Studio で JPA プロジェクトを作成するために必要な手順について取り上げます。
手順11.1 JBoss Developer Studio での JPA プロジェクトの作成
- JBoss Developer Studio のウインドウで → → と選択します。
- プロジェクトダイアログにプロジェクト名を入力します。
- ドロップダウンボックスよりターゲットランタイムを選択します。
- ターゲットランタイムがない場合は をクリックします。
- リストで JBoss Community Folder を探します。
- JBoss Enterprise Application Platform 6.x ランタイムを選択します。
- をクリックします。
- Home Directory フィールドで をクリックし、JBoss EAP ソースフォルダーをホームディレクトリーとして設定します。
- をクリックします。
- をクリックします。
- ビルドパスウインドウのソースフォルダーはデフォルトのままにし、 をクリックします。
- Platform ドロップダウンで必ず Hibernate (JPA 2.x) が選択されているようにしてください。
- をクリックします。
- 要求されたら、JPA パースペクティブウインドウを開くかどうかを選択します。
11.2.3.2. JBoss Developer Studio での永続設定ファイルの作成 リンクのコピーリンクがクリップボードにコピーされました!
このトピックでは、JBoss Developer Studio を使用して Java プロジェクトで persistence.xml ファイルを作成するプロセスについて説明します。
手順11.2 新しい永続性設定ファイルを作成および設定する
- JBoss Developer Studio で EJB 3.x プロジェクトを開きます。
- Project Explorer パネルのプロジェクトのルートディレクトリーを右クリックします。
- → を選択します。
- XML フォルダーから XML File を選択し、 をクリックします。
- 親ディレクトリーとして
ejbModule/META-INFフォルダーを選択します。 persistence.xmlファイルに名前を付け、 をクリックします。- Create XML file from an XML schema file を選択し、 をクリックします。
- Select XML Catalog entry リストから http://java.sun.com/xml/ns/persistence/persistence_2.0.xsd を選択し、 をクリックします。
- をクリックし、ファイルを作成します。
- 結果
11.2.3.3. 永続設定ファイルの例 リンクのコピーリンクがクリップボードにコピーされました!
例11.1 persistence.xml
11.2.3.4. JBoss Developer Studio での Hibernate 設定ファイルの作成 リンクのコピーリンクがクリップボードにコピーされました!
本トピックでは、JBoss Developer Studio を使用して Java プロジェクトに hibernate.cfg.xml ファイルを作成するプロセスについて説明します。
手順11.3 新しい Hibernate 設定ファイルの作成
- JBoss Developer Studio で Java プロジェクトを開きます。
- Project Explorer パネルのプロジェクトのルートディレクトリーを右クリックします。
- → を選択します。
- Hibernate フォルダーから Hibernate Configuration File を選択し、 をクリックします。
src/ディレクトリーを選択し、 をクリックします。- 以下を設定します。
- セッションファクトリー名
- データベースの方言
- ドライバークラス
- 接続 URL
- ユーザー名
- パスワード
- をクリックし、ファイルを作成します。
- 結果
11.2.3.5. Hibernate 設定ファイルの例 リンクのコピーリンクがクリップボードにコピーされました!
例11.2 hibernate.cfg.xml
11.2.4. 設定 リンクのコピーリンクがクリップボードにコピーされました!
11.2.4.1. Hibernate 設定プロパティー リンクのコピーリンクがクリップボードにコピーされました!
| プロパティー名 | 説明 |
|---|---|
| hibernate.dialect |
Hibernate の
org.hibernate.dialect.Dialect のクラス名。Hibernate で、特定のリレーショナルデータベースに最適化された SQL を生成できるようになります。
ほとんどのケースで、Hibernate は、JDBC ドライバーにより返された
JDBC メタデータに基づいて正しい 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 になっています。
|
重要
hibernate.id.new_generator_mappings のデフォルト値を true にする必要があります。Hibernate 3.3.x を使用した既存のアプリケーションが継続してシーケンスオブジェクトやテーブルベースのジェネレーターを使用し、後方互換性を維持するにはデフォルト値を false に変更する必要がある場合があります。
11.2.4.2. Hibernate JDBC と接続プロパティー リンクのコピーリンクがクリップボードにコピーされました!
| プロパティー名 | 説明 |
|---|---|
| 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 から返されたセッションのみが影響を受けます。SessionFactory.getCurrentSession から取得されたセッションの場合、使用のために設定された CurrentSessionContext 実装はこれらのセッションの接続リリースモードを制御します。
|
| hibernate.connection.<propertyName> |
JDBC プロパティー <propertyName> を
DriverManager.getConnection() に渡します。
|
| hibernate.jndi.<propertyName> |
プロパティー <propertyName> を JNDI
InitialContextFactory に渡します。
|
11.2.4.3. Hibernate キャッシュプロパティー リンクのコピーリンクがクリップボードにコピーされました!
| プロパティー名 | 説明 |
|---|---|
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="..") を使用してこのデフォルト値が上書きされます。
|
11.2.4.4. Hibernate トランザクションプロパティー リンクのコピーリンクがクリップボードにコピーされました!
| プロパティー名 | 説明 |
|---|---|
hibernate.transaction.factory_class |
Hibernate
Transaction API と使用する TransactionFactory のクラス名です。デフォルト値は JDBCTransactionFactory です。
|
jta.UserTransaction |
アプリケーションサーバーから JTA
UserTransaction を取得するために JTATransactionFactory により使用される JNDI 名。
|
hibernate.transaction.manager_lookup_class | TransactionManagerLookup のクラス名。JVM レベルのキャッシングが有効になっている場合や、JTA 環境の hilo ジェネレーターを使用する場合に必要です。
|
hibernate.transaction.flush_before_completion |
ブール変数。有効な場合、トランザクションの完了前フェーズの間にセッションが自動的にフラッシュされます。ビルトインおよび自動セッションコンテキスト管理が推奨されます。
|
hibernate.transaction.auto_close_session |
ブール変数。有効な場合、トランザクションの完了後フェーズの間にセッションが自動的に閉じられます。ビルトインおよび自動セッションコンテキスト管理が推奨されます。
|
11.2.4.5. その他の Hibernate プロパティー リンクのコピーリンクがクリップボードにコピーされました!
| プロパティー名 | 説明 |
|---|---|
hibernate.current_session_context_class |
「現在」の
Session のスコープに対するカスタムストラテジーを提供します。値には jta | thread | managed | custom.Class があります。
|
hibernate.query.factory_class | org.hibernate.hql.internal.ast.ASTQueryTranslatorFactory または org.hibernate.hql.internal.classic.ClassicQueryTranslatorFactory の HQL パーサー実装を選択します。
|
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 のようになります。
特定ファイルのステートメントは後続ファイルのステートメントの前に実行されるため、ファイルの順番に注意する必要があります。これらのステートメントはスキーマが作成された場合のみ実行されます (
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 ファイルで設定できないシステムレベルのプロパティーです。ランタイムリフレクションの代わりにバイトコード操作の使用を有効にします。リフレクションは、トラブルシューティングを行うときに便利な場合があります。オプティマイザーが無効の場合でも Hibernate には CGLIB または javassist が常に必要です。
|
hibernate.bytecode.provider |
javassist または cglib をバイト操作エンジンとして使用することができます。デフォルトでは
javassist が使用されます。プロパティー値は javassist または cglib のいずれかです。
|
11.2.4.6. Hibernate SQL 方言 リンクのコピーリンクがクリップボードにコピーされました!
重要
hibernate.dialect プロパティーをアプリケーションデータベースの適切な org.hibernate.dialect.Dialect サブクラスに設定する必要があります。方言が指定されている場合、Hibernate は他のプロパティーの一部に実用的なデフォルトを使用します。そのため、これらのプロパティーを手作業で指定する必要はありません。
| RDBMS | 方言 |
|---|---|
| DB2 | org.hibernate.dialect.DB2Dialect |
| DB2 AS/400 | org.hibernate.dialect.DB2400Dialect |
| DB2 OS390 | org.hibernate.dialect.DB2390Dialect |
| Firebird | org.hibernate.dialect.FirebirdDialect |
| FrontBase | org.hibernate.dialect.FrontbaseDialect |
| H2 Database | org.hibernate.dialect.H2Dialect |
| HypersonicSQL | org.hibernate.dialect.HSQLDialect |
| Informix | org.hibernate.dialect.InformixDialect |
| Ingres | org.hibernate.dialect.IngresDialect |
| Interbase | org.hibernate.dialect.InterbaseDialect |
| Mckoi SQL | org.hibernate.dialect.MckoiDialect |
| Microsoft SQL Server 2000 | org.hibernate.dialect.SQLServerDialect |
| Microsoft SQL Server 2005 | org.hibernate.dialect.SQLServer2005Dialect |
| Microsoft SQL Server 2008 | org.hibernate.dialect.SQLServer2008Dialect |
| Microsoft SQL Server 2012 | org.hibernate.dialect.SQLServer2008Dialect |
| 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 |
| Pointbase | org.hibernate.dialect.PointbaseDialect |
| PostgreSQL | org.hibernate.dialect.PostgreSQLDialect |
| PostgreSQL 9.2 | org.hibernate.dialect.PostgreSQL82Dialect |
| Postgres Plus Advanced Server | org.hibernate.dialect.PostgresPlusDialect |
| Progress | org.hibernate.dialect.ProgressDialect |
| SAP DB | org.hibernate.dialect.SAPDBDialect |
| Sybase | org.hibernate.dialect.SybaseASE15Dialect |
| Sybase 15.7 | org.hibernate.dialect.SybaseASE157Dialect |
| Sybase Anywhere | org.hibernate.dialect.SybaseAnywhereDialect |
11.2.5. 2 次キャッシュ リンクのコピーリンクがクリップボードにコピーされました!
11.2.5.1. 2 次キャッシュ リンクのコピーリンクがクリップボードにコピーされました!
- Web セッションのクラスタリング
- ステートフルセッション Bean のクラスタリング
- SSO クラスタリング
- Hibernate 2 次キャッシュ
11.2.5.2. Hibernate 用 2 次キャッシュの設定 リンクのコピーリンクがクリップボードにコピーされました!
手順11.4 hibernate.cfg.xml ファイルを作成および編集する
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>
<property name="hibernate.cache.use_second_level_cache">true</property> <property name="hibernate.cache.use_query_cache">true</property>Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 以下のいずれかを
hibernate.cfg.xmlファイルの <session-factory> セクションに追加します。Infinispan CacheManager が JNDI にバインドされる場合
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Infinispan CacheManager がスタンドアロンである場合
<property name="hibernate.cache.region.factory_class"> org.hibernate.cache.infinispan.InfinispanRegionFactory </property><property name="hibernate.cache.region.factory_class"> org.hibernate.cache.infinispan.InfinispanRegionFactory </property>Copy to Clipboard Copied! Toggle word wrap Toggle overflow
Infinispan が Hibernate の 2 次レベルキャッシュとして設定されます。
11.3. Hibernate アノテーション リンクのコピーリンクがクリップボードにコピーされました!
11.3.1. 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 ジェネレーターをデタイプ (detyped) で記述するジェネレーターアノテーションです。 |
| 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 で書かれます。 |
11.4. Hibernate クエリー言語 リンクのコピーリンクがクリップボードにコピーされました!
11.4.1. Hibernate クエリー言語 リンクのコピーリンクがクリップボードにコピーされました!
11.4.2. HQL ステートメント リンクのコピーリンクがクリップボードにコピーされました!
SELECT、 UPDATE、 DELETE、および INSERT ステートメントを許可します。JPQL には HQL の INSERT ステートメントに相当するステートメントはありません。
重要
UPDATE または DELETE ステートメントを実行する場合は注意してください。
| ステートメント | 説明 |
|---|---|
SELECT |
HQL の
SELECT ステートメントの BNF は次のとおりです。
最も簡単な HQL の
SELECT ステートメントは次のような形式になります。
from com.acme.Cat
|
UDPATE | HQL の UPDATE ステートメントの BNF は JPQL と同じです。 |
DELETE | HQL の DELETE ステートメントの BNF は JPQL と同じです。 |
11.4.3. INSERT ステートメント リンクのコピーリンクがクリップボードにコピーされました!
INSERT ステートメントを定義する機能を追加します。これに相当するステートメントは JPQL にはありません。HQL の INSERT ステートメントの BNF は次のとおりです。
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 が使用されます。
例11.3 INSERT クエリーステートメントの例
String hqlInsert = "insert into DelinquentAccount (id, name) select c.id, c.name from Customer c where ..."; int createdEntities = s.createQuery( hqlInsert ).executeUpdate();
String hqlInsert = "insert into DelinquentAccount (id, name) select c.id, c.name from Customer c where ...";
int createdEntities = s.createQuery( hqlInsert ).executeUpdate();
11.4.4. FROM 節 リンクのコピーリンクがクリップボードにコピーされました!
FROM 節の役割は、他のクエリーが使用できるオブジェクトモデルタイプの範囲を定義することです。また、他のクエリーが使用できる「ID 変数」もすべて定義します。
11.4.5. WITH 節 リンクのコピーリンクがクリップボードにコピーされました!
WITH 節を定義し、結合条件を限定します。これは HQL に固有の機能で、JPQL はこの機能を定義しません。
例11.4 with-clause 結合の例
select distinct c
from Customer c
left join c.orders o
with o.value > 5000.00
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 が必要になることがあります。
11.4.6. 一括更新、一括送信、および一括削除 リンクのコピーリンクがクリップボードにコピーされました!
警告
( UPDATE | DELETE ) FROM? EntityName (WHERE where_conditions)? です。
注記
FROM キーワードと WHERE Clause はオプションです。
例11.5 一括更新ステートメントの例
例11.6 一括削除ステートメントの例
Query.executeUpdate() メソッドにより返された int 値は、操作で影響を受けたデータベース内のエンティティー数を示します。
oldName で指定された会社用の Company テーブルだけでなく、結合テーブルに対しても削除が実行されることがあります。したがって、Employee テーブルとの関係が BiDirectional ManyToMany である Company テーブルで、以前の例の正常な実行結果として、対応する結合テーブル Company_Employee から複数の行が失われます。
int deletedEntries 値には、この操作により影響を受けたすべての行 (結合テーブルの行を含む) の数が含まれます。
INSERT INTO EntityName properties_list select_statement です。
注記
例11.7 一括挿入ステートメントの例
id 属性の値を提供しない場合は、基礎となるデータベースが自動生成されたキーをサポートする限り、ユーザーに対して ID が生成されます。この一括挿入操作の戻り値は、データベースで実際に作成されたエントリーの数です。
11.4.7. コレクションメンバーの参照 リンクのコピーリンクがクリップボードにコピーされました!
例11.8 コレクション参照の例
Customer#orders アソシエーションの要素タイプであるオブジェクトモデルタイプ Order を ID 変数 o が実際に参照します。
IN 構文を使用してコレクションアソシエーション結合を指定する代替の構文があります。構文は両方同等です。アプリケーションが使用する構文は任意に選択できます。
11.4.8. 限定パス式 リンクのコピーリンクがクリップボードにコピーされました!
| 式 | 説明 |
|---|---|
VALUE |
コレクション値を参照します。限定子を指定しないことと同じです。目的を明示的に表す場合に便利です。コレクション値 (collection-valued) の参照のすべてのタイプに対して有効です。
|
INDEX |
HQL ルールによると、マップキーまたはリストの場所 (OrderColumn の値) へ参照するよう
javax.persistence.OrderColumn を指定するマップとリストに対して有効です。JPQL では List の使用に対して確保され、MAP に対して KEY を追加します。JPA プロバイダーの移植性に関心があるアプリケーションは、この違いに注意する必要があります。
|
KEY |
マップに対してのみ有効です。マップのキーを参照します。キー自体がエンティティーである場合、更にナビゲートすることが可能です。
|
ENTRY |
マップに対してのみ有効です。マップの論理
java.util.Map.Entry タプル (キーと値の組み合わせ) を参照します。ENTRY は終端パスとしてのみ有効で、select 節のみで有効になります。
|
例11.9 限定コレクション参照の例
11.4.9. スカラー関数 リンクのコピーリンクがクリップボードにコピーされました!
11.4.10. HQL の標準化された関数 リンクのコピーリンクがクリップボードにコピーされました!
| 関数 | 説明 |
|---|---|
BIT_LENGTH |
バイナリデータの長さを返します。
|
CAST |
SQL キャストを実行します。キャストターゲットが使用する Hibernate マッピングタイプの名前を付けるはずです。詳細はデータタイプに関する章を参照してください。
|
EXTRACT |
datetime 値で SQL の抽出を実行します。抽出により、datetime 値の一部が抽出されます (年など)。以下の省略形を参照してください。
|
SECOND |
秒を抽出する抽出の省略形。
|
MINUTE |
分を抽出する抽出の省略形。
|
HOUR |
時間を抽出する抽出の省略形。
|
DAY |
日を抽出する抽出の省略形。
|
MONTH |
月を抽出する抽出の省略形。
|
YEAR |
年を抽出する抽出の省略形。
|
STR |
値を文字データとしてキャストする省略形。
|
org.hibernate.cfg.Configuration の addSqlFunction メソッドを使用して宣言します。
11.4.11. 連結演算 リンクのコピーリンクがクリップボードにコピーされました!
CONCAT) 関数をサポートするだけでなく、連結演算子も定義します。連結演算子は JPQL によっては定義されないため、移植可能なアプリケーションでは使用しないでください。連結演算子は SQL の連結演算子である || を使用します。
例11.10 連結演算の例
select 'Mr. ' || c.name.first || ' ' || c.name.last from Customer c where c.gender = Gender.MALE
select 'Mr. ' || c.name.first || ' ' || c.name.last
from Customer c
where c.gender = Gender.MALE
11.4.12. 動的インスタンス化 リンクのコピーリンクがクリップボードにコピーされました!
例11.11 動的インスタンス化の例 - コンストラクター
select new Family( mother, mate, offspr )
from DomesticCat as mother
join mother.mate as mate
left join mother.kittens as offspr
select new Family( mother, mate, offspr )
from DomesticCat as mother
join mother.mate as mate
left join mother.kittens as offspr
例11.12 動的インスタンス化の例 - リスト
select new list(mother, offspr, mate.name)
from DomesticCat as mother
inner join mother.mate as mate
left outer join mother.kittens as offspr
select new list(mother, offspr, mate.name)
from DomesticCat as mother
inner join mother.mate as mate
left outer join mother.kittens as offspr
例11.13 動的インスタンス化の例 - マップ
11.4.13. HQL 述語 リンクのコピーリンクがクリップボードにコピーされました!
TRUE または FALSE の真理値で解決しますが、NULL が関係するブール値の比較は UNKNOWN で解決します。
HQL 述語
- NULL 述語
- NULL の値をチェックします。基本的な属性参照、エンティティー参照、およびパラメーターへ適用できます。HQL はコンポーネント/埋め込み可能タイプへの適用も許可します。
例11.14 NULL チェックの例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - LIKE 述語
- 文字列値で LIKE 比較を実行します。構文は次のとおりです。
like_expression ::= string_expression [NOT] LIKE pattern_value [ESCAPE escape_character]
like_expression ::= string_expression [NOT] LIKE pattern_value [ESCAPE escape_character]Copy to Clipboard Copied! Toggle word wrap Toggle overflow セマンティックは SQL の LIKE 式に従います。pattern_valueは、string_expressionで一致を試みるパターンです。SQL と同様に、pattern_valueに「_」や「%」をワイルドカードとして使用できます。意味も同じで、「_」はあらゆる 1 つの文字と一致し、「%」はあらゆる数の文字と一致します。任意のescape_characterは、pattern_valueの「_」や「%」をエスケープするために使用するエスケープ文字を指定するために使用されます。「_」や「%」が含まれるパターンを検索する必要がある場合に役立ちます。例11.15 LIKE 述語の例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - BETWEEN 述語
- SQL の
BETWEEN式と同様です。値が他の 2 つの値の間にあることを評価するため実行します。演算対象はすべて比較可能な型を持つ必要があります。例11.16 BETWEEN 述語の例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
11.4.14. 関係比較 リンクのコピーリンクがクリップボードにコピーされました!
例11.17 関係比較の例
ALL、 ANY、 SOME も関与します。SOME と ANY は同義です。
ALL 限定子は true に解決されます。サブクエリーの結果が空の場合は false に解決されます。
例11.18 ALL サブクエリー比較限定子の例
ANY または SOME 限定子は true に解決されます。サブクエリーの結果が空である場合、false に解決されます。
11.4.15. IN 述語 リンクのコピーリンクがクリップボードにコピーされました!
IN 述語は、値のリストに特定の値があることを確認するチェックを行います。構文は次のとおりです。
single_valued_expression のタイプと single_valued_list の各値は一致しなければなりません。JPQL は有効なタイプを文字列、数字、日付、時間、タイムスタンプ、列挙型に限定します。JPQL では、 single_valued_expression は下記のみを参照できます。
- 簡単な属性を表す「ステートフィールド」。アソシエーションとコンポーネント/埋め込み属性を明確に除外します。
- エンティティータイプの式。
single_valued_expression はさらに広範囲の式タイプを参照することが可能です。単一値のアソシエーションは許可されます。コンポーネント/埋め込み属性も許可されますが、この機能は、基礎となるデータベースのタプルまたは「行値コンストラクター構文」へのサポートのレベルに依存します。また、HQL は値タイプを制限しませんが、基礎となるデータベースのべンダーによってはサポートが制限されるタイプがあることをアプリケーション開発者は認識しておいたほうがよいでしょう。これが JPQL の制限の主な原因となります。
constructor_expression と collection_valued_input_parameter では、空の値のリストは許可されず、最低でも 1 つの値が含まれなければなりません。
例11.19 IN 述語の例
11.4.16. HQL の順序付け リンクのコピーリンクがクリップボードにコピーされました!
ORDER BY 節を使用して、結果を順序付けするために使用される選択値を指定します。order-by 節の一部として有効な式タイプには以下が含まれます。
- ステートフィールド
- コンポーネント/埋め込み可能属性
- 算術演算や関数などのスカラー式。
- 前述の式タイプのいずれかに対する select 節に宣言された ID 変数。
ASC (昇順) または DESC (降順) で希望の順序を示し限定することができます。
例11.20 ORDER BY の例
11.5. Hibernate サービス リンクのコピーリンクがクリップボードにコピーされました!
11.5.1. Hibernate サービス リンクのコピーリンクがクリップボードにコピーされました!
11.5.2. サービスコントラクト リンクのコピーリンクがクリップボードにコピーされました!
org.hibernate.service.Service を実装することがサービスの基本的な要件になります。Hibernate は基本的なタイプセーフのために内部でこのインターフェースを使用します。
org.hibernate.service.spi.Startable および org.hibernate.service.spi.Stoppable インターフェースを任意で実装することもできます。その他に、JMX 統合が有効になっている場合に JMX でサービスを管理可能としてマーク付けする org.hibernate.service.spi.Manageable という任意のサービスコントラクトがあります。
11.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参照を使用して、必要な他のサービスを見つけることができます。
11.5.4. ServiceRegistry リンクのコピーリンクがクリップボードにコピーされました!
11.5.4.1. ServiceRegistry リンクのコピーリンクがクリップボードにコピーされました!
org.hibernate.service.ServiceRegistry インターフェースです。サービスレジストリーの主な目的は、サービスを保持および管理し、サービスへのアクセスを提供することです。
org.hibernate.service.ServiceRegistryBuilder を使用して org.hibernate.service.ServiceRegistry インスタンスをビルドします。
例11.21 ServiceRegistryBuilder を使用した ServiceRegistry の作成
ServiceRegistryBuilder registryBuilder = new ServiceRegistryBuilder( bootstrapServiceRegistry );
ServiceRegistry serviceRegistry = registryBuilder.buildServiceRegistry();
ServiceRegistryBuilder registryBuilder = new ServiceRegistryBuilder( bootstrapServiceRegistry );
ServiceRegistry serviceRegistry = registryBuilder.buildServiceRegistry();
11.5.5. カスタムサービス リンクのコピーリンクがクリップボードにコピーされました!
11.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へ追加します。
例11.22 ServiceRegistryBuilder を用いた既存サービスのカスタマーサービスへの置き換え
11.5.6. ブートストラップレジストリー リンクのコピーリンクがクリップボードにコピーされました!
11.5.6.1. ブートストラップレジストリー リンクのコピーリンクがクリップボードにコピーされました!
ClassLoaderService で、代表的な例になります。設定ファイルの解決にもクラスローディングサービス (リソースのルックアップ) へのアクセスが必要になります。通常の使用では、これがルートレジストリーになります。
org.hibernate.service.BootstrapServiceRegistryBuilder クラスを使用してビルドされます。
11.5.6.2. BootstrapServiceRegistryBuilder の使用 リンクのコピーリンクがクリップボードにコピーされました!
例11.23 BootstrapServiceRegistryBuilder の使用
11.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 によるクラスを 1 行に 1 つ表示します。
11.5.7. SessionFactory レジストリー リンクのコピーリンクがクリップボードにコピーされました!
11.5.7.1. SessionFactory レジストリー リンクのコピーリンクがクリップボードにコピーされました!
org.hibernate.SessionFactory のターゲットとして扱うことが最良の方法ですが、このグループのサービスのインスタンスは明示的に 1 つの org.hibernate.SessionFactory に属します。
org.hibernate.SessionFactory にアクセスする必要があります。この特別なレジストリは org.hibernate.service.spi.SessionFactoryServiceRegistry です。
11.5.7.2. SessionFactory サービス リンクのコピーリンクがクリップボードにコピーされました!
org.hibernate.event.service.spi.EventListenerRegistry
- 説明
- イベントリスナーを管理するサービス。
- イニシエーター
org.hibernate.event.service.internal.EventListenerServiceInitiator- 実装
org.hibernate.event.service.internal.EventListenerRegistryImpl
11.5.8. インテグレーター リンクのコピーリンクがクリップボードにコピーされました!
11.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 つ目のメソッドになります。
11.5.8.2. インテグレーターのユースケース リンクのコピーリンクがクリップボードにコピーされました!
org.hibernate.integrator.spi.Integrator の主なユースケースは、イベントリスナーの登録とサービスの提供になります (org.hibernate.integrator.spi.ServiceContributingIntegrator を参照)。5.0 では、オブジェクトとリレーショナルモデルとの間のマッピングを記述するメタモデルを変更できるようにするための拡張を計画しています。
例11.24 イベントリスナーの登録
11.6. Bean の検証 リンクのコピーリンクがクリップボードにコピーされました!
11.6.1. Bean 検証 リンクのコピーリンクがクリップボードにコピーされました!
bean-validation クイックスタートの例を参照してください。
11.6.2. Hibernate バリデーター リンクのコピーリンクがクリップボードにコピーされました!
11.6.3. バリデーション制約 リンクのコピーリンクがクリップボードにコピーされました!
11.6.3.1. バリデーション制約 リンクのコピーリンクがクリップボードにコピーされました!
11.6.3.2. JBoss Developer Studio での制約アノテーションの作成 リンクのコピーリンクがクリップボードにコピーされました!
このタスクでは、Java アプリケーションで利用できるように、JBoss Developer Studio で制約アノテーションを作成するプロセスを説明します。
手順11.5 制約アノテーションを作成する
- JBoss Developer Studio で Java プロジェクトを開きます。
データセットの作成
制約アノテーションには、許容値を定義するデータセットが必要です。- Project Explorer パネルのプロジェクトのルートフォルダーを右クリックします。
- → を選択します。
- 以下の要素を設定してください。
- Package:
- Name:
- ボタンをクリックし必要なインターフェースを追加します。
- をクリックし、ファイルを作成します。
- データセットに値を追加し、 をクリックします。
例11.25 データセットの例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow アノテーションファイルの作成
新しい Java クラスを作成します。詳細については、「JBoss Developer Studio での新しい Java クラスの作成」を参照してください。- 制約アノテーションを設定し をクリックします。
例11.26 制約アノテーションファイルの例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
- 結果
- 許容値のあるカスタムの制約アノテーションが作成され、Java プロジェクトで使用することができます。
11.6.3.3. JBoss Developer Studio での新しい Java クラスの作成 リンクのコピーリンクがクリップボードにコピーされました!
本トピックでは、JBoss Developer Studio を使用して既存の Java プロジェクトに対して Java クラスを作成する手順について説明します。
手順11.6 新しい Java クラスの作成
- Project Explorer パネルのプロジェクトの root フォルダーを右クリックします。
- → と選択します。
- 以下の要素を設定してください。
- Package:
- Name:
任意の設定: インターフェースの追加
- をクリックします。
- インターフェース名を検索します。
- 正しいインターフェースを選択します。
- 必要なインターフェースごとに手順 2 と 3 を繰り返します。
- をクリックします。
- をクリックし、ファイルを作成します。
- 結果
- 設定の準備が整った新しい Java クラスがプロジェクト内に作成されます。
11.6.3.4. Hibernate Validator の制約 リンクのコピーリンクがクリップボードにコピーされました!
| アノテーション | 適用先 | ランタイムチェック | 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 | プロパティー (オブジェクト) | 紐付けされたオブジェクトに再帰的にバリデーションを実行します。オブジェクトがコレクションかアレイの場合は、要素は再帰的に検証されます。また、オブジェクトがマップの場合、値要素が再帰的に検証されます。 | なし |
| プロパティー (文字列) | 文字列が電子メールアドレスの仕様に準拠するかどうかを確認します。 | なし | |
| @CreditCardNumber | プロパティー (文字列) | 文字列が適切にフォーマットされたクレジットカード番号であるかを確認します (Luhn アルゴリズムの派生)。 | なし |
| @Digits(integerDigits=1) | プロパティー (数字あるいは数字の文字列表現) | プロパティーが integerDigits までの整数部と、fractionalDigits までの小数部を持つ数字であるかを確認します。 | カラムの精度とスケールを定義します。 |
| @EAN | プロパティー (文字列) | 文字列が正しくフォーマットされた EAN あるいは UPC-A コードであるかを確認します。 | なし |
11.6.4. 設定 リンクのコピーリンクがクリップボードにコピーされました!
11.6.4.1. 検証設定ファイルの例 リンクのコピーリンクがクリップボードにコピーされました!
例11.27 validation.xml
11.7. Envers リンクのコピーリンクがクリップボードにコピーされました!
11.7.1. Hibernate Envers リンクのコピーリンクがクリップボードにコピーされました!
@Audited アノテーションが付けられたエンティティーに対して監査テーブルが作成されます。その後、データの読み出しやクエリーが可能になります。
- JPA 仕様によって定義されるすべてのマッピングの監査
- JPA 仕様を拡張するすべての Hibernate マッピングの監査
- ネイティブ Hibernate API によりマッピングされた監査エンティティー
- リビジョンエンティティーを用いて各リビジョンのデータをログに記録
- 履歴データのクエリー
11.7.2. 永続クラスの監査 リンクのコピーリンクがクリップボードにコピーされました!
@Audited アノテーションを使用して永続クラスの監査を行います。アノテーションがクラスに適用されると、エンティティーのリビジョン履歴が保存されるテーブルが作成されます。
11.7.3. 監査ストラテジー リンクのコピーリンクがクリップボードにコピーされました!
11.7.3.1. 監査ストラテジー リンクのコピーリンクがクリップボードにコピーされました!
- デフォルトの監査ストラテジー
- このストラテジーは監査データと開始リビジョンを共に永続化します。監査テーブルで挿入、更新、削除された各行については、開始リビジョンの有効性と合わせて、1 つ以上の行が監査テーブルに挿入されます。監査テーブルの行は挿入後には更新されません。監査情報のクエリーはサブクエリーを使い監査テーブルの該当行を選択します (これは時間がかかり、インデックス化が困難です)。
- 妥当性監査ストラテジー
- このストラテジーは監査情報の開始リビジョンと最終リビジョンの両方を格納します。監査テーブルで挿入、更新、削除された各行については、開始リビジョンの有効性とあわせて、1 つ以上の行が監査テーブルに挿入されます。同時に、以前の監査行 (利用可能な場合) の最終リビジョンフィールドがこのリビジョンに設定されます。監査情報に対するクエリーは、サブクエリーの代わりに開始と最終リビジョンのいずれかを使用します。つまり、更新の数が増えるため監査情報の永続化には今までより少し時間がかかりますが、監査情報の取得は非常に早くなります。インデックスを増やすことで改善することも可能です。
11.7.3.2. 監査ストラテジーの設定 リンクのコピーリンクがクリップボードにコピーされました!
JBoss EAP 6 によってサポートされる監査ストラテジーには、デフォルト監査ストラテジーと妥当性監査ストラテジーの 2 つがあります。本タスクでは、アプリケーションに対して監査ストラテジーを定義するために必要な手順について取り上げます。
手順11.7 監査ストラテジーの定義
- アプリケーションの
persistence.xmlファイルのorg.hibernate.envers.audit_strategyプロパティーを設定します。このプロパティーがpersistence.xmlファイルで設定されていない場合は、デフォルトの監査ストラテジーが使用されます。例11.28 デフォルトの監査ストラテジーの設定
<property name="org.hibernate.envers.audit_strategy" value="org.hibernate.envers.strategy.DefaultAuditStrategy"/>
<property name="org.hibernate.envers.audit_strategy" value="org.hibernate.envers.strategy.DefaultAuditStrategy"/>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 例11.29 妥当性監査ストラテジーの設定
<property name="org.hibernate.envers.audit_strategy" value="org.hibernate.envers.strategy.ValidityAuditStrategy"/>
<property name="org.hibernate.envers.audit_strategy" value="org.hibernate.envers.strategy.ValidityAuditStrategy"/>Copy to Clipboard Copied! Toggle word wrap Toggle overflow
11.7.4. エンティティー監査の開始 リンクのコピーリンクがクリップボードにコピーされました!
11.7.4.1. JPA エンティティーへの監査サポートの追加 リンクのコピーリンクがクリップボードにコピーされました!
手順11.8 JPA エンティティーへの監査サポートの追加
- 「Envers パラメーターの設定」に従って、デプロイメントに適した使用可能な監査パラメーターを設定します。
- 監査対象となる JPA エンティティーを開きます。
org.hibernate.envers.Auditedインターフェースをインポートします。- 監査対象となる各フィールドまたはプロパティーに
@Auditedアノテーションを付けます。または、1 度にクラス全体へアノテーションを付けます。例11.30 2 つのフィールドの監査
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 例11.31 クラス全体の監査
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
JPA エンティティーの監査が設定されました。変更履歴を保存するため Entity_AUD と呼ばれるテーブルが作成されます。
11.7.5. 設定 リンクのコピーリンクがクリップボードにコピーされました!
11.7.5.1. Envers パラメーターの設定 リンクのコピーリンクがクリップボードにコピーされました!
手順11.9 Envers パラメーターの設定
- アプリケーションの
persistence.xmlファイルを開きます。 - 必要に応じて Envers プロパティーを追加、削除、または設定します。使用可能なプロパティーの一覧は 「Envers の設定プロパティー」 を参照してください。
例11.32 Envers パラメーターの例
- 結果
- アプリケーションのすべての JPA エンティティーに対して監査の設定が行われます。
11.7.5.2. ランタイム時に監査を有効または無効にする リンクのコピーリンクがクリップボードにコピーされました!
このタスクでは、ランタイム時にエンティティーバージョン監査を有効または無効にするために必要な設定手順について取り上げます。
手順11.10 監査を有効/無効にする
AuditEventListenerクラスをサブクラス化します。- Hibernate イベント上で呼び出される次のメソッドを上書きします。
- onPostInsert
- onPostUpdate
- onPostDelete
- onPreUpdateCollection
- onPreRemoveCollection
- onPostRecreateCollection
- イベントのリスナーとしてサブクラスを指定します。
- 変更を監査すべきであるか判断します。
- 変更を監査する必要がある場合は、呼び出しをスーパークラスへ渡します。
11.7.5.3. 条件付き監査の設定 リンクのコピーリンクがクリップボードにコピーされました!
Hibernate Envers は多くのイベントリスナーを使用して、さまざまな Hibernate イベントに対して監査データを永続化します。Envers jar がクラスパスにある場合、これらのリスナーは自動的に登録されます。このタスクでは、Envers イベントリスナーの一部を上書きして条件付き監査を実装するために必要な手順について取り上げます。
手順11.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ファイルを追加します。このファイルにはインターフェースを実装するクラスの完全修飾名が含まれなければなりません。
条件付き監査が設定され、デフォルトの Envers イベントリスナーがオーバーライドされます。
11.7.5.4. Envers の設定プロパティー リンクのコピーリンクがクリップボードにコピーされました!
| プロパティー名 | デフォルト値 | 説明 |
|---|---|---|
|
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 とマークされたエンティティーが削除される場合にエンティティーデータをリビジョンに保存すべきかどうかを定義します。このデータは最終リビジョンに存在するため、これは通常必要ありません。最終リビジョンのデータにアクセスする方が簡単で効率的ですが、この場合、削除前にエンティティーに含まれたデータが 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 と評価された場合のみ使用されます。
|
11.7.6. Queries リンクのコピーリンクがクリップボードにコピーされました!
11.7.6.1. 監査情報の読み出し リンクのコピーリンクがクリップボードにコピーされました!
Hibernate Envers はクエリーより監査情報を読み出しする機能を提供します。このトピックではクエリーの例を取り上げます。
注記
live データの対応するクエリーよりも大幅に処理が遅くなります。
例11.33 特定のリビジョンでクラスのエンティティーをクエリーする
AuditQuery query = getAuditReader()
.createQuery()
.forEntitiesAtRevision(MyEntity.class, revisionNumber);
AuditQuery query = getAuditReader()
.createQuery()
.forEntitiesAtRevision(MyEntity.class, revisionNumber);
AuditEntity ファクトリクラスを使用して制約を指定することができます。以下のクエリーは、name プロパティーが John と同等である場合のみエンティティーを選択します。
query.add(AuditEntity.property("name").eq("John"));
query.add(AuditEntity.property("name").eq("John"));
query.add(AuditEntity.property("address").eq(relatedEntityInstance));
// or
query.add(AuditEntity.relatedId("address").eq(relatedEntityId));
query.add(AuditEntity.property("address").eq(relatedEntityInstance));
// or
query.add(AuditEntity.relatedId("address").eq(relatedEntityId));
例11.34 特定クラスのエンティティーが変更された場合のクエリーリビジョン
AuditQuery query = getAuditReader().createQuery()
.forRevisionsOfEntity(MyEntity.class, false, true);
AuditQuery query = getAuditReader().createQuery()
.forRevisionsOfEntity(MyEntity.class, false, true);
AuditEntity.revisionNumber()- 監査されたエンティティーが修正されたリビジョン番号の制約や射影、順序付けを指定します。
AuditEntity.revisionProperty(propertyName)- 監査されたエンティティーが修正されたリビジョンに対応するリビジョンエンティティーのプロパティーの制約や射影、順序付けを指定します。
AuditEntity.revisionType()- リビジョンのタイプ (ADD、MOD、DEL) へのアクセスを提供します。
entityId ID を持つ MyEntity クラスのエンティティーが変更された最小のリビジョン番号を選択します。
actualDate 値が指定の値よりは大きく、可能な限り小さいリビジョンを選択します。
minimize() および maximize() メソッドは制約を追加できる基準を返します。最大化または最小化されたプロパティーを持つエンティティーはこの基準を満たさなければなりません。
selectEntitiesOnly- このパラメーターは明示的な射影が設定されていない場合のみ有効です。true の場合、クエリーの結果は指定された制約を満たすリビジョンで変更されたエンティティーの一覧になります。false の場合、結果は 3 つの要素アレイの一覧になります。最初の要素は変更されたエンティティーインスタンスになります。2 番目の要素はリビジョンデータが含まれるエンティティーになります。カスタムエンティティーが使用されていない場合は
DefaultRevisionEntityのインスタンスになります。3 つ目の要素アレイはリビジョンのタイプ (ADD、MOD、DEL) になります。 selectDeletedEntities- このパラメーターは、エンティティーが削除されたリビジョンが結果に含まれなければならない場合に指定されます。true の場合、エンティティーのリビジョンタイプが
DELになり、id 以外のすべてのフィールドの値がnullになります。
例11.35 特定のプロパティーを修正したエンティティーのクエリーリビジョン
actualDate プロパティーが変更された、指定の ID を持つ MyEntity のすべてのリビジョンを返します。
AuditQuery query = getAuditReader().createQuery()
.forRevisionsOfEntity(MyEntity.class, false, true)
.add(AuditEntity.id().eq(id));
.add(AuditEntity.property("actualDate").hasChanged())
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());
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());
AuditQuery query = getAuditReader().createQuery()
.forEntitiesModifiedAtRevision(MyEntity.class, revisionNumber)
.add(AuditEntity.property("prop1").hasChanged())
.add(AuditEntity.property("prop2").hasNotChanged());
例11.36 特定のリビジョンで修正されたクエリーエンティティー
Set<Pair<String, Class>> modifiedEntityTypes = getAuditReader()
.getCrossTypeRevisionChangesReader().findEntityTypes(revisionNumber);
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.8. パフォーマンスチューニング リンクのコピーリンクがクリップボードにコピーされました!
11.8.1. 代替のバッチローディングアルゴリズム リンクのコピーリンクがクリップボードにコピーされました!
- クラスごとのレベルHibernate がクラスごとのレベルでデータをロードする場合、クエリー時に事前ロードするアソシエーションのバッチサイズが必要になります。たとえば、起動時に
carオブジェクトの 30 個のインスタンスがセッションでロードされるとします。各carオブジェクトはownerオブジェクトに属します。lazyローディングで、すべてのcarオブジェクトを繰り返し、これらの owner (所有者) を要求する場合、Hibernate は owner ごとに 1 つ、合計 30 個の select ステートメントを発行します。これは、パフォーマンス上のボトルネックになります。この代わりに、クエリーによって要求される前に次の owner のバッチに対してデータを事前ロードするよう Hibernate を指示できます。ownerオブジェクトがクエリーされると、Hibernate は同じ SELECT ステートメントでこれらのオブジェクトをさらに多くクエリーします。事前にクエリーされるownerオブジェクトの数は、設定時に指定されたbatch-sizeパラメーターによって異なります。<class name="owner" batch-size="10"></class>
<class name="owner" batch-size="10"></class>Copy to Clipboard Copied! Toggle word wrap Toggle overflow これは、今後必要になると見込まれる最低 10 個のownerオブジェクトをクエリーするよう Hibernate に指示します。ユーザーがcar Aのownerをクエリーする時、car Bのownerはすでにバッチローディングの一部としてロードされた可能性があります。実際にcar Bのownerが必要になった場合、データーベースにアクセスして SELECT ステートメントを発行する代わりに、現在のセッションより値を読み出すことができます。Hibernate 4.2.0 には、batch-sizeパラメーターの他に、バッチローディングのパフォーマンスを向上する新しい設定項目が追加されました。この設定項目はBatch Fetch Style設定と呼ばれ、hibernate.batch_fetch_styleパラメーターによって指定されます。LEGACY、PADDED、および DYNAMIC の 3 つのバッチフェッチスタイルがサポートされます。使用するスタイルを指定するには、org.hibernate.cfg.AvailableSettings#BATCH_FETCH_STYLEを使用します。- LEGACY: LEGACY スタイルのローディングでは、
ArrayHelper.getBatchSizes(int)を基にする事前ビルドされたバッチサイズが使用されます。既存のバッチ可能な識別子の数より、次に小さい事前ビルドされたバッチサイズを使用してバッチがロードされます。前述の例を用いた場合、batch-sizeの設定が 30 であると、事前ビルドされたバッチサイズは [30, 15, 10, 9, 8, 7, .., 1] になります。29 個の識別子をバッチロードしようとすると、バッチは 15、10、および 4 になります。対応する 3 つの SQL クエリーが発生し、各クエリーはデータベースより 15、10、および 4 人の owner をロードします。 - PADDED - PADDED は LEGACY スタイルのバッチローディングと似ています。PADDED も事前ビルドされたバッチサイズを使用しますが、次に大きなバッチサイズを使用し、余分な識別子プレースホルダーを埋め込みます。上記の例で、30 個の owner オブジェクトが初期化される場合は、データベースに対して 1 つのクエリーのみが実行されます。29 個の owner オブジェクトが初期化される場合、Hibernate は同様にバッチサイズが 30 の SQL select ステートメントを 1 つ実行しますが、余分なスペースが繰り替えされる識別子で埋め込みされます。
- DYNAMIC - DYNAMIC スタイルのバッチローディングはバッチサイズの制限に準拠しますが、実際にロードされるオブジェクトの数を使用して SQL SELECT ステートメントを動的にビルドします。たとえば、30 個の owner オブジェクトで最大バッチサイズが 30 の場合、 30 個の owner オブジェクトの読み出しは 1 つの SQL SELECT ステートメントによって実行されます。35 個の owner オブジェクトの読み出す場合は、SQL ステートメントが 2 つになり、それぞれのバッチサイズが 30 と 5 になります。Hibernate は、制限どおりにバッチサイズを 30 以下とし、2 つ目の SQL ステートメントを動的に変更して、必要数である 5 にします。PADDED とは異なり、2 つ目の SQL は埋め込みされません。また、2 つ目の SQL ステートメントは動的に作成され、固定サイズでないことが LEGACY とは異なります。30 個未満のクエリーでは、このスタイルは要求された識別子の数のみを動的にロードします。
- コレクションごとのレベルHibernate は、前項の「クラスごとのレベル」で説明したバッチフェッチサイズとスタイルを維持してコレクションをバッチロードすることもできます。前項の例を逆にして、各
ownerオブジェクトによって所有されるすべてのcarオブジェクトをロード必要があるとします。10 個のownerオブジェクトがすべての owner を繰り返し、現セッションにロードされた場合、getCars()メソッドの呼び出しごとに 1 つの SELECT ステートメントが生成されるため、合計で 10 個の SELECT ステートメントが生成されます。owner のマッピングでの car コレクションのバッチフェッチングを有効にすると、Hibernate は下記のようにこれらのコレクションを事前フェッチできます。<class name="Owner"><set name="cars" batch-size="5"></set></class>
<class name="Owner"><set name="cars" batch-size="5"></set></class>Copy to Clipboard Copied! Toggle word wrap Toggle overflow よって、batch-sizeが 5 で LEGACY バッチスタイルを使用する場合、Hibernate は 2 つの SELECT ステートメントの 5 つのコレクションをロードします。
11.8.2. 不変データのオブジェクト参照の 2 次キャッシング リンクのコピーリンクがクリップボードにコピーされました!
hibernate.cache.use_reference_entries の値を true に変更します。デフォルトでは、hibernate.cache.use_reference_entries が false に設定されています。
hibernate.cache.use_reference_entries が true に設定されると、アソシエーションを持たない不変データオブジェクトは 2 次キャッシュにコピーされず、不変データオブジェクトへの参照のみが保存されます。
警告
hibernate.cache.use_reference_entries が true に設定されても、アソシエーションを持つ不変データオブジェクトは 2 次キャッシュにディープコピーされます。
第12章 JAX-RS Web サービス リンクのコピーリンクがクリップボードにコピーされました!
12.1. JAX-RS リンクのコピーリンクがクリップボードにコピーされました!
helloworld-rs、jax-rs-client、および kitchensink クイックスタートを参照してください。
12.2. RESTEasy リンクのコピーリンクがクリップボードにコピーされました!
12.3. RESTful Web サービス リンクのコピーリンクがクリップボードにコピーされました!
12.4. RESTEasy 定義済みアノテーション リンクのコピーリンクがクリップボードにコピーされました!
| アノテーション | 使用法 |
|---|---|
ClientResponseType | これは、Response の戻り値タイプを持つ RESTEasy クライアントインターフェースに追加できるアノテーションです。 |
ContentEncoding | アノテートされたアノテーションを使用して適用する Content-Encoding を指定するメタアノテーション。 |
DecorateTypes | サポートされたタイプを指定するために DecoratorProcessor クラスに配置する必要があります。 |
Decorator | デコレーションをトリガーする別のアノテーションに配置するメタアノテーション。 |
Form | これは、受信/送信の要求/応答用の値オブジェクトとして使用できます。 |
StringParameterUnmarshallerBinder | 文字列ベースのアノテーションインジェクターに適用する StringParameterUnmarshaller をトリガーする別のアノテーションに配置するメタアノテーション。 |
Cache | 応答の Cache-Control ヘッダーを自動的に設定します。 |
NoCache | Cache-Control 応答ヘッダーを "nocache" に設定します。 |
ServerCached | この jax-rs メソッドへの応答をサーバーでキャッシュするよう指定します。 |
ClientInterceptor | インターセプターをクライアントサイドインターセプターとして識別します。 |
DecoderPrecedence | このインターセプターは、Content-Encoding デコーダーです。 |
EncoderPrecedence | このインターセプターは、Content-Encoding エンコーダーです。 |
HeaderDecoratorPrecedence | HeaderDecoratorPrecedence インターセプターは、応答 (サーバー上) または送信要求 (クライアント上) を特別なユーザー定義ヘッダーでデコレートするため、常に最初に使用する必要があります。 |
RedirectPrecedence | PreProcessInterceptor に配置する必要があります。 |
SecurityPrecedence | PreProcessInterceptor に配置する必要があります。 |
ServerInterceptor | インターセプターをサーバーサイドインターセプターとして識別します。 |
NoJackson | Jackson プロバイダーをトリガーしない場合にクラス、パラメーター、フィールド、またはメソッドに配置されます。 |
ImageWriterParams | IIOImageProvider にパラメーターを渡すためにリソースクラスが使用できるアノテーション。 |
DoNotUseJAXBProvider | JAXB MessageBodyReader/Writer を使用せず、タイプをマーシャルするためにさらに特定のプロバイダーを使用する場合は、これをクラスまたはパラメーターに配置します。 |
Formatted | XML 出力をインデントと改行を使用して書式設定します。これは JAXB デコレーターです。 |
IgnoreMediaTypes | 特定のメディタイプに JAXB プロバイダーを使用しないよう JAXRS に指示するために、タイプ、メソッド、パラメーター、またはフィールドに配置されます。 |
Stylesheet | XML スタイルシートヘッダーを指定します。 |
Wrapped | JAXB オブジェクトのコレクションまたはアレイをマーシャルまたはマーシャル解除する場合は、これをメソッドまたはパラメーターに配置します。 |
WrappedMap | JAXB オブジェクトのマップをマーシャルまたはマーシャル解除する場合は、これをメソッドまたはパラメーターに配置します。 |
XmlHeader | 返されたドキュメントの XML ヘッダーを設定します。 |
BadgerFish | JSONConfig |
Mapped | JSONConfig |
XmlNsMap | JSONToXml |
MultipartForm | これは、multipart/form-data mime タイプの受信/送信の要求/応答用の値オブジェクトとして使用できます。 |
PartType | リストまたはマップを multipart/* タイプを書きだす場合に、Multipart プロバイダーとともに使用する必要があります。 |
XopWithMultipartRelated | このアノテーションは、JAXB アノテートオブジェクトに対して受信/送信 XOP メッセージ (multipart/related としてパッケージ化) を処理/生成するために使用できます。 |
After | 署名または古さの検証を行う場合に、期限切れ属性を追加するために使用されます。 |
Signed | DOSETA 仕様を使用して要求または応答の署名をトリガーする便利なアノテーション。 |
Verify | 署名ヘッダーに指定された入力署名の検証。 |
12.5. RESTEasy 設定 リンクのコピーリンクがクリップボードにコピーされました!
12.5.1. RESTEasy 設定パラメーター リンクのコピーリンクがクリップボードにコピーされました!
| オプション名 | デフォルト値 | 説明 |
|---|---|---|
| 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 ヘッダーを使用して言語を選択することができない場合に使用します (ブラウザーなど)。 |
重要
web.xml ファイル内の resteasy.scan.* 設定が無視され、すべての JAX-RS 自動コンポーネントが自動的にスキャンされます。
12.6. JAX-RS Web サービスセキュリティー リンクのコピーリンクがクリップボードにコピーされました!
12.6.1. RESTEasy JAX-RS Web サービスのロールベースのセキュリティーの有効化 リンクのコピーリンクがクリップボードにコピーされました!
RESTEasy は JAX-RS メソッドの @RolesAllowed、@PermitAll、@DenyAll アノテーションをサポートしますが、デフォルトではこれらのアノテーションを認識しません。次の手順に従って web.xml ファイルを設定し、ロールベースセキュリティーを有効にします。
警告
手順12.1 RESTEasy JAX-RS Web サービスのロールベースのセキュリティーの有効化
- テキストエディターでアプリケーションの
web.xmlファイルを開きます。 - 以下の <context-param> をファイルの
web-appタグ内に追加します。<context-param> <param-name>resteasy.role.based.security</param-name> <param-value>true</param-value> </context-param><context-param> <param-name>resteasy.role.based.security</param-name> <param-value>true</param-value> </context-param>Copy to Clipboard Copied! Toggle word wrap Toggle overflow - <security-role> タグを使用して RESTEasy JAX-RS WAR ファイル内で使用されるすべてのロールを宣言します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - すべてのロールに対して JAX-RS ランタイムが対応する全 URL へのアクセスを承認します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
ロールベースセキュリティーが定義されたロールのセットによりアプリケーション内で有効になります。
例12.1 ロールベースセキュリティーの設定例
12.6.2. アノテーションを使用した JAX-RS Web サービスのセキュア化 リンクのコピーリンクがクリップボードにコピーされました!
サポート対象のセキュリティーアノテーションを使用して JAX-RS Web サービスをセキュアにする手順を取り上げます。
手順12.2 サポート対象のセキュリティーアノテーションを使用した JAX-RS Web サービスのセキュア化
- ロールベースセキュリティーを有効にします。詳細は「RESTEasy JAX-RS Web サービスのロールベースのセキュリティーの有効化」を参照してください。
- JAX-RS Web サービスにセキュリティーアノテーションを追加します。RESTEasy は次のアノテーションをサポートします。
- @RolesAllowed
- メソッドにアクセスできるロールを定義します。ロールはすべて
web.xmlファイルに定義する必要があります。 - @PermitAll
web.xmlファイルに定義されているすべてのロールによるメソッドへのアクセスを許可します。- @DenyAll
- メソッドへのアクセスをすべて拒否します。
12.7. RESTEasy ロギング リンクのコピーリンクがクリップボードにコピーされました!
12.7.1. JAX-RS Web サービスロギング リンクのコピーリンクがクリップボードにコピーされました!
- log4j がアプリケーションのクラスパスにある場合は、log4j が使用されます。
- slf4j がアプリケーションのクラスパスにある場合は、slf4j が使用されます。
- log4j と slf4j がいずれもクラスパスにない場合は、java.util.logging がデフォルトで使用されます。
- サーブレットのコンテキストパラメーター resteasy.logger.type が java.util.logging、log4j、または slf4j に設定された場合は、このデフォルトの動作がオーバーライドされます。
12.7.2. RESTEasy で定義されたロギングカテゴリー リンクのコピーリンクがクリップボードにコピーされました!
| カテゴリー | 関数 |
|---|---|
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 モックフレームワークによりすべての活動をログに記録します。 |
12.8. 例外処理 リンクのコピーリンクがクリップボードにコピーされました!
12.8.1. 例外マッパーの作成 リンクのコピーリンクがクリップボードにコピーされました!
例外マッパーはスローされた例外をキャッチし、特定の HTTP 応答を書き込むコンポーネントで、アプリケーションによって提供されます。
例12.2 例外マッパー
ExceptionMapper インターフェースを実装します。
resteasy.providers コンテキストパラメーター下の web.xml に例外マッパーをリストするか、プログラムを使用して ResteasyProviderFactory クラスより例外マッパーを登録します。
12.8.2. RESTEasy の内部でスローされる例外 リンクのコピーリンクがクリップボードにコピーされました!
| 例外 | HTTP コード | 説明 |
|---|---|---|
| BadRequestException | 400 | 不正なリクエスト。このリクエストは正しくフォーマットされていないか、リクエスト入力の処理に問題があります。 |
| UnauthorizedException | 401 | 権限がありません。RESTEasy のアノテーションおよびロールベースのセキュリティーを使用している場合は、セキュリティーの例外がスローされます。 |
| InternalServerErrorException | 500 | 内部サーバーエラー。 |
| MethodNotAllowedException | 405 | 呼び出された HTTP 操作を処理できるリソースに対して、AX-RS メソッドがありません。 |
| NotAcceptableException | 406 | Accept ヘッダーに記載されているメディアタイプを生成できる JAX-RS がありません。 |
| NotFoundException | 404 | リクエストパス/リソースに対応する JAX-RS メソッドがありません。 |
| ReaderException | 400 | MessageBodyReaders からスローされた例外はすべて、この例外の中にラップされます。ラップされた例外に ExceptionMapper がないか、あるいは例外が WebApplicationException でない場合、RESTEasy はデフォルトで 400 コードを返します。 |
| WriterException | 500 | MessageBodyWriters からスローされた例外はすべて、この例外の中にラップされます。ラップされた例外に ExceptionMapper がないか、あるいは例外が WebApplicationException でない場合、RESTEasy はデフォルトで 400 コードを返します。 |
| JAXBUnmarshalException | 400 | JAXB プロバイダー (XML および Jettison) はこの例外を読み込み時にスローします。 JAXBExceptions をラッピングする場合もあります。このクラスは ReaderException を拡張します。 |
| 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 ではデフォルトで例外をスローします。 |
12.9. RESTEasy インターセプター リンクのコピーリンクがクリップボードにコピーされました!
12.9.1. JAX-RS 呼び出しのインターセプト リンクのコピーリンクがクリップボードにコピーされました!
RESTEasy は JAX-RS 呼び出しをインターセプトでき、インターセプターと呼ばれるリスナーのようなオブジェクトでルーティングを行います。このトピックでは、4 種類のインターセプターについて説明します。
例12.3 MessageBodyReader/Writer インターセプター
@Provider と、@ServerInterceptor と @ClientInterceptor のいずれかが付けられます。
MessageBodyReader.readFrom() あるいは MessageBodyWriter.writeTo() の呼び出しをラップします。また、出力または入力ストリームをラップするために使用できます。
MessageBodyReaderContext.proceed() あるいは MessageBodyWriterContext.proceed() が呼び出されます。呼び出すインターセプターがなくなると、MessageBodyReader または MessageBodyWriter の readFrom() か writeTo() が呼び出されます。このラッピングにより、オブジェクトが Reader または Writer に到達する前にオブジェクトが変更され、proceed() が返された後にクリーンアップされます。
例12.4 PreProcessInterceptor
public interface PreProcessInterceptor
{
ServerResponse preProcess(HttpRequest request, ResourceMethod method) throws Failure, WebApplicationException;
}
public interface PreProcessInterceptor
{
ServerResponse preProcess(HttpRequest request, ResourceMethod method) throws Failure, WebApplicationException;
}
preProcess() メソッドが ServerResponse を返すと、基礎となる JAX-RS メソッドは呼び出されず、ランタイムが応答を処理してクライアントに返します。preProcess() メソッドが ServerResponse を返さない場合は、基礎となる JAX-RS メソッドが呼び出されます。
例12.5 PostProcessInterceptors
public interface PostProcessInterceptor
{
void postProcess(ServerResponse response);
}
public interface PostProcessInterceptor
{
void postProcess(ServerResponse response);
}
例12.6 ClientExecutionInterceptors
@ClientInterceptor および @Provider アノテーションを付ける必要があります。これらのインターセプターは、MessageBodyWriter の後、ClientRequest がクライアント側でビルドされた後に実行されます。
12.9.2. インターセプターの JAX-RS メソッドへのバインド リンクのコピーリンクがクリップボードにコピーされました!
デフォルトでは、登録済みの全インターセプターが、全リクエストに対して呼び出されます。 AcceptedByMethod インターフェースを実装し、この動作を調整できます。
例12.7 インターセプターのバインド例
AcceptedByMethod インターフェースを実装するインターセプターに対して accept() メソッドを呼び出します。このメソッドが true を返す場合、インターセプターが JAX-RS メソッドの呼び出しチェーンに追加され、True が返されない場合はそのメソッドについては無視されます。
accept() が @GET アノテーションが JAX-RS メソッドに存在するかを判断します。存在する場合、インターセプターがこのメソッドの呼び出しチェーンに適用されます。
12.9.3. インターセプターの登録 リンクのコピーリンクがクリップボードにコピーされました!
このトピックでは、RESTEasy JAX-RS インターセプターをアプリケーションに登録する方法を説明します。
手順12.3 インターセプターの登録
- インターセプターを登録するには、
resteasy.providerscontext-param 下のweb.xmlファイルにインターセプターをリストアップするか、Application.getClasses()またはApplication.getSingletons()メソッドでクラスまたはオブジェクトとして返します。
12.9.4. インターセプター優先度ファミリー リンクのコピーリンクがクリップボードにコピーされました!
12.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 をラップします。
12.9.4.2. カスタムのインターセプター優先度ファミリーの定義 リンクのコピーリンクがクリップボードにコピーされました!
カスタムの優先度ファミリーは web.xml ファイルで作成および登録できます。このトピックでは、インターセプターの優先度ファミリーの定義に使用できるコンテキストパラメーターの例について説明します。
例12.8 resteasy.append.interceptor.precedence
resteasy.append.interceptor.precedence のコンテキストパラメーターは、デフォルトの優先度ファミリーリストに新規の優先度ファミリーを追加します。
<context-param>
<param-name>resteasy.append.interceptor.precedence</param-name>
<param-value>CUSTOM_PRECEDENCE_FAMILY</param-value>
</context-param>
<context-param>
<param-name>resteasy.append.interceptor.precedence</param-name>
<param-value>CUSTOM_PRECEDENCE_FAMILY</param-value>
</context-param>
例12.9 resteasy.interceptor.before.precedence
resteasy.interceptor.before.precedence コンテキストパラメーターは、カスタムファミリーが先に実行されるデフォルトの優先度ファミリーを定義します。 このパラメーターの値は、 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>
<context-param>
<param-name>resteasy.interceptor.before.precedence</param-name>
<param-value>DEFAULT_PRECEDENCE_FAMILY : CUSTOM_PRECEDENCE_FAMILY</param-value>
</context-param>
例12.10 resteasy.interceptor.after.precedence
resteasy.interceptor.after.precedenceコンテキストパラメーターは、カスタムファミリーが後で実行されるデフォルトの優先度ファミリーを定義します。 このパラメーターの値は、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>
<context-param>
<param-name>resteasy.interceptor.after.precedence</param-name>
<param-value>DEFAULT_PRECEDENCE_FAMILY : CUSTOM_PRECEDENCE_FAMILY</param-value>
</context-param>
12.10. 文字列ベースのアノテーション リンクのコピーリンクがクリップボードにコピーされました!
12.10.1. 文字列ベースの @*Param アノテーションのオブジェクトへの変換 リンクのコピーリンクがクリップボードにコピーされました!
@*Param アノテーションは、Raw HTTP リクエストの文字列として表現されます。これらのオブジェクトに valueOf(String) の静的メソッドあるいは String パラメーターを取るコンストラクターが含まれている場合、このようなインジェクトされたパラメーターをオブジェクトに変換できます。
@Provider インターフェースを提供し、valueOf(String) 静的メソッドと文字列コンストラクターをいずれも持たないクラスに対して、この変換処理を行います。
例12.11 StringConverter
例12.12 StringParameterUnmarshaller
StringParameterUnmarshaller インターフェースは、パラメーターに付けられたアノテーションや、注入先のフィールドからの影響を受けます。これは、インジェクターごとに作成されます。setAnnotations() メソッドは、resteasy に呼び出されアンマーシャラーを初期化します。
org.jboss.resteasy.annotations.StringsParameterUnmarshallerBinder と呼ばれる meta-annotation を使いバインドすることもできます。
java.util.Date ベースの @PathParam をフォーマットします。
12.11. ファイル拡張子の設定 リンクのコピーリンクがクリップボードにコピーされました!
12.11.1. web.xml ファイルでのファイル拡張子のメディアタイプへのマッピング リンクのコピーリンクがクリップボードにコピーされました!
クライアントによっては、ブラウザー同様に表現のメディアタイプや言語のネゴシエーションに Accept および Accept-Language ヘッダーを使用できないものがあります。RESTEasy はこの問題に対処するため、ファイル名の接尾辞をメディアタイプや言語にマッピングすることができます。次の手順に従って、web.xml ファイルにてメディアタイプをファイル拡張子にマッピングします。
手順12.4 メディアタイプのファイル拡張子へのマッピング
- テキストエディターでアプリケーションの
web.xmlファイルを開きます。 - コンテキストパラメーター
resteasy.media.type.mappingsをファイルのweb-appタグ内に追加します。<context-param> <param-name>resteasy.media.type.mappings</param-name> </context-param><context-param> <param-name>resteasy.media.type.mappings</param-name> </context-param>Copy to Clipboard Copied! Toggle word wrap Toggle overflow - パラメーター値を設定します。マッピングはコンマ区切りリストを形成します。各マッピングは
:で区切られます。例12.13 マッピングの例
<context-param> <param-name>resteasy.media.type.mappings</param-name> <param-value>html : text/html, json : application/json, xml : application/xml</param-value> </context-param><context-param> <param-name>resteasy.media.type.mappings</param-name> <param-value>html : text/html, json : application/json, xml : application/xml</param-value> </context-param>Copy to Clipboard Copied! Toggle word wrap Toggle overflow
12.11.2. web.xml ファイルにてファイル拡張子を言語にマッピングする リンクのコピーリンクがクリップボードにコピーされました!
クライアントによっては、ブラウザー同様に表現のメディアタイプや言語のネゴシエーションに Accept および Accept-Language ヘッダーを使用できないものがあります。RESTEasy はこの問題に対処するため、ファイル名の接尾辞をメディアタイプや言語にマッピングすることができます。次の手順に従って、web.xml ファイルにて言語をファイル拡張子にマッピングします。
手順12.5 web.xml ファイルにてファイル拡張子を言語にマッピングする
- テキストエディターでアプリケーションの
web.xmlファイルを開きます。 - コンテキストパラメーター
resteasy.language.mappingsをファイルのweb-appタグ内に追加します。<context-param> <param-name>resteasy.language.mappings</param-name> </context-param><context-param> <param-name>resteasy.language.mappings</param-name> </context-param>Copy to Clipboard Copied! Toggle word wrap Toggle overflow - パラメーター値を設定します。マッピングはコンマ区切りリストを形成します。各マッピングは
:で区切られます。例12.14 マッピングの例
<context-param> <param-name>resteasy.language.mappings</param-name> <param-value> en : en-US, es : es, fr : fr</param-name> </context-param><context-param> <param-name>resteasy.language.mappings</param-name> <param-value> en : en-US, es : es, fr : fr</param-name> </context-param>Copy to Clipboard Copied! Toggle word wrap Toggle overflow
12.11.3. RESTEasy 対応メディアの種類 リンクのコピーリンクがクリップボードにコピーされました!
| メディアの種類 | 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 |
| text/plain | プリミティブ、java.lang.String、ストリングコンストラクターを持つ型、インプット向けの静的 valueOf(String) メソッド、アウトプット向けの toString() |
| */* | javax.activation.DataSource |
| */* | byte[] |
| */* | java.io.File |
| application/x-www-form-urlencoded | javax.ws.rs.core.MultivaluedMap |
12.12. RESTEasy JavaScript API リンクのコピーリンクがクリップボードにコピーされました!
12.12.1. RESTEasy JavaScript API リンクのコピーリンクがクリップボードにコピーされました!
例12.15 単純な JAX-RS JavaScript API の例
var X = {
Y : function(params){...},
Z : function(params){...}
};
var X = {
Y : function(params){...},
Z : function(params){...}
};
12.12.2. RESTEasy JavaScript API サーブレットの有効化 リンクのコピーリンクがクリップボードにコピーされました!
RESTEasy JavaScript API はデフォルトでは有効になっていません。次の手順に従い、web.xml ファイルを使用して有効にします。
手順12.6 web.xml を編集して RESTEasy JavaScript API を有効にする
- テキストエディターでアプリケーションの
web.xmlファイルを開きます。 - 以下の設定をファイルの
web-appタグ内に追加します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow
12.12.3. RESTEasy Javascript API パラメーター リンクのコピーリンクがクリップボードにコピーされました!
| プロパティ | デフォルト値 | 説明 |
|---|---|---|
| $entity | PUT、POST リクエストとして送信するエンティティー。 | |
| $contentType | Content-Type ヘッダーとして送信されるボディーエンティティーの MIME タイプ。@Consumes アノテーションによって判断されます。 | |
| $accepts | */* | Accept ヘッダーとして送信される許可された MIME タイプ。@Provides アノテーションによって判断されます。 |
| $callback | 非同期呼び出しの関数 (httpCode、xmlHttpRequest、value) に設定されます。指定がない場合、呼び出しは同期となり、値が返されます。 | |
| $apiURL | 最後のスラッシュを含まない JAX-RS エンドポイントのベース URI に設定されます。 | |
| $username | ユーザー名とパスワードが設定されている場合、設定されているユーザー名とパスワードがリクエストの認証情報に使用されます。 | |
| $password | ユーザー名とパスワードが設定されている場合、設定されているユーザー名とパスワードがリクエストの認証情報に使用されます。 |
12.12.4. JavaScript API を用いた AJAX クエリーの構築 リンクのコピーリンクがクリップボードにコピーされました!
RESTEasy JavaScript API を手作業で使用してリクエストを構築することができます。このトピックではこの動作の例について取り上げます。
例12.16 REST オブジェクト
- apiURL
- デフォルトで JAX-RS ルート URL に設定されます。リクエストを構築する時にすべての JavaScript クライアント API 関数によって使用されます。
- log
- RESTEasy クライアント API のログを受信するため function(string) に設定されます。クライアント API をデバッグし、見える場所にログを置きたい場合に便利です。
例12.17 REST.Request クラス
12.12.5. 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) | リクエストヘッダーを追加します。 |
12.13. RESTEasy 非同期ジョブサービス リンクのコピーリンクがクリップボードにコピーされました!
12.13.1. RESTEasy 非同期ジョブサービス リンクのコピーリンクがクリップボードにコピーされました!
12.13.2. 非同期ジョブサービスの有効化 リンクのコピーリンクがクリップボードにコピーされました!
手順12.7 web.xml ファイルの変更
web.xmlファイルで非同期ジョブサービスを有効にします。<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.enabled</param-name> <param-value>true</param-value> </context-param>Copy to Clipboard Copied! Toggle word wrap Toggle overflow
非同期ジョブサービスは有効化されました。設定オプションについては、「非同期ジョブサービスの設定パラメーター」 を参照してください。
12.13.3. RESTEasy の非同期ジョブの設定 リンクのコピーリンクがクリップボードにコピーされました!
このトピックでは、RESTEasy における非同期ジョブのクエリーパラメーターの例を取り上げます。
警告
web.xml ファイルの XML 宣言で設定する必要があります。
重要
例12.18 非同期パラメーター
asynch クエリーパラメーターを使用して、バックグラウンドで呼び出しが実行されます。202 Accepted 応答と、バックグラウンドメソッドの応答がある場所を示す URL が含まれる Location ヘッダーが返されます。
POST http://example.com/myservice?asynch=true
POST http://example.com/myservice?asynch=true
HTTP/1.1 202 Accepted Location: http://example.com/asynch/jobs/3332334
HTTP/1.1 202 Accepted
Location: http://example.com/asynch/jobs/3332334
/asynch/jobs/{job-id}?wait={millisconds}|nowait=true
/asynch/jobs/{job-id}?wait={millisconds}|nowait=true
- ジョブが完了すると、GET は応答として呼び出された JAX-RS リソースメソッドを返します。ジョブが完了しないと、GET は 202 Accepted 応答コードを返します。GET を呼び出してもジョブは削除されないため、複数回呼び出すことができます。
- POST はジョブの応答を読み取り、完了したジョブを削除します。
- DLETE は、ジョブのキューを手作業で削除するために呼び出されます。
注記
ジョブのキューが満杯の場合は、メモリーから最初のジョブをエビクトします。DELETE を呼び出す必要はありません。
例12.19 Wait / Nowait
wait やnowait クエリーパラメーターを使うことで最大待機時間を定義できます。wait パラメーターが指定されていない場合、デフォルトのnowait=true が使用され、ジョブが完了していない場合でも待機しません。wait パラメーターはミリ秒単位で定義されます。
POST http://example.com/asynch/jobs/122?wait=3000
POST http://example.com/asynch/jobs/122?wait=3000
例12.20 Oneway パラメーター
oneway クエリーパラメーターを使用して fire および forget ジョブに対応します。
POST http://example.com/myservice?oneway=true
POST http://example.com/myservice?oneway=true
12.13.4. 非同期ジョブサービスの設定パラメーター リンクのコピーリンクがクリップボードにコピーされました!
下表は非同期ジョブサービスの設定可能なコンテキストパラメーターと詳細を表しています。これらのパラメーターは web.xml ファイルに設定できます。
| パラメーター | 説明 |
|---|---|
| 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 になります。 |
例12.21 非同期ジョブ設定の例
12.14. RESTEasy JAXB リンクのコピーリンクがクリップボードにコピーされました!
12.14.1. JAXB デコレーターの作成 リンクのコピーリンクがクリップボードにコピーされました!
RESTEasy の JAXB プロバイダーはマーシャラーおよびアンマーシャラーインスタンスを修飾するプラグ可能な方法を提供します。作成されたアノテーションによってマーシャラーまたはアンマーシャラーインスタンスが発生します。本トピックでは RESTEasy を用いて JAXB デコレーターを作成する手順を取り上げます。
手順12.8 RESTEasy による JAXB デコレーターの作成
プロセッサークラスの作成
- DecoratorProcessor<Target, Annotation> を実装するクラスを作成します。ターゲットは JAXB マーシャラーまたはアンマーシャラーのクラスになります。アノテーションは手順 2 で作成されます。
- @DecorateTypes アノテーションをクラスに付け、デコレーターが修飾する必要がある MIME タイプ を宣言します。
decorate関数内でプロパティーまたは値を設定します。
例12.22 プロセッサークラスの例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow アノテーションの作成
- @Decorator アノテーションが付けられたカスタムインターフェースを作成します。
- @Decorator アノテーションのプロセッサーとターゲットを宣言します。プロセッサーは手順 1 で作成されています。ターゲットは JAXB マーシャラーまたはアンマーシャラーのクラスになります。
例12.23 アノテーションの例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 手順 2 で作成されたアノテーションを関数に追加し、マーシャルされたときに入力または出力が修飾されるようにします。
JAXB デコレーターが作成され、JAX-RS Web サービス内で適用されます。
12.15. RESTEasy Atom サポート リンクのコピーリンクがクリップボードにコピーされました!
12.15.1. Atom API とプロバイダー リンクのコピーリンクがクリップボードにコピーされました!
org.jboss.resteasy.plugins.providers.atom パッケージにあります。RESTEasy は JAXB を使用してAPI をマーシャルおよびアンマーシャルします。 プロバイダーは JAXB ベースで、XML を使用した atom オブジェクトの送信のみに限定されません。RESTEasy が持つすべての JAXB プロバイダーは、JSON などの Atom API とプロバイダーによる再使用が可能です。API の詳細は javadocs を参照してください。
第13章 JAX-WS Web サービス リンクのコピーリンクがクリップボードにコピーされました!
13.1. JAX-WS Web サービス リンクのコピーリンクがクリップボードにコピーされました!
WS-Notification、WS-Addressing、WS-Policy、WS-Security、WS-Trust などの Web サービス指向プロトコルは JAX-WS によってサポートが容易になります。これらのプロトコルはメッセージアーキテクチャーやメッセージ形式を定義する シンプルオブジェクトアクセスプロトコル (SOAP) と呼ばれる特殊な XML 言語を使用して通信します。
WebService インターフェースと WebMethod インターフェースを実装するクラスによって構成されます。
webservices サブシステムより提供されます。
JBoss EAP 6 のクイックスタートには完全に機能する JAX-WS Web サービスアプリケーションが複数含まれています。これらの例には以下が含まれています。
- wsat-simple
- wsba-coordinator-completion-simple
- wsba-participant-completion-simple
13.2. webservices サブシステムの設定 リンクのコピーリンクがクリップボードにコピーされました!
webservices サブシステムには、数多くの設定オプションを使用することができます。管理 CLI スクリプト (EAP_HOME/bin/jboss-cli.sh または EAP_HOME/bin/jboss-cli.bat) 内の各要素を変更するためのコマンドが提供されています。スタンドアロンサーバーの場合は、/profile=default の部分を削除するか、管理対象ドメイン上で別のプロファイルのサブシステムを編集するよう変更します。
エンドポイントで公開している WSDL コントラクトの <soap:address> 要素を書き換えできます。この機能を使用して、各エンドポイントのクライアントに対してアドバタイズされたサーバーアドレスを制御できます。以下のオプション要素はそれぞれ、必要に応じて修正できます。これらの要素を 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,value=10.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)
|
エンドポイントの実装が参照可能なエンドポイント設定を定義できます。その用途の 1 つとして、@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)
/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 の読み取りには以下のコマンドを使用します。
例13.1 endpoint config の読み取り
/profile=default/subsystem=webservices/endpoint-config=Recording-Endpoint-Config:read-resource
/profile=default/subsystem=webservices/endpoint-config=Recording-Endpoint-Config:read-resource
例13.2 endpoint config の追加
/profile=default/subsystem=webservices/endpoint-config=My-Endpoint-Config:add
/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 属性を追加することも可能です。
例13.3 ハンドラーチェーンの読み取り
/profile=default/subsystem=webservices/endpoint-config=Recording-Endpoint-Config/pre-handler-chain=recording-handlers:read-resource
/profile=default/subsystem=webservices/endpoint-config=Recording-Endpoint-Config/pre-handler-chain=recording-handlers:read-resource
例13.4 ハンドラーチェーンの追加
/profile=default/subsystem=webservices/endpoint-config=My-Endpoint-Config/post-handler-chain=my-handlers:add(protocol-bindings="##SOAP11_HTTP")
/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 モジュール用のクラスローダーのいずれかがハンドラークラスをロード可能である必要があります。
例13.5 ハンドラーの読み取り
/profile=default/subsystem=webservices/endpoint-config=Recording-Endpoint-Config/pre-handler-chain=recording-handlers/handler=RecordingHandler:read-resource
/profile=default/subsystem=webservices/endpoint-config=Recording-Endpoint-Config/pre-handler-chain=recording-handlers/handler=RecordingHandler:read-resource
例13.6 ハンドラーの追加
/profile=default/subsystem=webservices/endpoint-config=My-Endpoint-Config/post-handler-chain=my-handlers/handler=foo-handler:add(class="org.jboss.ws.common.invocation.RecordingServerHandler")
/profile=default/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 サービスのランタイム情報は、エンドポイント自体をクエリーして表示できます。* の文字を使用すると、すべてのエンドポイントを一度にクエリーできます。以下に、管理対象ドメインのサーバーとスタンドアロンサーバーに対するコマンドを示します。
例13.7 管理対象ドメイン内のサーバーでの全エンドポイントに関するランタイム情報の表示
master でホストされた server-one という名前のサーバーですべてのエンドポイントに関する情報を表示します。
/host=master/server=server-one/deployment="*"/subsystem=webservices/endpoint="*":read-resource
/host=master/server=server-one/deployment="*"/subsystem=webservices/endpoint="*":read-resource
例13.8 スタンドアロンサーバーでの全エンドポイントに関するランタイム情報の表示
master という名前の物理ホストの server-one という名前のスタンドアロンサーバーですべてのエンドポイントに関する情報を表示します。
/host=master/server=server-one/deployment="*"/subsystem=webservices/endpoint="*":read-resource
/host=master/server=server-one/deployment="*"/subsystem=webservices/endpoint="*":read-resource
例13.9 エンドポイント情報の例
13.3. JAX-WS Web サービスエンドポイント リンクのコピーリンクがクリップボードにコピーされました!
13.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 を参照してください。
例13.10 POJO エンドポイントの例
例13.11 Web サービスエンドポイントの例
例13.12 EJB 内のエンドポイントの公開
JAX-WS サービスは通常、Java サービスエンドポイントインターフェース (SEI) を実装します。これは、WSDL ポートタイプから直接もしくはアノテーションを使用してマッピングすることが可能です。 この SEI は、Java オブジェクトとそれらの XML 表現の間の詳細情報を隠すハイレベルの抽象化を提供します。ただし、サービスが XML メッセージレベルで稼働する機能を必要とする場合があります。エンドポイント Provider インターフェースはこの機能を Web サービスに提供し、その Web サービスが機能を実装します。
Web サービスをデプロイした後、WSDL を使用して、アプリケーションの基盤となるコンポーネントスタブを作成することが可能です。これでアプリケーションはエンドポイントにアクセスして作業を行うことができます。
JBoss EAP 6 のクイックスタートには完全に機能する JAX-WS Web サービスアプリケーションが複数含まれています。これらの例には以下が含まれています。
- wsat-simple
- wsba-coordinator-completion-simple
- wsba-participant-completion-simple
13.3.2. JAX-WS Web サービスエンドポイントの書き込みとデプロイ リンクのコピーリンクがクリップボードにコピーされました!
本トピックでは、シンプルな JAX-WS サービスエンドポイントの開発について説明します。JAX-WS サービスエンドポイントは、JAX-WS クライアントからの要求に応答し、WSDL 定義をパブリッシュするサーバー側のコンポーネントです。JAX-WS サービスエンドポイントに関する詳細は、「JAX-WS 共通 API の参考資料」および JBoss EAP 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 を参照してください。
例13.13 サービス実装の例
例13.14 XML ペイロードの例
ProfileMgmtBean Bean によって使用される DiscountRequest クラスの例は以下のとおりです。アノテーションは詳細のために含まれています。通常、JAXB のデフォルト設定は妥当であるため、指定する必要はありません。
実装クラスは JAR デプロイメントにラッピングされます。実装クラスおよびサービスエンドポイントインターフェースに対するアノテーションからデプロイメントに必要な任意のメタデータが取得されます。管理 CLI または管理インターフェースを使用して JAR をデプロイすると、HTTP エンドポイントが自動的に作成されます。
例13.15 Web サービスデプロイメントの JAR 構造の例
13.4. JAX-WS Web サービスクライアント リンクのコピーリンクがクリップボードにコピーされました!
13.4.1. JAX-WS Web サービスの使用とアクセス リンクのコピーリンクがクリップボードにコピーされました!
- クライアントアーティファクトの作成
- サービススタブの構築
- エンドポイントへのアクセス
クライアントアーティファクトを作成する前に、WSDL コントラクトを作成しておく必要があります。以下の WSDL コントラクトが本トピックの例で使用されます。
例13.16 WSDL コントラクトの例
注記
wsconsume.sh または wsconsume.bat ツールを使用して抽象コントラクト (WSDL) を消費し、アノテーションが付いた Java クラスとそれを定義するオプションのソースを作成します。コマンドは、EAP 6 インストールの EAP_HOME/bin/ ディレクトリーにあります。
例13.17 wsconsume.sh コマンドの構文
ProfileMgmtService.wsdl ファイルからソース .java ファイルを生成して出力に一覧表示します。ソースには、パッケージのディレクトリー構造が使用されます。これは、-p スイッチで指定します。
.java ソースファイルとコンパイル済み .class ファイルの両方は、コマンドを実行するディレクトリー内の output/ ディレクトリーに生成されます。
| ファイル | 説明 |
|---|---|
ProfileMgmt.java
|
サービスエンドポイントインターフェース
|
Customer.java
|
カスタムデータ型
|
Discount*.java
|
カスタムデータ型
|
ObjectFactory.java
|
JAXB XML レジストリー
|
package-info.java
|
JAXB パッケージアノテーション
|
ProfileMgmtService.java
|
サービスファクトリー
|
wsconsume.sh コマンドは、すべてのカスタムデータタイプ (JAXB アノテーション付きクラス)、サービスエンドポイントインターフェース、およびサービスファクトリークラスを生成します。これらのアーティファクトは、Web サービスクライアント実装の構築に使用されます。
Web サービスクライアントは、サービススタブを使用してリモート Web サービス呼び出しの詳細情報を抽象化します。クライアントアプリケーション側には、WS 呼び出しはその他のビジネスコンポーネントと同じように見えます。この場合、サービスエンドポイントインターフェースはビジネスインターフェースとして機能し、サービススタブとして構築する際にサービスファクトリクラスは使用されません。
例13.18 サービススタブの構築とエンドポイントへのアクセス
wsconsume.sh コマンドで作成されたサービスエンドポイントインターフェースを使用してサービススタブを構築します。最終的にこのスタブはその他のビジネスインターフェースと同じように使用することができます。
13.4.2. JAX-WS クライアントアプリケーションの開発 リンクのコピーリンクがクリップボードにコピーされました!
サービス
- 概要
Serviceは WSDL サービスを表す抽象化です。WSDL サービスは関連ポートの集合で、それぞれには特定のプロトコルおよび特定のエンドポイントアドレスにバインドされたポート型が含まれます。通常、サービスは既存の WSDL コントラクトから残りのコンポーネントスタブが生成されるときに生成されます。WSDL コントラクトはデプロイされたエンドポイントの WSDL URL を介して利用できます。もしくはEAP_HOME/bin/ディレクトリーでwsprovide.shコマンドを使用してエンドポイントソースから作成することもできます。このようなタイプの使用法は静的ユースケースと呼ばれます。この場合、コンポーネントスタブの 1 つとして作成されたServiceクラスのインスタンスを作成します。Service.createメソッドを使用して、手動でサービスを作成することも可能です。このような使用法は 動的ユースケースと呼ばれます。- 使用法
- 静的ユースケース
- JAX-WS クライアントの静的ユースケースは WSDL コントラクトがすでに存在することを前提としています。WDSL コントラクトは、外部ツールで生成するか、AX-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アノテーションから暗黙的に設定されます。例13.19 生成されたサービスクラスの例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 動的ユースケース
- 動的なケースでは、スタブは自動的には生成されず、代わりに Web サービスクライアントが
Service.createメソッドを使用してServiceインスタンスを作成します。以下のコードフラグメントは、このプロセスの例を示しています。例13.20 手動によるサービスの作成
URL wsdlLocation = new URL("http://example.org/my.wsdl"); QName serviceName = new QName("http://example.org/sample", "MyService"); Service service = Service.create(wsdlLocation, serviceName);URL wsdlLocation = new URL("http://example.org/my.wsdl"); QName serviceName = new QName("http://example.org/sample", "MyService"); Service service = Service.create(wsdlLocation, serviceName);Copy to Clipboard Copied! Toggle word wrap Toggle overflow
- ハンドラーリゾルバー
- JAX-WS は、ハンドラー として知られるメッセージ処理モジュール向けの柔軟性の高いプラグインフレームワークを提供します。このようなハンドラーにより、JAX-WS ランタイムシステムの機能が拡張されます。
Serviceインスタンスは、サービス、ポート、またはプロトコルバインディングごとにハンドラーのセットを設定できるgetHandlerResolverメソッドとsetHandlerResolverメソッドのペアを介してHandlerResolverへのアクセスを提供します。ServiceインスタンスがプロキシまたはDispatchインスタンスを作成する際には、現在サービスに登録されているハンドラーリゾルバーによって必要なハンドラーチェーンが作成されます。Serviceインスタンス用に設定されたハンドラーリゾルバーがそれ以降に変更されても、以前に作成されたプロキシやDispatchインスタンスには影響を及ぼしません。 - エグゼキューター
Serviceインスタンスはjava.util.concurrent.Executorを使用して設定できます。Executorはアプリケーションが要求する任意の非同期コールバックを呼び出します。ServiceのsetExecutorメソッドとgetExecutorのメソッドはサービス用に設定されたExecutorを変更および取得できます。
動的プロキシ とは、Service で提供される getPort メソッドの 1 つを使用するクライアントプロキシのインスタンスです。portName は、サービスが使用する WSDL ポートの名前を指定します。serviceEndpointInterface は、作成された動的プロキシインスタンスのサポートするサービスエンドポイントインターフェースを指定します。
例13.21 getPort メソッド
public <T> T getPort(QName portName, Class<T> serviceEndpointInterface) public <T> T getPort(Class<T> serviceEndpointInterface)
public <T> T getPort(QName portName, Class<T> serviceEndpointInterface)
public <T> T getPort(Class<T> serviceEndpointInterface)
wsconsume.sh コマンドを使用して生成されます。これにより WSDL が解析されて、Java クラスが作成されます。
例13.22 サービスポートの戻り値
@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 の場所情報をオーバーライドします。例13.23
@WebServiceRefの例Copy to Clipboard Copied! Toggle word wrap Toggle overflow
XML Web Services は、Java EE コンテナ内にデプロイされたエンドポイントと任意のクライアントとの間の通信に XML メッセージを使用します。XML メッセージは Simple Object Access Protocol (SOAP) と呼ばれる XML 言語を使用します。JAX-WS API は、エンドポイントとクライアントがそれぞれ SOAP メッセージを送受信し、SOAP メッセージから Java (および Java から SOAP メッセージ) へ変換できるようにするメカニズムを提供します。これは marshalling および unmarshalling と呼ばれます。
Dispatch クラスはこの機能を提供します。Dispatch は、以下の定数の 1 つで特定される 2 つの使用モードの 1 つで動作します。
javax.xml.ws.Service.Mode.MESSAGE- このモードは、クライアントアプリケーションがプロトコル固有のメッセージ構造を使用して直接連動するように指示します。SOAP プロトコルバインディングと併用すると、クライアントアプリケーションは SOAP メッセージと直接連動します。javax.xml.ws.Service.Mode.PAYLOAD- このモードを使用すると、クライアントはペイロード自体と連動します。たとえば、 SOAP プロトコルバインディングと併用した場合、クライアントアプリケーションは SOAP メッセージ全体ではなく、SOAP ボディのコンテンツと連動します。
Dispatch は、メッセージまたはペイロードを XML として構築する必要がある低レベルの API で、各プロトコルの標準やメッセージまたはペイロード構造の詳細知識に準拠します。Dispatch は、あらゆるタイプのメッセージまたはメッセージペイロードの入出力をサポートする、汎用クラスです。
例13.24 Dispatch の使用法
BindingProvider インターフェースはクライアントが使用可能なプロトコルバインディングを提供するコンポーネントを表します。これはプロキシによって実装され、Dispatch インターフェースによって拡張されます。
BindingProvider インスタンスは非同期オペレーション機能を提供することが可能です。非同期オペレーション呼び出しは、呼び出し時に BindingProvider インスタンスから切り離されます。オペレーション完了時には、応答コンテキストは更新されず、その代わりに Response インターフェースを使用して別の応答コンテキストを利用できるようになります。
例13.25 非同期呼び出しの例
@Oneway 呼び出し
@Oneway アノテーションは、所定の Web メソッドが入力メッセージを受け取っても出力メッセージは返さないことを表します。通常、@Oneway メソッドは、ビジネスメソッドが実行される前に、制御のスレッドを呼び出し元アプリケーションに返します。
例13.26 @Oneway 呼び出しの例
HTTP 接続のタイムアウト動作およびメッセージの受信を待つクライアントのタイムアウトは 2 つの異なるプロパティーによって制御されます。HTTP 接続のタイムアウト動作を制御するプロパティーは javax.xml.ws.client.connectionTimeout で、javax.xml.ws.client.receiveTimeout はメッセージの受信を待つクライアントのタイムアウトを制御します。各プロパティーはミリ秒で指定されます。正しい構文は次のとおりです。
例13.27 JAX-WS タイムアウト設定
13.5. JAX-WS 開発に関する参考資料 リンクのコピーリンクがクリップボードにコピーされました!
13.5.1. Web Services Addressing (WS-Addressing) の有効化 リンクのコピーリンクがクリップボードにコピーされました!
要件
- お使いのアプリケーションに既存の JAX-WS サービスとクライアント設定がなければなりません。
手順13.1 クライアントコードのアノテーション付けおよび更新
サービスエンドポイントのアノテーション付け
アプリケーションのエンドポイントコードに@Addressingアノテーションを追加します。例13.28
@Addressingアノテーション以下は、@Addressingアノテーションを通常の JAX-WS エンドポイントに追加する例になります。Copy to Clipboard Copied! Toggle word wrap Toggle overflow クライアントコードの更新
WS-Addressing を設定するよう、アプリケーションのクライアントコードを更新します。例13.29 WS-Addressing のクライアント設定
以下は、WS-Addressing を設定するために通常の JAX-WS クライアントが更新される例になります。Copy to Clipboard Copied! Toggle word wrap Toggle overflow
クライアントとエンドポイントは WS-Addressing を使用して通信するようになります。
13.5.2. JAX-WS 共通 API の参考資料 リンクのコピーリンクがクリップボードにコピーされました!
ハンドラーフレームワークは JAX-WS プロトコルバインディングにより、サーバーコンポーネントであるクライアントおよびエンドポイントのランタイムに実装されます。プロキシおよび Dispatch のインスタンスは、バインディングプロバイダー と総称されており、それぞれがプロトコルバインディングを使用して抽象機能を特定のプロトコルにバインドします。
メッセージハンドラーのタイプ
- 論理ハンドラー
- 論理ハンドラーはメッセージコンテキストプロパティーおよびメッセージペイロードでのみ動作します。論理ハンドラーはプロトコルに依存しないため、メッセージのプロトコル固有の部分は影響を受けません。論理ハンドラーはインターフェース
javax.xml.ws.handler.LogicalHandlerを実装します。 - プロトコルハンドラー
- プロトコルハンドラーはメッセージコンテキストおよびプロトコル固有のメッセージでのみ動作します。プロトコルハンドラーは特定のプロトコルに固有で、プロトコル固有のメッセージアスペクトにアクセスし、変更することが可能です。 プロトコルハンドラーは
javax.xml.ws.handler.Handler except javax.xml.ws.handler.LogicalHandlerから派生する任意のインターフェースを実装します。 - サービスエンドポイントハンドラー
- サービスエンドポイントでは、ハンドラーは
@HandlerChainアノテーションを使用して定義されます。ハンドラーチェーンファイルの場所は、externalForm内の絶対java.net.URL、あるいはソースファイルまたはクラスファイルからの相対パスで指定できます。例13.30 サービスエンドポイントハンドラーの例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - サービスクライアントハンドラー
- JAX-WS クライアントでは、ハンドラーは サービスエンドポイント同様に
@HandlerChainアノテーションを使用するか、動的に JAX-WS API を使用して定義します。例13.31 API を使用したサービスクライアントハンドラーの定義
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 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 がデプロイメントの一部となっていない場合は、起動時に生成されます。
例13.32 フォールトハンドリングの例
public void throwApplicationException() throws UserException
{
throw new UserException("validation", 123, "Some validation error");
}
public void throwApplicationException() throws UserException
{
throw new 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 パッケージに含まれています。
第14章 アプリケーション内のアイデンティティー リンクのコピーリンクがクリップボードにコピーされました!
14.1. 基本概念 リンクのコピーリンクがクリップボードにコピーされました!
14.1.1. 暗号化 リンクのコピーリンクがクリップボードにコピーされました!
14.1.2. セキュリティードメイン リンクのコピーリンクがクリップボードにコピーされました!
14.1.3. SSL 暗号化 リンクのコピーリンクがクリップボードにコピーされました!
14.1.4. 宣言的セキュリティー リンクのコピーリンクがクリップボードにコピーされました!
14.2. アプリケーションのロールベースセキュリティー リンクのコピーリンクがクリップボードにコピーされました!
14.2.1. アプリケーションセキュリティー リンクのコピーリンクがクリップボードにコピーされました!
14.2.2. 認証 リンクのコピーリンクがクリップボードにコピーされました!
14.2.3. 承認 リンクのコピーリンクがクリップボードにコピーされました!
14.2.4. セキュリティー監査 リンクのコピーリンクがクリップボードにコピーされました!
14.2.5. セキュリティーマッピング リンクのコピーリンクがクリップボードにコピーされました!
14.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 の拡張です。
詳細や動作しているセキュリティーアーキテクチャーの実例については 「Java Authentication and Authorization Service (JAAS)」 を参照してください。
14.2.7. Java 認証承認サービス (JAAS) リンクのコピーリンクがクリップボードにコピーされました!
14.2.8. Java Authentication and Authorization Service (JAAS) リンクのコピーリンクがクリップボードにコピーされました!
サーバーグループ (管理対象ドメイン内) とサーバー (スタンドアローンサーバー内) にはセキュリティードメインの設定が含まれます。セキュリティードメインには、認証、承認、マッピング、監査のモジュールの組み合わせと設定詳細に関する情報が含まれています。アプリケーションは必要なセキュリティードメインを名前で jboss-web.xml に指定します。
アプリケーション固有の設定は次の 4 つのファイルの 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 EAP 6 では、コンテナ側のコンポーネントは 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 セキュリティードメインを使用します。以下の図は後で説明する手順を表しています。
図14.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 を呼び出し、プリンシパルの認証を行います。これにより、確実にユーザーロールがプリンシパルオブジェクトへ関連付けられているようにします。
14.2.9. アプリケーションでのセキュリティードメインの使用 リンクのコピーリンクがクリップボードにコピーされました!
アプリケーションでセキュリティードメインを使用するには、最初にサーバーの設定ファイルまたはアプリケーションの記述子ファイルのいずれかにドメインを設定する必要があります。その後、使用する EJB に必要なアノテーションを追加する必要があります。ここでは、アプリケーションでセキュリティードメインを使用するために必要な手順について取り上げます。
手順14.1 セキュリティードメインを使用するようアプリケーションを設定
セキュリティードメインの定義
セキュリティードメインは、サーバーの設定ファイルまたはアプリケーションの記述子ファイルのいずれかに定義できます。サーバーの設定ファイルへセキュリティードメインを設定
セキュリティードメインは、サーバーの設定ファイルのsecurityサブシステムに設定されます。JBoss EAP 6 インスタンスが管理対象ドメインで実行されている場合、domain/configuration/domain.xmlファイルになります。JBoss EAP 6 インスタンスがスタンドアロンサーバーとして実行されている場合はstandalone/configuration/standalone.xmlファイルになります。other、jboss-web-policy、およびjboss-ejb-policyセキュリティードメインはデフォルトとして JBoss EAP 6 に提供されます。次の XML の例は、サーバーの設定ファイルのsecurityサブシステムよりコピーされました。Copy to Clipboard Copied! Toggle word wrap Toggle overflow 管理コンソールまたは CLI を使用して、追加のセキュリティードメインを必要に応じて設定できます。アプリケーションの記述子ファイルにセキュリティードメインを設定
セキュリティードメインはアプリケーションのWEB-INF/web.xmlファイルにある<jboss-web>要素の<security-domain>子要素に指定されます。次の例はmy-domainという名前のセキュリティードメインを設定します。<jboss-web> <security-domain>my-domain</security-domain> </jboss-web><jboss-web> <security-domain>my-domain</security-domain> </jboss-web>Copy to Clipboard Copied! Toggle word wrap Toggle overflow これがWEB-INF/jboss-web.xml記述子に指定できる多くの設定の 1 つになります。
EJB へ必要なアノテーションを追加
@SecurityDomainおよび@RolesAllowedアノテーションを使用してセキュリティーを EJB に設定します。次の EJB コードの例は、guestロールのユーザーによるotherセキュリティードメインへのアクセスを制限します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow その他のコード例は、Red Hat カスタマーポータルより入手できる JBoss EAP 6 Quickstarts バンドルのejb-securityクイックスタートを参照してください。
14.2.10. サーブレットでのロールベースセキュリティーの使用 リンクのコピーリンクがクリップボードにコピーされました!
jboss-web.xml に指定されたセキュリティードメインによって処理されます。
サーブレットで ロールベースセキュリティーを使用する前に、アクセスの認証と承認に使用されるセキュリティードメインを JBoss EAP 6 のコンテナに設定する必要があります。
手順14.2 ロールベースセキュリティーのサーブレットへの追加
サーブレットと URL パターンの間にマッピングを追加します。
web.xmlの<servlet-mapping>要素を使用して各サーブレットを URL パターンへマッピングします。次の例はDisplayOpResultと呼ばれるサーブレットを URL パターン/DisplayOpResultにマッピングします。Copy to Clipboard Copied! Toggle word wrap Toggle overflow URL パターンにセキュリティー制約を追加します。
URL パターンをセキュリティー制約へマッピングするには、<security-constraint>を使用します。次の例は、URL パターン/DisplayOpResultのアクセスを、ロールeap_adminを持つプリンシパルのみに許可します。セキュリティードメインにロールが存在していなければなりません。Copy to Clipboard Copied! Toggle word wrap Toggle overflow 認証メソッドを指定する必要があります。BASIC、FORM、DIGEST、CLIENT-CERT、SPNEGOのいずれかを指定できます。この例ではBASIC認証を使用します。WAR の
jboss-web.xmlにセキュリティードメインを指定します。セキュリティードメインにサーブレットを接続するため、WAR のjboss-web.xmlにセキュリティードメインを追加します。セキュリティードメインにはセキュリティー制約に対してプリンシパルを認証および承認する方法が設定されています。次の例はacme_domainというセキュリティードメインを使用します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow
例14.1 ロールベースセキュリティーが設定された web.xml の例
14.2.11. アプリケーションにおけるサードパーティー認証システムの使用 リンクのコピーリンクがクリップボードにコピーされました!
注記
context.xml デプロイメント記述子には設定されないようになりました。バルブは直接 jboss-web.xml 記述子に設定されます。context.xml は無視されるようになりました。
例14.2 基本的な認証バルブ
例14.3 ヘッダー属性セットを持つカスタムバルブ
独自のオーセンティケーターの作成については本書の範囲外となりますが、次の Java コードが例として提供されています。
例14.4 GenericHeaderAuthenticator.java
14.3. セキュリティーレルム リンクのコピーリンクがクリップボードにコピーされました!
14.3.1. セキュリティーレルム リンクのコピーリンクがクリップボードにコピーされました!
ManagementRealmは、管理 CLI や Web ベースの管理コンソールに機能を提供する管理 API の認証情報を保存します。これは、JBoss EAP 6 を管理するための認証システムを提供します。管理 API に使用する同じビジネスルールでアプリケーションを認証する必要がある場合には、ManagementRealmを使用することもできます。ApplicationRealmは Web アプリケーションと EJB のユーザー、パスワード、およびロール情報を保存します。
REALM-users.propertiesはユーザー名とハッシュ化されたパスワードを保存します。REALM-users.propertiesはユーザーからロールへのマッピングを保存します。
domain/configuration/ および standalone/configuration/ ディレクトリーに保存されます。ファイルは add-user.sh や add-user.bat コマンドによって同時に書き込まれます。コマンドの実行時、新しいユーザーをどのレルムに追加するかを最初に決定します。
14.3.2. 新しいセキュリティーレルムの追加 リンクのコピーリンクがクリップボードにコピーされました!
Management CLI を実行します。
jboss-cli.shまたはjboss-cli.batコマンドを開始し、サーバーに接続します。新しいセキュリティーレルムを作成します。
次のコマンドを実行し、ドメインコントローラーまたはスタンドアロンサーバー上でMyDomainRealmという名前の新しいセキュリティーレルムを作成します。/host=master/core-service=management/security-realm=MyDomainRealm:add()
/host=master/core-service=management/security-realm=MyDomainRealm:add()Copy to Clipboard Copied! Toggle word wrap Toggle overflow 新しいロールの情報を保存するプロパティーファイルへの参照を作成します。
次のコマンドを実行し、新しいロールに関連するプロパティーが含まれるmyfile.propertiesという名前のファイルのポインターを作成します。注記
新たに作成されたプロパティーファイルは、含まれるadd-user.shおよびadd-user.batスクリプトによって管理されません。そのため、外部から管理する必要があります。/host=master/core-service=management/security-realm=MyDomainRealm/authentication=properties:add(path=myfile.properties)
/host=master/core-service=management/security-realm=MyDomainRealm/authentication=properties:add(path=myfile.properties)Copy to Clipboard Copied! Toggle word wrap Toggle overflow
新しいセキュリティーレルムが作成されます。新たに作成されたこのレルムにユーザーやロールを追加すると、デフォルトのセキュリティーレルムとは別のファイルに情報が保存されます。新規ファイルはご使用のアプリケーションやプロシージャーを使用して管理できます。
14.3.3. セキュリティーレルムへのユーザーの追加 リンクのコピーリンクがクリップボードにコピーされました!
add-user.shまたはadd-user.batコマンドを実行します。ターミナルを開き、EAP_HOME/bin/ディレクトリーへ移動します。Red Hat Enterprise Linux や他の UNIX 系のオペレーティングシステムを稼働している場合は、add-user.shを実行します。Microsoft Windows Server を稼働している場合はadd-user.batを実行します。管理ユーザーかアプリケーションユーザーのどちらを追加するか選択します。
この手順ではbを入力し、アプリケーションユーザーを追加します。ユーザーが追加されるレルムを選択します。
デフォルトでは、ApplicationRealmのみが選択可能です。カスタムレルムが追加されている場合はその名前を入力します。入力を促されたらユーザー名、パスワード、ロールを入力します。
入力を促されたら希望のユーザー名、パスワード、任意のロールを入力します。yesを入力して選択を確認するか、noを入力して変更をキャンセルします。変更はセキュリティーレルムの各プロパティーファイルに書き込まれます。
14.4. EJB アプリケーションセキュリティー リンクのコピーリンクがクリップボードにコピーされました!
14.4.1. セキュリティーアイデンティティー (ID) リンクのコピーリンクがクリップボードにコピーされました!
14.4.1.1. EJB のセキュリティーアイデンティティー リンクのコピーリンクがクリップボードにコピーされました!
<security-identity> タグのことです。これは、EJB がコンポーネントでメソッド呼び出しを行う際に必ず使う必要のあるアイデンティティーを指します。
<use-caller-identity> タグがあり、特定ロールの場合は <run-as> タグが使用されます。
14.4.1.2. EJB のセキュリティーアイデンティティーの設定 リンクのコピーリンクがクリップボードにコピーされました!
例14.5 呼び出し元と同じになるように EJB のセキュリティーアイデンティティーを設定する
<security-identity> 要素の宣言を指定しない場合、この挙動がデフォルトになります。
例14.6 特定ロールに EJB のセキュリティーアイデンティティーを設定する
<security-identity> タグの中に <run-as> および <role-name> タグを使用します。
<run-as> を使用すると anonymous という名前のプリンシパルが発信呼び出しへ割り当てられます。違うプリンシパルを割り当てる場合は <run-as-principle> を使用します。
注記
<run-as> 要素と <run-as-principal> 要素を使用することもできます。
以下も参照してください。
14.4.2. EJB メソッドのパーミッション リンクのコピーリンクがクリップボードにコピーされました!
14.4.2.1. EJB メソッドパーミッション リンクのコピーリンクがクリップボードにコピーされました!
<method-permisison> 要素の宣言を提供します。この宣言により、EJB のインターフェースメソッドを呼び出し可能なロールを設定します。以下の組み合わせに対してパーミッションの指定が可能です。
- 名前付き EJB のホームおよびコンポーネントインターフェースメソッド
- 名前付き EJB のホームあるいはコンポーネントインターフェースの指定メソッド
- オーバーロードした名前を持つメソッドセット内の指定メソッド
14.4.2.2. EJB メソッドパーミッションの使用 リンクのコピーリンクがクリップボードにコピーされました!
<method-permission> 要素は、<method> 要素によって定義される EJB メソッドへアクセスできる論理ロールを定義します。XML の構文を表す例は複数あります。メソッドパーミッションステートメントは複数存在することがあり、累積的な影響があります。<method-permission> 要素は <ejb-jar> 記述子の <assembly-descriptor> 要素の子要素です。
例14.7 ロールが EJB の全メソッドへのアクセスできるようにする
例14.8 EJB の特定メソッドへのみロールがアクセスできるようにし、パラメーターが渡すことができるメソッドを制限する
例14.9 認証された全ユーザーが EJB のメソッドにアクセスできるようにする
<unchecked/> 要素を使用すると、認証された全ユーザーが指定のメソッドを使用できます。
例14.10 特定の EJB メソッドを完全に除外して使用されないようにする
例14.11 複数の <method-permission> ブロックが含まれる完全な <assembly-descriptor>
14.4.3. EJB セキュリティーアノテーション リンクのコピーリンクがクリップボードにコピーされました!
14.4.3.1. EJB セキュリティーアノテーション リンクのコピーリンクがクリップボードにコピーされました!
- @DeclareRoles
- どのロールが利用可能かを宣言します。
- @RolesAllowed、@PermitAll、@DenyAll
- どのメソッドパーミッションが許可されるかを指定します。メソッドパーミッションについては「EJB メソッドパーミッション」を参照してください。
- @RunAs
- コンポーネントの伝搬されたセキュリティー ID を設定します。
14.4.3.2. EJB セキュリティーアノテーションの使用 リンクのコピーリンクがクリップボードにコピーされました!
XML 記述子かアノテーションを使用して、どのセキュリティーロールが Enterprise JavaBean (EJB) でメソッドを呼び出しできるかを制御することができます。XML 記述子の使用については 「EJB メソッドパーミッションの使用」 を参照してください。
EJB のセキュリティーパーミッションを制御するアノテーション
- @DeclareRoles
- @DeclareRoles を使用して、どのセキュリティーロールに対してパーミッションをチェックするか定義します。@DeclareRoles が存在しない場合、@RolesAllowed アノテーションよりリストが自動的に構築されます。
- @SecurityDomain
- EJB に使用するセキュリティードメインを指定します。承認のため、EJB に
@RolesAllowedアノテーションが付いている場合、EJB にセキュリティードメインがアノテーション付けされている場合のみ承認を適用します。 - @RolesAllowed、@PermitAll、@DenyAll
- @RolesAllowed を使用して、1 つまたは複数のメソッドへのアクセスが許可されるロールをリストします。すべてのロールに対して 1 つまたは複数のメソッドの使用を許可する場合は @PermitAll、すべてのロールに対してメソッドの使用を拒否する場合は @DenyAll を使用します。
- @RunAs
- @RunAs を使用してロールを指定すると、メソッドが常にそのロールとして実行されるようにします。
例14.12 セキュリティーアノテーションの例
WelcomeEveryone メソッドにアクセスできます。呼び出し時、GoodBye メソッドは tempemployee ロールを使用します。GoodbyeAdmin メソッドおよびセキュリティーアノテーションのない他のメソッドにできるのは admin ロールのみです。
14.4.4. EJB へのリモートアクセス リンクのコピーリンクがクリップボードにコピーされました!
14.4.4.1. リモートメソッドアクセス リンクのコピーリンクがクリップボードにコピーされました!
サポートされているトランスポートタイプ
- ソケット / セキュアソケット
- RMI / RMI over SSL
- HTTP / HTTPS
- サーブレット / セキュアサーブレット
- バイソケット (Bisocket) / セキュアバイソケット (Secure Bisocket)
Remoting システムはデータのマーシャリングサービスやアンマーシャリングサービスも提供します。データのマーシャリングとは、別のシステムで処理を実行できるようネットワークやプラットフォーム境界の全体で安全にデータを移動できる機能のことを言います。処理結果は元のシステムへ返送され、ローカルで処理されたように動作します。
Remoting を使用するクライアントアプリケーションを設計する場合、URL 型の形式の単純な文字列である InvokerLocator と呼ばれる特別なリソースロケーターを使用するよう設定し、アプリケーションがサーバーと通信するようにします。remoting サブシステムの一部として設定される connector 上で、サーバーはリモートリソースの要求をリッスンします。connector は設定済みの ServerInvocationHandler へ要求を渡します。各 ServerInvocationHandler は要求の対処方法を認識するメソッド invoke(InvocationRequest) を実装します。
JBoss Remoting フレームワークレイヤー
- ユーザーは外部レイヤーとやりとりします。クライアント側では外部レイヤーは呼び出し要求を送信する
Clientクラスになります。サーバー側ではユーザーによって実装され、呼び出し要求を受信する InvocationHandler になります。 - トランスポートはインボーカーレイヤーによって制御されます。
- 最下層のレイヤーにはデータ形式をワイヤー形式に変換するマーシャラーとアンマーシャラーが含まれています。
14.4.4.2. Remoting コールバック リンクのコピーリンクがクリップボードにコピーされました!
InvocationRequest をクライアントに送信します。コールバックが同期的または非同期的であるかに関わらず、サーバー側のコードは同様に動作します。クライアントのみが違いを認識する必要があります。サーバーの InvocationRequest は responseObject をクライアントに送信します。これはクライアントが要求したペイロードで、要求やイベント通知への直接応答になる場合があります。
m_listeners オブジェクトを使用してリスナーを追跡します。これにはサーバーハンドラーに追加された全リスナーのリストが含まれます。ServerInvocationHandler インターフェースにはこのリストを管理できるようにするメソッドが含まれます。
org.jboss.remoting.InvokerCallbackHandler の実装で、コールバックデータを処理します。コールバックハンドラーの実装後、プルコールバックのリスナーを追加するか、プッシュコールバックのコールバックサーバーを実装します。
プルコールバックでは、Client.addListener() メソッドを使用してクライアントが自身にサーバーのリスナーリストを追加します。その後、コールバックデータを同期的に配信するためにサーバーを周期的にプルします。ここでは Client.getCallbacks() を使用してプルが実行されます。
プッシュコールバックではクライアントアプリケーションが独自の InvocationHandler を実行する必要があります。これには、クライアント上で Remoting サービスを実行する必要があります。これは コールバックサーバーと呼ばれます。コールバックサーバーは受信する要求を非同期的に許可し、要求元 (この場合はサーバー) のために処理します。メインサーバーを用いてクライアントのコールバックサーバーを登録するには、コールバックサーバーの InvokerLocator を addListener への 2 番目の引数として渡します。
14.4.4.3. リモーティングサーバーの検出 リンクのコピーリンクがクリップボードにコピーされました!
14.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で定義されるunsecureインターフェースです。Copy to Clipboard Copied! Toggle word wrap Toggle overflow unsecureインターフェースのホストごとの定義はdomain.xmlまたはstandalone.xmlと同じディレクトリーにあるhost.xmlで定義されます。また、このインターフェースは複数の他のサブシステムによっても使用されます。変更する場合は十分注意してください。Copy to Clipboard Copied! Toggle word wrap Toggle overflow - socket-binding
remotingサブシステムによって使用されるデフォルトの socket-binding は TCP ポート 4777 へバインドします。この設定を変更する必要がある場合はソケットバインディングとソケットバインディンググループに関するドキュメントを参照してください。- EJB の リモーティングコネクター参照
- EJB サブシステムにはリモートメソッド呼び出しに対するリモーティングコネクターへの参照が含まれています。デフォルト設定は次のとおりです。
<remote connector-ref="remoting-connector" thread-pool-name="default"/>
<remote connector-ref="remoting-connector" thread-pool-name="default"/>Copy to Clipboard Copied! Toggle word wrap Toggle overflow - セキュアなトランスポート設定
- Remoting はクライアントの要求があれば StartTLS を使用して安全な接続 (HTTPS、Secure Servlet など) を使用します。安全な接続と安全でない接続の両方で同じソケットバインディング (ネットワークポート) が使用されるため、サーバー側に追加の設定をする必要はありません。クライアントはニーズに従って安全なトランスポートまたは安全でないトランスポートを要求します。EJB、ORB、JMS プロバイダーなどの Remoting を使用する JBoss EAP のコンポーネントはデフォルトで安全なインターフェースを使用します。
警告
ワーカースレッドプールは、Remoting コネクターからの作業を処理できるスレッドのグループのことです。単一の要素 <worker-thread-pool> で、複数の属性を取ります。ネットワークタイムアウトやスレッド不足が発生したり、メモリーの使用を制限する場合にこれらの属性を調節します。特定の推奨設定は状況によって異なります。詳細は Red Hat グローバルサポートサービスまでご連絡ください。
| 属性 | 説明 | 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 EAP 6 の複数のサブシステムによって使用されます。カスタムコネクターの要素や属性の設定はアプリケーションによって異なるため、詳細は Red Hat グローバルサポートサービスまでご連絡ください。
| 属性 | 説明 | CLI コマンド |
|---|---|---|
| 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 EAP 6 インストールで使用可能です。
| /profile=default/subsystem=remoting/connector=remoting-connector/:write-attribute(name=security-realm,value=ApplicationRealm)
|
| 属性 | 説明 | CLI コマンド |
|---|---|---|
| sasl |
SASL (Simple Authentication and Security Layer) 認証メカニズムのエンクロージング要素です。
| N/A
|
| プロパティー |
1 つ以上の
<property> 要素が含まれ、各要素には name 属性と任意の value 属性が含まれます。
| /profile=default/subsystem=remoting/connector=remoting-connector/property=myProp/:add(value=myPropValue)
|
3 つのタイプの送信接続を指定することができます。
- URI への送信接続。
- ローカルの送信接続 – ソケットなどのローカルリソースへ接続します。
- リモートの送信接続 – リモートリソースへ接続し、セキュリティーレルムを使用して認証を行います。
<outbound-connections> 要素で囲まれます。各接続タイプは outbound-socket-binding-ref 属性を取ります。送信接続は uri 属性を取ります。リモートの送信接続は任意の username 属性と security-realm 属性を取り、認証に使用します。
| 属性 | 説明 | 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
/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 属性が含まれます。
|
/profile=default/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-anonymous,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)
|
| プロパティー |
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)
|
例14.13 設定例
<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">
<connector name="remoting-connector" socket-binding="remoting" security-realm="ApplicationRealm"/>
</subsystem>
文書化されていない設定の側面
- JIDI および マルチキャスト自動検出
14.4.4.5. リモート EJB クライアントを用いたセキュリティーレルムの使用 リンクのコピーリンクがクリップボードにコピーされました!
- 新しいセキュリティーレルムをドメインコントローラーかスタンドアロンサーバーに追加します。
- 次のパラメーターをアプリケーションのクラスパスにある
jboss-ejb-client.propertiesファイルに追加します。この例では、ファイルの他のパラメーターは接続をdefaultとしてみなすことを前提とします。¶ remote.connection.default.username=appuser¶ remote.connection.default.password=apppassword¶
¶ remote.connection.default.username=appuser¶ remote.connection.default.password=apppassword¶Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 新しいセキュリティーレルムを使用するドメインまたはスタンドアロンサーバー上にカスタム Remoting コネクターを作成します。
- カスタム Remoting コネクターを用いてプロファイルを使用するよう設定されているサーバーグループに EJB をデプロイします。管理対象ドメインを使用していない場合はスタンドアロンサーバーに EJB をデプロイします。
14.4.4.6. 新しいセキュリティーレルムの追加 リンクのコピーリンクがクリップボードにコピーされました!
Management CLI を実行します。
jboss-cli.shまたはjboss-cli.batコマンドを開始し、サーバーに接続します。新しいセキュリティーレルムを作成します。
次のコマンドを実行し、ドメインコントローラーまたはスタンドアロンサーバー上でMyDomainRealmという名前の新しいセキュリティーレルムを作成します。/host=master/core-service=management/security-realm=MyDomainRealm:add()
/host=master/core-service=management/security-realm=MyDomainRealm:add()Copy to Clipboard Copied! Toggle word wrap Toggle overflow 新しいロールの情報を保存するプロパティーファイルへの参照を作成します。
次のコマンドを実行し、新しいロールに関連するプロパティーが含まれるmyfile.propertiesという名前のファイルのポインターを作成します。注記
新たに作成されたプロパティーファイルは、含まれるadd-user.shおよびadd-user.batスクリプトによって管理されません。そのため、外部から管理する必要があります。/host=master/core-service=management/security-realm=MyDomainRealm/authentication=properties:add(path=myfile.properties)
/host=master/core-service=management/security-realm=MyDomainRealm/authentication=properties:add(path=myfile.properties)Copy to Clipboard Copied! Toggle word wrap Toggle overflow
新しいセキュリティーレルムが作成されます。新たに作成されたこのレルムにユーザーやロールを追加すると、デフォルトのセキュリティーレルムとは別のファイルに情報が保存されます。新規ファイルはご使用のアプリケーションやプロシージャーを使用して管理できます。
14.4.4.7. セキュリティーレルムへのユーザーの追加 リンクのコピーリンクがクリップボードにコピーされました!
add-user.shまたはadd-user.batコマンドを実行します。ターミナルを開き、EAP_HOME/bin/ディレクトリーへ移動します。Red Hat Enterprise Linux や他の UNIX 系のオペレーティングシステムを稼働している場合は、add-user.shを実行します。Microsoft Windows Server を稼働している場合はadd-user.batを実行します。管理ユーザーかアプリケーションユーザーのどちらを追加するか選択します。
この手順ではbを入力し、アプリケーションユーザーを追加します。ユーザーが追加されるレルムを選択します。
デフォルトでは、ApplicationRealmのみが選択可能です。カスタムレルムが追加されている場合はその名前を入力します。入力を促されたらユーザー名、パスワード、ロールを入力します。
入力を促されたら希望のユーザー名、パスワード、任意のロールを入力します。yesを入力して選択を確認するか、noを入力して変更をキャンセルします。変更はセキュリティーレルムの各プロパティーファイルに書き込まれます。
14.4.4.8. SSL による暗号化を使用したリモート EJB アクセス リンクのコピーリンクがクリップボードにコピーされました!
14.5. JAX-RS アプリケーションセキュリティー リンクのコピーリンクがクリップボードにコピーされました!
14.5.1. RESTEasy JAX-RS Web サービスのロールベースのセキュリティーの有効化 リンクのコピーリンクがクリップボードにコピーされました!
RESTEasy は JAX-RS メソッドの @RolesAllowed、@PermitAll、@DenyAll アノテーションをサポートしますが、デフォルトではこれらのアノテーションを認識しません。次の手順に従って web.xml ファイルを設定し、ロールベースセキュリティーを有効にします。
警告
手順14.3 RESTEasy JAX-RS Web サービスのロールベースのセキュリティーの有効化
- テキストエディターでアプリケーションの
web.xmlファイルを開きます。 - 以下の <context-param> をファイルの
web-appタグ内に追加します。<context-param> <param-name>resteasy.role.based.security</param-name> <param-value>true</param-value> </context-param><context-param> <param-name>resteasy.role.based.security</param-name> <param-value>true</param-value> </context-param>Copy to Clipboard Copied! Toggle word wrap Toggle overflow - <security-role> タグを使用して RESTEasy JAX-RS WAR ファイル内で使用されるすべてのロールを宣言します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - すべてのロールに対して JAX-RS ランタイムが対応する全 URL へのアクセスを承認します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
ロールベースセキュリティーが定義されたロールのセットによりアプリケーション内で有効になります。
例14.14 ロールベースセキュリティーの設定例
14.5.2. アノテーションを使用した JAX-RS Web サービスのセキュア化 リンクのコピーリンクがクリップボードにコピーされました!
サポート対象のセキュリティーアノテーションを使用して JAX-RS Web サービスをセキュアにする手順を取り上げます。
手順14.4 サポート対象のセキュリティーアノテーションを使用した JAX-RS Web サービスのセキュア化
- ロールベースセキュリティーを有効にします。詳細は「RESTEasy JAX-RS Web サービスのロールベースのセキュリティーの有効化」を参照してください。
- JAX-RS Web サービスにセキュリティーアノテーションを追加します。RESTEasy は次のアノテーションをサポートします。
- @RolesAllowed
- メソッドにアクセスできるロールを定義します。ロールはすべて
web.xmlファイルに定義する必要があります。 - @PermitAll
web.xmlファイルに定義されているすべてのロールによるメソッドへのアクセスを許可します。- @DenyAll
- メソッドへのアクセスをすべて拒否します。
14.6. リモートパスワードプロトコルの保護 リンクのコピーリンクがクリップボードにコピーされました!
14.6.1. SRP (セキュアリモートパスワード) プロトコル リンクのコピーリンクがクリップボードにコピーされました!
この文書は SRP (セキュアリモートパスワード) プロトコルとして知られる、強固なネットワーク暗号化方式について説明しています。このメカニズムは従来の再利用可能なパスワードで起きていたセキュリティーの問題を排除しつつ、ユーザーによって提供されるパスワードを使いセキュアな接続をネゴシエーションするのに適しています。この仕組みは、認証プロセスでセキュアな鍵交換を行い、セッション時にセキュリティー層 (プライバシーや整合性保護) を有効にすることが可能です。信頼されたキーサーバーや証明書インフラストラクチャーは必要なく、また長期鍵の保存や管理にクライアントを必要としません。SRP には、既存のチャレンジレスポンス方式と比べセキュリティーやデプロイメントに両方において様々な利点があり、SRP は安全なパスワード認証が必要な場合に、互換性のある理想的な代用方式となります。
14.6.2. セキュアリモートパスワード (SRP) プロトコルの設定 リンクのコピーリンクがクリップボードにコピーされました!
SRPVerifierStore インターフェースを実装する MBean を作成します。実装に関する詳細は SRPVerifierStore 実装 で確認できます。
手順14.5 既存パスワードストアの統合
ハッシュ化されたパスワード情報ストアを作成します。
パスワードがすでに不可逆的にハッシュ化され、保存されている場合、この作業をユーザーごとに行う必要があります。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 オブジェクトの要素
- username
- 認証に使用されるユーザー名またはユーザー 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()より取得される適切なデフォルトなどが含まれます。
例14.15 SRPVerifierStore インターフェース
14.7. 機密性の高い文字列のパスワード vault リンクのコピーリンクがクリップボードにコピーされました!
14.7.1. クリアテキストファイルでの機密性が高い文字列のセキュア化 リンクのコピーリンクがクリップボードにコピーされました!
警告
java.io.IOException: com.sun.crypto.provider.SealedObjectForKeyProtector
java.io.IOException: com.sun.crypto.provider.SealedObjectForKeyProtector
14.7.2. 機密性が高い文字列を格納する Java キーストアの作成 リンクのコピーリンクがクリップボードにコピーされました!
要件
keytoolコマンドを使用できる必要があります。これは Java Runtime Environment (JRE) により提供されます。このファイルのパスを見つけます。Red Hat Enterprise Linux では、これは/usr/bin/keytoolにインストールされます。
手順14.6 Java キーストアの設定
キーストアと他の暗号化された情報を格納するディレクトリーを作成します。
キーストアと他の重要な情報を保持するディレクトリーを作成します。この残りの手順では、ディレクトリーが/home/USER/vault/であることを前提とします。keytoolで使用するパラメーターを決定します。以下のパラメーターを決定します。- alias
- エイリアスは資格情報コンテナまたはキーストアに格納された vault または他のデータの一意の ID です。この手順の最後にあるコマンド例のエイリアスは
vaultです。エイリアスは大文字と小文字を区別します。 - keyalg
- 暗号化に使用するアルゴリズム。この手順の例では
RSAを使用します。利用可能な他の選択肢については、JRE およびオペレーティングシステムのドキュメンテーションを参照してください。 - keysize
- 暗号化キーのサイズは、ブルートフォース攻撃で復号化を行う難しさに影響します。この手順の例では、
2048を使用します。適切な値についての詳細情報は、keytoolで配布されるドキュメントを参照してください。 - keystore
- 暗号化された情報と暗号化方法に関する情報を保持するデータベースのキーストア。キーストアを指定しない場合、使用するデフォルトのキーストアはホームディレクトリーの
.keystoreという名前のファイルです。これは、キーストアにデータを初めて追加したときに作成されます。この手順の例では、vault.keystoreキーストアを使用します。
keytoolコマンドには他の多くのオプションがあります。詳細については、JRE またはオペレーティングシステムのドキュメンテーションを参照してください。keystoreコマンドが尋ねる質問の回答を決定します。keystoreは、キーストアエントリーに値を入力するために次の情報を必要とします。- キーストアパスワード
- キーストアを作成する場合は、パスワードを設定する必要があります。将来キーストアを使用するために、パスワードを提供する必要があります。覚えやすい強度の高いパスワードを作成します。キーストアは、パスワードや、キーストアが存在するファイルシステムおよびオペレーティングシステムのセキュリティーと同程度にセキュアです。
- キーパスワード (任意設定)
- キーストアパスワードに加え、保持する各キーにパスワードを指定することが可能です。このようなキーを使用するには、使用するたびにパスワードを提供する必要があります。通常、このファシリティーは使用されません。
- 名前 (名) と 名字 (姓)
- この情報と一覧の他の情報は、一意にキーを識別して他のキーの階層に置くのに役立ちます。名前である必要はありませんが、キーに一意な 2 つの言葉である必要があります。この手順の例では、
Accounting Administratorを使用します。これが証明書のコモンネームになります。 - 組織単位
- 証明書を使用する人物を特定する単一の言葉です。アプリケーションユニットやビジネスユニットである場合もあります。この手順の例では
AccountingServicesを使用します。通常、1 つのグループやアプリケーションによって使用されるキーストアはすべて同じ組織単位を使用します。 - 組織
- 通常、所属する組織名を表す単一の言葉になります。一般的に、1 つの組織で使用されるすべての証明書で同じになります。この例では
MyOrganizationを使用します。 - 市または自治体
- お住まいの市名。
- 州または県
- お住まいの州や県、または同等の行政区画。
- 国
- 2 文字の国コード。
これらすべての情報によってキーストアや証明書の階層が作成され、一貫性のある一意な名前付け構造が確実に使用されるようにします。keytoolコマンドを実行し、収集した情報を提供します。例14.16
keystoreコマンドの入出力例Copy to Clipboard Copied! Toggle word wrap Toggle overflow
/home/USER/vault/ ディレクトリーに vault.keystore という名前のファイルが作成されます。JBoss EAP 6 のパスワードなど、暗号化された文字列を格納するために使用される vault という 1 つのキーがこのファイルに保存されます。
14.7.3. キーストアパスワードのマスキングとパスワード vault の初期化 リンクのコピーリンクがクリップボードにコピーされました!
要件
EAP_HOME/bin/vault.shアプリケーションはコマンドラインインターフェースからアクセスできる必要があります。
vault.shコマンドを実行します。EAP_HOME/bin/vault.shを実行します。0を入力して新しい対話セッションを開始します。暗号化されたファイルが保存されるディレクトリーを入力します。
このディレクトリーはある程度保護されている必要がありますが、JBoss EAP 6 がアクセスできなければなりません。「機密性が高い文字列を格納する Java キーストアの作成」 の手順に従うと、キーストアはホームディレクトリーにあるvault/というディレクトリーの中にあります。この例では/home/USER/vault/を使用します。注記
必ずディレクトリー名の最後にスラッシュが含まれるようにしてください。ご使用のオペレーティングシステムに応じて/または\を使用します。キーストアへのパスを入力します。
キーストアファイルへの完全パスを入力します。この例では/home/USER/vault/vault.keystoreを使用します。キーストアパスワードを暗号化します。
次の手順に従って、設定ファイルやアプリケーションで安全に使用できるようキーストアのパスワードを暗号化します。キーストアパスワードを入力します。
入力を促されたらキーストアのパスワードを入力します。salt 値を入力します。
8 文字の salt 値を入力します。salt 値は反復回数 (下記) と共にハッシュ値の作成に使用されます。反復回数を入力します。
反復回数の値を入力します。マスクされたパスワード情報を書き留めておきます。
マスクされたパスワード、salt、および反復回数は標準出力へ書き出されます。これらの情報を安全な場所に書き留めておきます。攻撃者がこれらの情報を使用してパスワードを復号化する可能性があるからです。vault のエイリアスを入力します。
入力を促されたら、vault のエイリアスを入力します。「機密性が高い文字列を格納する Java キーストアの作成」 に従って vault を作成した場合、エイリアスはvaultになります。
対話コンソールを終了します。
2を入力して対話コンソールを終了します。
設定ファイルとデプロイメントで使用するため、キーストアパスワードがマスキングされます。また、vault が完全設定され、すぐ使用できる状態になります。
14.7.4. パスワード vault を使用するよう JBoss EAP 6 を設定 リンクのコピーリンクがクリップボードにコピーされました!
設定ファイルにあるパスワードや機密性の高いその他の属性をマスキングする前に、これらを保存し復号化するパスワード vault を JBoss EAP 6 が認識するようにする必要があります。次の手順に従ってこの機能を有効にします。
手順14.7 パスワード vault の設定
コマンドの適切な値を決定します。
キーストアの作成に使用されるコマンドによって決定される以下のパラメーターの値を決定します。キーストア作成の詳細は 「機密性が高い文字列を格納する Java キーストアの作成」 および 「キーストアパスワードのマスキングとパスワード vault の初期化」 を参照してください。Expand パラメーター 説明 KEYSTORE_URL ファイルシステムのパスまたはキーストアファイル。通常vault.keystoreのようになります。KEYSTORE_PASSWORD キーストアのアクセスに使用されるパスワード。この値はマスクされる必要があります。KEYSTORE_ALIAS キーストアの名前。SALT キーストアの値を暗号化および復号化するために使用される salt。ITERATION_COUNT 暗号化アルゴリズムが実行される回数。ENC_FILE_DIR キーストアコマンドが実行されるディレクトリーへのパス。通常、パスワード vault が含まれるディレクトリーになります。host (管理対象ドメインのみ) 設定するホストの名前。管理 CLI を使用してパスワード vault を有効にします。
次のコマンドの 1 つを実行します。実行するコマンドは、管理対象ドメインまたはスタンドアロンサーバー設定のどちらを使用するかによって異なります。コマンドの値は、手順の最初で使用した値に置き換えます。注記
Microsoft Windows Server を使用する場合は、ファイル名またはディレクトリーパスにある/文字を、4 つの\文字に置き換えます。 これは、2 つの\文字がそれぞれエスケープされるからです。ファイル名およびディレクトリーパス以外の/文字を置き換える必要はありません。管理対象ドメイン
/host=YOUR_HOST/core-service=vault:add(vault-options=[("KEYSTORE_URL" => "PATH_TO_KEYSTORE"), ("KEYSTORE_PASSWORD" => "MASKED_PASSWORD"), ("KEYSTORE_ALIAS" => "ALIAS"), ("SALT" => "SALT"),("ITERATION_COUNT" => "ITERATION_COUNT"), ("ENC_FILE_DIR" => "ENC_FILE_DIR")])/host=YOUR_HOST/core-service=vault:add(vault-options=[("KEYSTORE_URL" => "PATH_TO_KEYSTORE"), ("KEYSTORE_PASSWORD" => "MASKED_PASSWORD"), ("KEYSTORE_ALIAS" => "ALIAS"), ("SALT" => "SALT"),("ITERATION_COUNT" => "ITERATION_COUNT"), ("ENC_FILE_DIR" => "ENC_FILE_DIR")])Copy to Clipboard Copied! Toggle word wrap Toggle overflow スタンドアロンサーバー
/core-service=vault:add(vault-options=[("KEYSTORE_URL" => "PATH_TO_KEYSTORE"), ("KEYSTORE_PASSWORD" => "MASKED_PASSWORD"), ("KEYSTORE_ALIAS" => "ALIAS"), ("SALT" => "SALT"),("ITERATION_COUNT" => "ITERATION_COUNT"), ("ENC_FILE_DIR" => "ENC_FILE_DIR")])/core-service=vault:add(vault-options=[("KEYSTORE_URL" => "PATH_TO_KEYSTORE"), ("KEYSTORE_PASSWORD" => "MASKED_PASSWORD"), ("KEYSTORE_ALIAS" => "ALIAS"), ("SALT" => "SALT"),("ITERATION_COUNT" => "ITERATION_COUNT"), ("ENC_FILE_DIR" => "ENC_FILE_DIR")])Copy to Clipboard Copied! Toggle word wrap Toggle overflow
仮の値を用いたコマンドの例は次のとおりです。/core-service=vault:add(vault-options=[("KEYSTORE_URL" => "/home/user/vault/vault.keystore"), ("KEYSTORE_PASSWORD" => "MASK-3y28rCZlcKR"), ("KEYSTORE_ALIAS" => "vault"), ("SALT" => "12438567"),("ITERATION_COUNT" => "50"), ("ENC_FILE_DIR" => "/home/user/vault/")])/core-service=vault:add(vault-options=[("KEYSTORE_URL" => "/home/user/vault/vault.keystore"), ("KEYSTORE_PASSWORD" => "MASK-3y28rCZlcKR"), ("KEYSTORE_ALIAS" => "vault"), ("SALT" => "12438567"),("ITERATION_COUNT" => "50"), ("ENC_FILE_DIR" => "/home/user/vault/")])Copy to Clipboard Copied! Toggle word wrap Toggle overflow
パスワード vault を使用してマスキングされた文字列を復号化するよう JBoss EAP 6 が設定されます。vault に文字列を追加し、設定で使用する場合は「Java キーストアに暗号化された機密性の高い文字列の保存および読み出し」を参照してください。
14.7.5. Java キーストアに暗号化された機密性の高い文字列の保存および読み出し リンクのコピーリンクがクリップボードにコピーされました!
パスワードや、機密性の高いその他の文字列がプレーンテキストの設定ファイルに含まれるのはセキュアではありません。JBoss EAP 6 には、このような機密性の高い文字列をマスキングして暗号化されたキーストアに保存する機能や、設定ファイルでマスクされた値を使用する機能が含まれています。
要件
EAP_HOME/bin/vault.shアプリケーションはコマンドラインインターフェースからアクセスできる必要があります。
手順14.8 Java キーストアの設定
vault.shコマンドを実行します。EAP_HOME/bin/vault.shを実行します。0を入力して新しい対話セッションを開始します。暗号化されたファイルが保存されるディレクトリーを入力します。
「機密性が高い文字列を格納する Java キーストアの作成」 に従って作業を行った場合は、キーストアはホームディレクトリーのvault/というディレクトリーにあります。ほとんどの場合では、暗号化されたすべての情報をキーストアとして同じ場所に保存するのが普通です。この例では/home/USER/vault/ディレクトリーを使用します。注記
必ずディレクトリー名の最後にスラッシュが含まれるようにしてください。ご使用のオペレーティングシステムに応じて/または\を使用します。キーストアへのパスを入力します。
キーストアファイルへの完全パスを入力します。この例では/home/USER/vault/vault.keystoreを使用します。キーストアパスワード、vault 名、ソルト、反復回数を入力します。
入力を促されたら、キーストアパスワード、vault 名、ソルト、反復回数を入力します。ハンドシェイクが実行されます。パスワードを保存するオプションを選択します。
オプション0を選択して、パスワードや機密性の高い他の文字列を保存します。値を入力します。
入力を促されたら、値を 2 回入力します。値が一致しない場合は再度入力するよう要求されます。vault ブロックを入力します。
同じリソースに関連する属性のコンテナである vault ブロックを入力します。属性名の例としてはds_ExampleDSなどが挙げられます。データソースまたは他のサービス定義で、暗号化された文字列への参照の一部を形成します。属性名を入力します。
保存する属性の名前を入力します。passwordが属性名の例の 1 つになります。結果以下のようなメッセージによって、属性が保存されたことが示されます。
Attribute Value for (ds_ExampleDS, password) saved
Attribute Value for (ds_ExampleDS, password) savedCopy to Clipboard Copied! Toggle word wrap Toggle overflow 暗号化された文字列に関する情報を書き留めます。
メッセージは vault ブロック、属性名、共有キー、および設定で文字列を使用する場合のアドバイスを表示する標準出力を出力します。安全な場所にこの情報を書き留めておくようにしてください。出力例は次のとおりです。Copy to Clipboard Copied! Toggle word wrap Toggle overflow 設定で暗号化された文字列を使用します。
プレーンテキストの文字列の代わりに、前の設定手順の文字列を使用します。以下は、上記の暗号化されたパスワードを使用するデータソースになります。Copy to Clipboard Copied! Toggle word wrap Toggle overflow 式が許可されるドメインまたはスタンドアロン設定ファイルであれば、どこでも暗号化された文字列を使用することができます。注記
特定のサブシステム内で式が許可されるかを確認するには、そのサブシステムに対して次の CLI コマンドを実行します。/host=master/core-service=management/security-realm=TestRealm:read-resource-description(recursive=true)
/host=master/core-service=management/security-realm=TestRealm:read-resource-description(recursive=true)Copy to Clipboard Copied! Toggle word wrap Toggle overflow このコマンドの出力で、expressions-allowedパラメーターの値を探します。値が true であればこのサブシステムの設定内で式を使用できます。文字列をキーストアに格納した後、次の構文を使用してクリアテキストの文字列を暗号化された文字列に置き換えます。${VAULT::<replaceable>VAULT_BLOCK</replaceable>::<replaceable>ATTRIBUTE_NAME</replaceable>::<replaceable>ENCRYPTED_VALUE</replaceable>}${VAULT::<replaceable>VAULT_BLOCK</replaceable>::<replaceable>ATTRIBUTE_NAME</replaceable>::<replaceable>ENCRYPTED_VALUE</replaceable>}Copy to Clipboard Copied! Toggle word wrap Toggle overflow 実環境の値の例は次のとおりです。vault ブロックはds_ExampleDS、属性はpasswordです。<password>${VAULT::ds_ExampleDS::password::1}</password><password>${VAULT::ds_ExampleDS::password::1}</password>Copy to Clipboard Copied! Toggle word wrap Toggle overflow
14.7.6. アプリケーションでの機密性の高い文字列の保存および解決 リンクのコピーリンクがクリップボードにコピーされました!
JBoss EAP 6 の設定要素は、セキュリティー vault メカニズムを通じて Java キーストアに保存される値に対して暗号化された文字列を解決する機能をサポートしています。この機能に対するサポートを独自のアプリケーションに追加することができます。
この手順を実行する前に、vault ファイルを格納するディレクトリーが存在することを確認してください。JBoss EAP 6 を実行するユーザーが vault ファイルを読み書きできるパーミッションを持っていれば、vault ファイルの場所はどこでも構いません。この例では、vault/ ディレクトリーを /home/USER/vault/ ディレクトリーに置きます。vault 自体は vault/ ディレクトリーの中にある vault.keystore と呼ばれるファイルになります。
例14.17 vault へのパスワードの文字列の追加
EAP_HOME/bin/vault.sh コマンドを用いて文字列を vault へ追加します。次の画面出力にコマンドと応答がすべて含まれています。ユーザー入力の値は強調文字で表されています。出力の一部は書式上、削除されています。Microsoft Windows ではコマンド名は vault.bat になります。Microsoft Windows のファイルパスでは、ディレクトリーの分離記号として / ではなく \ が使用されることに注意してください。
VAULT で始まる行です。
例14.18 vault されたパスワードを使用するサーブレット
14.8. JACC (Java Authorization Contract for Containers) リンクのコピーリンクがクリップボードにコピーされました!
14.8.1. JACC (Java Authorization Contract for Containers) リンクのコピーリンクがクリップボードにコピーされました!
14.8.2. JACC (Java Authorization Contract for Containers) のセキュリティーの設定 リンクのコピーリンクがクリップボードにコピーされました!
jboss-web.xml を編集する必要があります。
セキュリティードメインに JACC サポートを追加するには、required フラグセットで JACC 承認ポリシーをセキュリティードメインの承認スタックへ追加します。以下は JACC サポートを持つセキュリティードメインの例になりますが、セキュリティードメインは 直接 XML には設定されず、管理コンソールまたは管理 CLI で設定されます。
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>
<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 で説明されています。
例14.19 EJB の JACC メソッドパーミッション例
<security> 子要素の jboss-ejb3.xml 記述子に宣言されます。セキュリティードメインの他に、EJB が実行されるプリンシパルを変更する run-as プリンシパル を指定することもできます。
例14.20 EJB におけるセキュリティードメイン宣言の例
14.9. JASPI (Java Authentication SPI for Containers) リンクのコピーリンクがクリップボードにコピーされました!
14.9.1. JASPI (Java Authentication SPI for Containers) のセキュリティー リンクのコピーリンクがクリップボードにコピーされました!
14.9.2. JASPI (Java Authentication SPI for Containers) のセキュリティーの設定 リンクのコピーリンクがクリップボードにコピーされました!
<authentication-jaspi> 要素をセキュリティードメインに追加します。設定は標準的な認証モジュールと似ていますが、ログインモジュール要素は <login-module-stack> 要素で囲まれています。設定の構成は次のとおりです。
例14.21 authentication-jaspi 要素の構成
EAP_HOME/domain/configuration/domain.xml または EAP_HOME/standalone/configuration/standalone.xml へ直接追加する必要があります。
第15章 シングルサインオン (SSO) リンクのコピーリンクがクリップボードにコピーされました!
15.1. Web アプリケーションのシングルサインオン (SSO) リンクのコピーリンクがクリップボードにコピーされました!
SSO (シングルサインオン) は 1 つのリソースへの認証を用いて他のリソースへのアクセスを暗黙的に承認できるようにします。
クラスター化されていない SSO は、アプリケーションの承認情報の共有を同じ仮想ホスト内に制限します。また、ホストの障害に対する耐性を持ちません。クラスター化された SSO データは複数の仮想ホストのアプリケーション間で共有することができ、フェイルオーバーに対する耐性を持ちます。さらに、クラスター化された SSO はロードバランサーからのリクエストを受信することができます。
リソースが保護されていない場合、ユーザーの認証は完全に無視されます。ユーザーが保護されたリソースにアクセスすると、ユーザーの認証が必要になります。
SSO の制限
- サードパーティー境界にまたがる伝搬がない
- JBoss EAP 6 のコンテナ内にデプロイされたアプリケーションの間でのみ 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 アプリケーション全体で一貫していなければなりません。すべてのセキュリティー統合が同じクレデンシャル (ユーザー名やパスワードなど) を許可しなければなりません。
15.2. Web アプリケーションのクラスター化されたシングルサインオン (SSO) リンクのコピーリンクがクリップボードにコピーされました!
jboss-web.xml に設定されます。
- Apache Tomcat の ClusteredSingleSignOn
- Apache Tomcat の IDPWebBrowserSSOValve
- PicketLink によって提供される SPNEGO ベースの SSO
15.3. 適切な SSO 実装の選択 リンクのコピーリンクがクリップボードにコピーされました!
Microsoft Active Directory など、Kerberos ベースの認証承認システムがすでに組織で使用されている場合は、同じシステムを使用して JBoss EAP 6 上で実行されているエンタープライズアプリケーションを透過的に認証することができます。
同じサーバーグループやインスタンス内で実行するアプリケーション間でセキュリティー情報を伝播する必要がある場合、クラスター化されていない SSO を使用することができます。この場合、アプリケーションの jboss-web.xml 記述子にバルブを設定することのみが必要となります。
複数の JBoss EAP 6 インスタンス全体のクラスター化された環境で実行されるアプリケーションの間でセキュリティー情報を伝播する必要がある場合、クラスター化された SSO バルブを使用することができます。このバルブはアプリケーションの jboss-web.xml に設定されます。
15.4. Web アプリケーションでのシングルサインオン (SSO) の使用 リンクのコピーリンクがクリップボードにコピーされました!
シングルサインオン (SSO) の機能は Web および Infinispan サブシステムによって提供されます。この手順に従って Web アプリケーションに SSO を設定します。
要件
- 認証と承認を処理するセキュリティードメインが設定されている必要があります。
infinispanサブシステムが存在する必要があります。管理対象ドメインの場合、このサブシステムはfull-haプロファイルにあります。スタンドアロンサーバーではstandalone-full-ha.xml設定を使用します。webcache-containerと SSO cache-container が存在する必要があります。最初の設定ファイルにはwebcache-container がすでに含まれており、一部の設定には SSO cache-container も含まれています。以下のコマンドを使用して SSO キャッシュコンテナをチェックし、有効にします。これらのコマンドは管理対象ドメインのfullプロファイルを変更することに注意してください。スタンドアロンサーバーに対して異なるプロファイルを使用したり、コマンドの/profile=full部分を削除するため、コマンドを変更することもできます。例15.1
webcache-container の確認前述のプロファイルや設定には、デフォルトとしてwebcache-container が含まれています。次のコマンドを使用して、webcache-container の存在を確認します。異なるプロファイルを使用する場合は、haをその名前に置き換えます。/profile=ha/subsystem=infinispan/cache-container=web/:read-resource(recursive=false,proxies=false,include-runtime=false,include-defaults=true)
/profile=ha/subsystem=infinispan/cache-container=web/:read-resource(recursive=false,proxies=false,include-runtime=false,include-defaults=true)Copy to Clipboard Copied! Toggle word wrap Toggle overflow サブシステムが存在する場合、結果はsuccessになります。存在しない場合は追加する必要があります。例15.2
webcache-container の追加次の 3 つのコマンドを使用してwebcache-container を設定に対して有効にします。必要に応じてプロファイルの名前やその他のパラメーターを変更します。以下のパラメーターはデフォルト設定で使用されるパラメーターになります。/profile=ha/subsystem=infinispan/cache-container=web:add(aliases=["standard-session-cache"],default-cache="repl",module="org.jboss.as.clustering.web.infinispan")
/profile=ha/subsystem=infinispan/cache-container=web:add(aliases=["standard-session-cache"],default-cache="repl",module="org.jboss.as.clustering.web.infinispan")Copy to Clipboard Copied! Toggle word wrap Toggle overflow /profile=ha/subsystem=infinispan/cache-container=web/transport=TRANSPORT:add(lock-timeout=60000)
/profile=ha/subsystem=infinispan/cache-container=web/transport=TRANSPORT:add(lock-timeout=60000)Copy to Clipboard Copied! Toggle word wrap Toggle overflow /profile=ha/subsystem=infinispan/cache-container=web/replicated-cache=repl:add(mode="ASYNC",batching=true)
/profile=ha/subsystem=infinispan/cache-container=web/replicated-cache=repl:add(mode="ASYNC",batching=true)Copy to Clipboard Copied! Toggle word wrap Toggle overflow 例15.3
SSOcache-container の確認次の管理 CLI コマンドを実行します。/profile=ha/subsystem=infinispan/cache-container=web/:read-resource(recursive=true,proxies=false,include-runtime=false,include-defaults=true)
/profile=ha/subsystem=infinispan/cache-container=web/:read-resource(recursive=true,proxies=false,include-runtime=false,include-defaults=true)Copy to Clipboard Copied! Toggle word wrap Toggle overflow "sso" => {のような出力を探します。このような出力が見つからない場合、設定に SSO cache-container は存在しません。例15.4
SSOcache-container の追加/profile=ha/subsystem=infinispan/cache-container=web/replicated-cache=sso:add(mode="SYNC", batching=true)
/profile=ha/subsystem=infinispan/cache-container=web/replicated-cache=sso:add(mode="SYNC", batching=true)Copy to Clipboard Copied! Toggle word wrap Toggle overflow - SSO を使用するよう
webサブシステムを設定する必要があります。次のコマンドは、default-hostという仮想サーバー上と、クッキードメインdomain.comで SSO を有効にします。キャッシュ名はssoで、再認証は無効になっています。/profile=ha/subsystem=web/virtual-server=default-host/sso=configuration:add(cache-container="web",cache-name="sso",reauthenticate="false",domain="domain.com")
/profile=ha/subsystem=web/virtual-server=default-host/sso=configuration:add(cache-container="web",cache-name="sso",reauthenticate="false",domain="domain.com")Copy to Clipboard Copied! Toggle word wrap Toggle overflow - SSO 情報を共有する各アプリケーションは、
jboss-web.xmlデプロイメント記述子にある同じ <security-domain> とweb.xml設定ファイルにある同じレルムを使用するよう設定されている必要があります。
クラスター化された SSO では個別のホスト間で認証を共有できますが、クラスター化されていない SSO では共有できません。どちらの SSO も同じように設定されますが、クラスター化された SSO には永続データのクラスタリングレプリケーションを制御する cacheConfig や processExpiresInterval、 maxEmptyLife パラメーターが含まれています。
例15.5 クラスター化された SSO 設定の例
tomcat と呼ばれるセキュリティードメインを使用します。
| オプション | 説明 |
|---|---|
| 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() を呼び出し、プログラムを用いてセッションを無効化することができます。
15.5. Kerberos リンクのコピーリンクがクリップボードにコピーされました!
15.6. SPNEGO リンクのコピーリンクがクリップボードにコピーされました!
15.7. Microsoft Active Directory リンクのコピーリンクがクリップボードにコピーされました!
- ユーザーやコンピューター、パスワードなどのリソースの情報を保存する LDAP (Lightweight Directory Access Protocol) 。
- ネットワーク上でセキュアな認証を提供する Kerberos。
- IP アドレスやコンピューターのホスト名、ネットワーク上のその他のデバイス間でマッピングを提供する DNS (Domain Name Service)。
15.8. Web アプリケーションに対する Kerberos または Microsoft Active Directory のデスクトップ SSO の設定 リンクのコピーリンクがクリップボードにコピーされました!
Microsoft Active Directory など、組織における既存の Kerberos ベースの認証承認インフラストラクチャーを使用して Web アプリケーションや EJB アプリケーションを認証するため、JBoss EAP 6 に内蔵される JBoss Negotiation の機能を使用することが可能です。Web アプリケーションを適切に設定すれば、デスクトップまたはネットワークへのログインに成功するだけでWeb アプリケーションに対して透過的な認証を行えるため、追加のログインプロンプトは必要ありません。
JBoss EAP 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 に使用されるクラスとのマッピングを表しています。
| 単純名 | クラス名 | 目的 |
|---|---|---|
| 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 アプリケーションに対して設定することは難しいこともあるため、大変便利なツールと言えます。
手順15.1 Web または EJB アプリケーションへ SSO 認証を設定
サーバーのアイデンティティーを表すセキュリティードメインを 1 つ設定します。必要な場合はシステムプロパティーを設定します。
最初のセキュリティードメインは、コンテナ自体をディレクトリーサービスへ認証します。ユーザーではなくコンテナ自体の認証であるため、ある種の静的ログインメカニズムを受容するログインモジュールを使用する必要があります。この例では静的プリンシパルを使用し、クレデンシャルが含まれるキータブファイルを参照します。明確にするため、この例では XML コードが提供されていますが、管理コンソールまたは管理 CLI を使用してセキュリティードメインを設定するようにしてください。Copy to Clipboard Copied! Toggle word wrap Toggle overflow Web アプリケーションやアプリケーションをセキュアにするため、2 つ目のセキュリティードメインを設定します。必要な場合はシステムプロパティーを設定します。
2 つ目のセキュリティードメインは、個別のユーザーを Kerberos または SPNEGO 認証サーバーへ認証するために使用されます。ユーザーの認証に最低でも 1 つのログインモジュールが必要で、ユーザーに適用するロールを検索するために別のログインモジュールが必要となります。次の XML コードは SPNEGO セキュリティードメインの例を表しています。これには、ロールを個別のユーザーにマッピングする承認モジュールが含まれます。認証サーバー上でロールを検索するモジュールを使用することもできます。Copy to Clipboard Copied! Toggle word wrap Toggle overflow web.xmlの security-constraint と login-config を指定します。web.xml記述子にはセキュリティー制約とログイン設定に関する情報が含まれています。セキュリティー制約とログイン情報の値の例は次のとおりです。Copy to Clipboard Copied! Toggle word wrap Toggle overflow jboss-web.xml記述子にセキュリティードメインと他の設定を指定します。クライアント側のセキュリティードメイン (例の 2 番目のセキュリティードメイン) の名前をデプロイメントのjboss-web.xml記述子に指定し、アプリケーションがこのセキュリティードメインを使用するよう指示します。オーセンティケーターを直接上書きすることができなくなりましたが、必要な場合は NegotiationAuthenticator をバルブとしてjboss-web.xml記述子に追加することができます。<jacc-star-role-allow>は任意で、複数のロール名を一致させるためアスタリスク (*) の使用を許可します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow アプリケーションの
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
Manifest-Version: 1.0 Build-Jdk: 1.6.0_24 Dependencies: org.jboss.security.negotiationCopy to Clipboard Copied! Toggle word wrap Toggle overflow
Web アプリケーションが Kerberos、Microsoft Active Directory、またはその他の SPNEGO 対応のディレクトリーサービスに対してクレデンシャルを許可および認証します。ユーザーがすでにディレクトリーサービスにログインしているシステムよりアプリケーションを実行し、必要なロールがすでにユーザーに適用されている場合は、Web アプリケーションは認証を要求しないため、SSO の機能が実現されます。
第16章 開発セキュリティーに関する参考資料 リンクのコピーリンクがクリップボードにコピーされました!
16.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.xml に設定される要件をローカルリソースへマッピングします。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 に対する要求を満たします。
| 属性 | 説明 |
|---|---|
| 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 | この要素が存在し、大文字と小文字を区別しない true という値が含まれる場合、JBoss Web 承認スタックが使用されます。この要素が存在しない場合や、true でない値が含まれる場合は、Java enterprise Edition 仕様に指定された承認メカニズムのみが使用されます。この要素は JBoss EAP 6 に新規導入された要素です。 |
| disable-audit | この空の要素が存在する場合、Web セキュリティー監査が無効になります。Web セキュリティー監査は Java EE 仕様の一部ではありません。この要素は JBoss EAP 6 に初めて導入された要素です。 |
| disable-cross-context | false の場合、アプリケーションは他のアプリケーションコンテキストを呼び出すことができます。デフォルトは true です。 |
アプリケーションによって使用されるアノテーションを記述します。下表は <annotation> の子要素の一覧になります。
| 属性 | 説明 |
|---|---|
| class-name |
アノテーションのクラスの名前。
|
| servlet-security |
サーブレットのセキュリティーを表す
@ServletSecurity などの要素。
|
| run-as |
run-as の情報を表す
@RunAs などの要素。
|
| multi-part |
マルチパートの情報を表す
@MultiPart などの要素。
|
リスナーを記述します。下表は <listener> の子要素の一覧になります。
| 属性 | 説明 |
|---|---|
| class-name |
リスナーのクラスの名前。
|
| listener-type |
アプリケーションのコンテキストにどのようなリスナーを追加するかを示す
condition 要素の一覧です。以下を選択することが可能です。
|
| module |
リスナークラスが含まれるモジュールの名前。
|
| param |
パラメーター。
<param-name> と <param-value> の 2 つの子要素が含まれます。
|
アプリケーションのバルブを記述します。<listener> と同じ設定要素が含まれます。
16.2. EJB セキュリティーパラメーターについての参考資料 リンクのコピーリンクがクリップボードにコピーされました!
| 要素 | 説明 |
|---|---|
<security-identity>
|
EJB のセキュリティー ID に付随する子要素が含まれています。
|
<use-caller-identity />
|
EJB が呼び出し元と同じセキュリティー ID を使うよう指定します。
|
<run-as>
| <role-name> 要素が含まれています。
|
<run-as-principal>
|
存在する場合、発信呼び出しへ割り当てられたプリンシパルを示します。存在しない場合、発信呼び出しは
anonymous という名前のプリンシパルへ割り当てられます。
|
<role-name>
|
EJB が実行されるロールを指定します。
|
<description>
| <role-name> に名前のあるロールを記述します。
|
例16.1 セキュリティー ID の例
<session> の中でのみ利用可能です。
第17章 補足参考資料 リンクのコピーリンクがクリップボードにコピーされました!
17.1. Java Archiveの種類 リンクのコピーリンクがクリップボードにコピーされました!
| アーカイブタイプ | 拡張 | 目的 | ディレクトリー構造の要件 |
|---|---|---|---|
| Java アーカイブ | .jar | Java クラスのライブラリが含まれています。 | META-INF/MANIFEST.MF ファイル (オプション)。どのクラスが main クラスであるかなどの情報を指定します。
|
| Web アーカイブ | .war |
Java クラスおよびライブラリ以外に、Java Server Pages (JSP) ファイル、サーブレット、および XML ファイルが含まれています。Web アーカイブのコンテンツは Web アプリケーションとも呼ばれます。
| WEB-INF/web.xml ファイル。Web アプリケーションの構造に関する情報が含まれています。WEB-INF/ には、他のファイルが存在する場合もあります。
|
| リソースアダプターアーカイブ | .rar |
ディレクトリー構造は、JCA 仕様で指定されています。
|
Java Connector Architecture (JCA) リソースアダプターが含まれています。コネクターとも呼ばれます。
|
| エンタープライズアーカイブ | .ear |
1 つ以上のモジュールを 1 つのアーカイブにパッケージ化してそれらのモジュールをアプリケーションサーバーに同時にデプロイできるようにするために Java Enterprise Edition (EE) によって使用されます。EAR アーカイブを構築するツールで最も一般的なものは Maven および Ant です。
| META-INF/ ディレクトリー。このディレクトリーには 1 つ以上の XML デプロイメント記述子ファイルが含まれています。
|
|
以下のモジュールタイプのいずれか
| |||
| サービスアーカイブ | .sar |
エンタープライズアーカイブに類似しますが、JBoss EAP に固有なものです。
| jboss-service.xml または jboss-beans.xml ファイルを含む META-INF/ ディレクトリー。
|
付録A 改訂履歴 リンクのコピーリンクがクリップボードにコピーされました!
| 改訂履歴 | |||
|---|---|---|---|
| 改訂 1.0.0-1 | Wed Oct 15 2014 | ||
| |||