目次 | 前へ | 次へ

6. 構成

6.1 環境プロパティー

一部の JNDI アプリケーションには、ネームおよびディレクトリサービスがアクセスされる環境を定義するさまざまな設定や情報を通信するための方法が必要です。たとえば、ディレクトリサービスにアクセスするときに、セキュリティーレベルを指定することがあります。または、ディレクトリおよびネームサービスが分散している場合は、情報のソースが、複製、マスター、キャッシュなどの複数の場所にあります。この場合、アプリケーションでは、認証されたソースの情報にアクセスし、JNDI システムにこの情報を通知する必要があります。

これらの要件に対処するために、JNDI には多くのプロパティーが定義されており、開発者およびユーザーが JNDI システムに構成情報を設定するときに使用します。これらは、環境プロパティーと呼ばれます。

環境プロパティーには、さまざまな種類があります。

  • 標準 JNDI 環境プロパティー。JNDI に定義されており、すべてのサービスプロバイダで共通に使用できます。比較的一般的な用語で定義されています。たとえば、「java.naming.security.principal」プロパティーは、ネームサービスに対する認証のためのセキュリティープリンシパルを指定するために使用されます。環境プロパティーは、各サービスプロバイダによって適切に解釈されます。これらのプロパティーには接頭辞「java.naming.」が付き、標準 JNDI 環境プロパティーのリストが含まれています。Context インタフェースは、これらの環境プロパティー名のほとんどの定数を定義します。
  • サービス固有の環境プロパティー。特定のサービスまたはプロトコルを実装するすべてのサービスプロバイダで共通に使用されます。これらのプロパティーには、接頭辞「java.naming.service.」が付きます。ここで、service はそのサービスの名前です。たとえば、接頭辞「java.naming.ldap.」は LDAP 固有の環境プロパティーに使用されます。
  • 機能固有の環境プロパティー。特定の機能をサポートするすべてのサービスプロバイダで共通に使用されます。これらのプロパティーには、接頭辞「java.naming.feature」が付きます。ここで、feature はその機能の名前です。たとえば、接頭辞「java.naming.security.sasl.」は、SASL 固有の環境プロパティーに使用されます。
  • プロバイダ固有の環境プロパティー。特定のサービスプロバイダに対してだけ適用されます。このプロパティーには、一意の接頭辞を付ける必要があります。サービスプロバイダのパッケージ名を先頭に付ける手法がよく使われます。たとえば、Sun の LDAP プロバイダは主に com.sun.jndi.ldap パッケージに含まれているため、Sun の LDAP プロバイダに固有のプロパティーには接頭辞「com.sun.jndi.ldap.」が付きます。

環境プロパティーを使用する場合のセキュリティー関連の考慮事項については、「コンテキスト環境」を参照してください。

環境プロパティーのサポートは比較的広範囲にわたりますが、アプリケーションは通常これを処理する必要がないか、または 1 つか 2 つのプロパティーを設定するだけで済むことに注意してください。ほとんどのプロパティーには、適切なデフォルト値が設定されているので、特別な要件を持つアプリケーション以外は調整する必要はありません。

6.2 コンテキスト環境

コンテキストの環境は、java.util.Hashtable またはそのサブクラスのいずれか (java.util.Properties 1 など) として表されます。これは通常、InitialContextInitialDirContext、または InitialLdapContext コンストラクタへの引数を使用して指定され、ほかのソースからのデータによって拡張されます (このセクションの残りの部分で説明します)。これらの設定は、コンテキストメソッドによって各コンテキストの処理が行われるたびに、親のコンテキストから継承されます。たとえば、次のコードでは、セキュリティー関連の 2 つのプロパティーで構成される環境が作成され、その環境から初期コンテキストが作成されます。

Hashtable env = new Hashtable();
env.put(Context.SECURITY_PRINCIPAL, "jsmith");
env.put(Context.SECURITY_CREDENTIALS, "xxxxxxx");
Context ctx = new InitialContext(env);

