目次 | 前の項目 | 次の項目 JNDI API


6. 構成

6.1 環境プロパティー

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

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

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

環境プロパティー使用時のセキュリティーについては、「コンテキスト環境」を参照してください。

環境プロパティーに対するサポートはかなり広範囲に及んでいますが、一般的にアプリケーションは、そのプロパティーを取り扱う必要はありません。必要な場合でも、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 Platform 以降のプラットフォームで使用できます。 ただし、$JAVA_HOME/lib のファイルは、すべての Java プラットフォームで使用できます。

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

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

[prefix/]jndiprovider.properties

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

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

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

次の JNDI 標準プロパティーは、Java Runtime のシステムプロパティーまたはアプレットのパラメータリストで設定できます。 これらのプロパティーを次に挙げます。java.naming.factory.initial

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() メソッドが呼び出されても、その変更の検証および適用はただちに行われません。そのプロパティーを使用する操作が次に呼び出されたときに、変更が有効になります。

デフォルト

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

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

設定できる値

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


追加する場合は、それらの値をドキュメントに明記する必要があります。 1. プロパティーを使用する場合は、環境からエントリを取り出すときに Hashtable.get() が使用されるため、最上位のプロパティーだけが検査され、デフォルト値は検査されません。詳細は、java.util.Properties を参照してください。


目次 | 前の項目 | 次の項目
Copyright ©1997-1999 Sun Microsystems, Inc. All Rights Reserved.