目次 | 前の項目 | 次の項目 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.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.