検索されるか、またはこの初期コンテキストから派生したコンテキストには、その環境にこれらの 2 つのプロパティーが継承されます。

コンテキストの環境は、Context.getEnvironment() を使用して調べることができます。

すべての環境プロパティーがすべてのコンテキストで意味を持つわけではありません。無効な環境プロパティーは、そのコンテキストでは無視されますが、派生したコンテキストには継承されます。たとえば、連合されたコンテキストで有効になる可能性があるためです。

6.3 リソースファイル

JNDI リソースファイルは、プロパティーファイル形式のファイルです (java.util.Properties を参照)。このファイルには、キーと値のペアのリストが格納されています。キーはプロパティーの名前 (「java.naming.factory.object」など) であり、値はそのプロパティーに対して定義されている形式の文字列です。次に、JNDI リソースファイルの例を示します。

java.naming.factory.object=com.wiz.jndi.AttrsToCorba:com.wiz.jndi.ToPerson
java.naming.factory.state=com.wiz.jndi.CorbaToAttrs:com.wiz.jndi.FromPerson
java.naming.factory.control=com.wiz.jndi.MyResponseControlFactory

JNDI リソースファイルには、アプリケーションとプロバイダという 2 つの種類があります。

アプリケーションリソースファイル

アプリケーションが展開される場合、一般に、そのクラスパス内にはいくつかのコードベースディレクトリと JAR があります。同様に、アプレットが配置される場合、アプレットのクラスが検索される場所を指定するコードベースおよびアーカイブがあります。JNDI は、クラスパス内の jndi.properties という名前のすべてのアプリケーションリソースファイルを検索します。さらに、$JAVA_HOME/lib/jndi.properties ファイルが存在して読み取り可能である場合、JNDI は、それを追加のアプリケーションリソースファイルとして処理します。( $JAVA_HOME は、java.home システムプロパティーで指定されたディレクトリです。)これらのファイルに含まれるプロパティーはすべて、初期コンテキストの環境に配置されます。この環境は、ほかのコンテキストに継承されます。

複数のアプリケーションリソースファイルで見つかった各プロパティーについて、JNDI は見つかった最初の値を使用するか、またはそれが意味を持つ数少ないケースではすべての値を連結します。たとえば、java.naming.factory.object プロパティーが 3 つの jndi.properties リソースファイルで見つかった場合、オブジェクトファクトリのリストは、3 つのすべてのファイルのプロパティー値の連結になります。この方式を使用すると、配置可能なコンポーネントのそれぞれで、エクスポートするファクトリがリスト表示されます。JNDI では、ファクトリクラスを検索するときに、これらのエクスポートリストがすべて収集および使用されます。

アプリケーションリソースファイルは、Java 2 プラットフォームから使用できます。ただし、$JAVA_HOME/lib 内のファイルは、すべての Java プラットフォームで使用できます。

プロバイダリソースファイル

サービスプロバイダにはそれぞれ、そのプロバイダに固有のプロパティーを含むオプションのリソースファイルがあります。このリソースの名前は次のようになります。

[prefix/]jndiprovider.properties

ここで、prefix はプロバイダのコンテキスト実装のパッケージ名であり、各ピリオド (「.」) はスラッシュ (「/」) に変換されます。

JNDI ライブラリは、特定のプロパティーの値を決定するときにプロバイダリソースファイルを参照します。これらのプロパティー以外のプロパティーは、サービスプロバイダの指定に基づいて、プロバイダリソースファイルに設定されます。サービスプロバイダのドキュメントには、使用できるプロパティーを明記する必要があります。

6.4 アプリケーション/アプレットスコープの標準 JNDI プロパティー

特定の標準 JNDI プロパティーは、Java ランタイムのシステムプロパティーまたはアプレットのパラメータリスト内で交互に設定できます。これらのプロパティーは次のとおりです。

java.naming.factory.initial
java.naming.factory.object
java.naming.factory.state
java.naming.factory.control
java.naming.factory.url.pkgs
java.naming.provider.url
java.naming.dns.url

