目次 | 前の項目 | 次の項目 | JNDI API |
6.1 環境プロパティー
一部の 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.MyResponseControlFactoryJNDI リソースファイルには、アプリケーションとプロバイダの 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 ライブラリでは、特定のプロパティーの値を決定するときに、プロバイダリソースファイルが検査されます。これらのプロパティー以外のプロパティーは、サービスプロバイダの指定に基づいて、プロバイダリソースファイルに設定されます。サービスプロバイダのドキュメントには、使用できるプロパティーを明記する必要があります。
次の 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.urlJNDI からアプレットのパラメータにアクセスするには、アプレットコードを使用して、
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()
メソッドが呼び出されても、その変更の検証および適用はただちに行われません。そのプロパティーを使用する操作が次に呼び出されたときに、変更が有効になります。デフォルト
一部の環境プロパティーには、JNDI によってデフォルト値が定義されています (付録 A を参照)。その他の環境プロパティーは、いくつかのサービスプロバイダによってデフォルト値が決定されます。コンテキストの環境に特定のプロパティーが指定されていない場合は、その環境プロパティーにデフォルト値が指定されていると見なして動作します。
コンテキストの環境からプロパティーを削除したときは、そのプロパティーに指定されていたデフォルト値に基づいて動作します。ただし、プロパティーの値としてデフォルト値を指定しなければならないという意味ではありません。コンテキストの環境にプロパティーが存在しない場合も、削除と見なされます。