目次 | 前へ | 次へ |
一部の JNDI アプリケーションには、ネームおよびディレクトリサービスがアクセスされる環境を定義するさまざまな設定や情報を通信するための方法が必要です。たとえば、ディレクトリサービスにアクセスするときに、セキュリティーレベルを指定することがあります。または、ディレクトリおよびネームサービスが分散している場合は、情報のソースが、複製、マスター、キャッシュなどの複数の場所にあります。この場合、アプリケーションでは、認証されたソースの情報にアクセスし、JNDI システムにこの情報を通知する必要があります。
これらの要件に対処するために、JNDI には多くのプロパティーが定義されており、開発者およびユーザーが JNDI システムに構成情報を設定するときに使用します。これらは、環境プロパティーと呼ばれます。
Context
インタフェースは、これらの環境プロパティー名のほとんどの定数を定義します。com.sun.jndi.ldap
パッケージに含まれているため、Sun の LDAP プロバイダに固有のプロパティーには接頭辞「com.sun.jndi.ldap.」が付きます。環境プロパティーを使用する場合のセキュリティー関連の考慮事項については、「コンテキスト環境」を参照してください。
環境プロパティーのサポートは比較的広範囲にわたりますが、アプリケーションは通常これを処理する必要がないか、または 1 つか 2 つのプロパティーを設定するだけで済むことに注意してください。ほとんどのプロパティーには、適切なデフォルト値が設定されているので、特別な要件を持つアプリケーション以外は調整する必要はありません。
コンテキストの環境は、java.util.Hashtable
またはそのサブクラスのいずれか (java.util.Properties 1
など) として表されます。これは通常、InitialContext
、InitialDirContext
、または 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()
を使用して調べることができます。
すべての環境プロパティーがすべてのコンテキストで意味を持つわけではありません。無効な環境プロパティーは、そのコンテキストでは無視されますが、派生したコンテキストには継承されます。たとえば、連合されたコンテキストで有効になる可能性があるためです。
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 ライブラリは、特定のプロパティーの値を決定するときにプロバイダリソースファイルを参照します。これらのプロパティー以外のプロパティーは、サービスプロバイダの指定に基づいて、プロバイダリソースファイルに設定されます。サービスプロバイダのドキュメントには、使用できるプロパティーを明記する必要があります。
特定の標準 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
) に設定する必要があります。
これらのプロパティーがシステムプロパティーまたはアプレットパラメータとして設定されている場合は、アプリケーション/アプレットのすべてのコンテキストに影響を与えます。
JNDI によって初期コンテキストが構築されると、そのコンテキストの環境は、コンストラクタに渡された環境パラメータおよびすべてのアプリケーションリソースファイルで定義されているプロパティーを使用して初期化されます。アプリケーションスコープまたはアプレットスコープのプロパティーの場合は、システムプロパティーおよびアプレットパラメータの値も使用されます。
JNDI は、結果の環境を初期コンテキスト実装に渡します。この環境は、初期コンテキストから派生したコンテキストに継承されます。プロパティーとその値のマージが必要な場合は、JNDI によって行われるので、アプリケーションまたはコンテキスト実装からシステムプロパティーまたはアプレットパラメータを直接調べる必要はありません。
コンテキストの環境は、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」を参照)。その他の環境プロパティーは、いくつかのサービスプロバイダによってデフォルト値が決定されます。コンテキストの環境に特定のプロパティーが指定されていない場合は、その環境プロパティーにデフォルト値が指定されていると見なして動作します。
コンテキストの環境からあるプロパティーが削除されると、コンテキストは、そのプロパティーに指定されているデフォルトの動作を前提にします。ただし、プロパティーの値としてデフォルト値を指定しなければならないという意味ではありません。コンテキストの環境にプロパティーが存在しない場合も、削除と見なされます。