JNDI がアプレットのパラメータにアクセスするには、アプレットコードで、java.naming.applet 環境プロパティーをそのアプレットのインスタンス (java.applet.Applet) に設定する必要があります。

これらのプロパティーがシステムプロパティーまたはアプレットパラメータとして設定されている場合は、アプリケーション/アプレットのすべてのコンテキストに影響を与えます。

6.5 環境プロパティーの設定方法

JNDI によって初期コンテキストが構築されると、そのコンテキストの環境は、コンストラクタに渡された環境パラメータおよびすべてのアプリケーションリソースファイルで定義されているプロパティーを使用して初期化されます。アプリケーションスコープまたはアプレットスコープのプロパティーの場合は、システムプロパティーおよびアプレットパラメータの値も使用されます。

JNDI は、結果の環境を初期コンテキスト実装に渡します。この環境は、初期コンテキストから派生したコンテキストに継承されます。プロパティーとその値のマージが必要な場合は、JNDI によって行われるので、アプリケーションまたはコンテキスト実装からシステムプロパティーまたはアプレットパラメータを直接調べる必要はありません。

6.6 環境の変更

コンテキストの環境は、addToEnvironment() および removeFromEnvironment() メソッドを使用して変更できます。

public interface Context {
        public Object addToEnvironment(String propName, Object val)
                throws NamingException;
        public Object removeFromEnvironment(String propName)
                throws NamingException;
        ...
}

すべての環境プロパティーがすべてのコンテキストで意味を持つわけではありません。無効な環境プロパティーを変更した場合でも、変更は記録され、派生したコンテキストに渡されます。

スコープ

addToEnvironment() または removeFromEnvironment() メソッドを使用してプロパティーを変更すると、そのメソッドが呼び出されたコンテキストインスタンスに反映されます。たとえば、コンテキストで使用される新しい資格を指定した場合は、そのコンテキストで呼び出される後続のメソッドでサーバーとの通信が行われるときに、新しい資格が使用されます。内部的には、最初にサーバーに新しい接続が確立されるときに使用されます。更新された環境プロパティーは、更新が適用されたコンテキストインスタンスから派生したコンテキストインスタンスに継承されます。ただし、更新以前に生成されたコンテキストインスタンスには継承されません。

適用のタイミング

環境プロパティーが変更される場合は、addToEnvironment() または removeFromEnvironment() が呼び出されるときに、その変更を検証したり有効にしたりする必要はありません。必要なのは、そのプロパティーを使用する操作が次回呼び出されるときに、その (1 つまたは複数の) 変更を有効にすることだけです。

デフォルト値

一部の環境プロパティーには、JNDI によってデフォルト値が定義されます (「付録 A」を参照)。その他の環境プロパティーは、いくつかのサービスプロバイダによってデフォルト値が決定されます。コンテキストの環境に特定のプロパティーが指定されていない場合は、その環境プロパティーにデフォルト値が指定されていると見なして動作します。

コンテキストの環境からあるプロパティーが削除されると、コンテキストは、そのプロパティーに指定されているデフォルトの動作を前提にします。ただし、プロパティーの値としてデフォルト値を指定しなければならないという意味ではありません。コンテキストの環境にプロパティーが存在しない場合も、削除と見なされます。

設定できる値

環境プロパティーには、固定された設定できる値のセットを持つものと、特定の構文に従う必要のある値を持つものがあります。設定できない値が指定された場合は、プロパティー固有の例外 (ConfigurationExceptionIllegalArgumentExceptionAuthenticationNotSupportedException など) がスローされます。この場合、サービスプロバイダに設定できる値に、定義された値以外の値を追加する方が適切なことがあります。追加する場合は、それらの値をドキュメントに明記する必要があります。


1. プロパティーを使用する場合は、環境からエントリを取得するときに Hashtable.get() が使用されるため、最上位のプロパティーだけが参照される (デフォルト値は参照されない) ことに注意してください。詳細は、java.util.Properties を参照してください。

目次 | 前へ | 次へ


Copyright © 1993, 2013, Oracle and/or its affiliates. All rights reserved.