1. ホーム
  2. spring

[解決済み] java:comp/env/は何をするところですか?

2022-09-14 20:22:19

質問

私は、いくつかのJNDIファクトリBeanをフックするときにいくつかのエラーを解決しようとして、私の一日の多くの時間を費やしました。問題は、この代わりに...であることが判明しました。

<bean id="someId" class="org.springframework.jndi.JndiObjectFactoryBean">
  <property name="jndiName" value="java:comp/env/jdbc/loc"/>
</bean>

実はこんなこと書いてました...。

<bean id="someId" class="org.springframework.jndi.JndiObjectFactoryBean">
  <property name="jndiName" value="jdbc/loc"/>
</bean>

と推察しています。 java:comp/env/ おそらく、何らかの環境変数を参照し、最終的に私のコンテキストファイルが参照されるようにするのでしょう。 唯一の違いは java:comp/env/ . 専門家の口からすると、これは何をするものなのでしょうか?

がなければ java:comp/env/ のプレフィックスがないと、次のようなエラーが発生します。 このContextでは、jdbcという名前はバインドされていません" .

どのように解決するのですか?

引用元 https://web.archive.org/web/20140227201242/http://v1.dione.zcu.cz/java/docs/jndi-1.2/tutorial/beyond/misc/policy.html

<ブロッククオート

ネームスペースのルートコンテキストに は "comp" という名前を持つバインディングです。 コンポーネント関連のバインディングのために予約されたサブツリーにバインドされている にバインドされています。このバインディングは、コンポーネント関連のバインディング用に予約されたサブツリーにバインドされています。 という名前は、コンポーネントの略です。 ルートコンテキストには、他のバインディングはありません。 ルートコンテキストには他のバインディングはありません。しかし、ルート コンテキストは、将来的なポリシーの拡張のために予約されています。 ポリシーの拡張、特に コンポーネントそのものではなく コンポーネント自体にではなく、ユーザーや他の のような他のタイプのエンティティに結びついた命名リソースのために予約されています。 のような他のタイプのエンティティに関連付けられた命名リソースのためのものである。たとえば、将来 将来のポリシーでは、ユーザーと組織/部門に名前を付けることができるようになるかもしれません。 および組織/部門を指定することができます。 のような名前を使用することができます。 java:org/engineering"のような名前を使用して、ユーザーと組織/部門を指定することができます。

comp" コンテキストでは、次の 2 つのバインディングがあります。 env" と "UserTransaction" という 2 つのバインディングがあります。 env"という名前は、コンポーネントのために予約されたサブツリーにバインドされています。 にバインドされ、コンポーネントの 環境関連のバインディングのために予約されたサブツリーにバインドされます。 このサブツリーは、そのコンポーネントのデプロイメント記述子によって定義されます。 env" は Environment(環境)の略です。J2EEでは J2EEでは、以下の構造を推奨しています(ただし、必須ではありません)。 env".名前空間の構造は次のとおりです。 の名前空間を使用することを推奨します。

Springやtomcatのコンテキスト記述子から行ったバインディングは、デフォルトでjava:comp/env/に移動するわけです。

例えば、あなたの設定が

<bean id="someId" class="org.springframework.jndi.JndiObjectFactoryBean">
  <property name="jndiName" value="foo"/>
</bean>

を使って直接アクセスできるようになります。

Context ctx = new InitialContext();
DataSource ds = (DataSource)ctx.lookup("java:comp/env/foo");

または、取得するリソースごとに "java:comp/env" を指定する必要がないように、中間ステップを作成することもできます。

Context ctx = new InitialContext();
Context envCtx = (Context)ctx.lookup("java:comp/env");
DataSource ds = (DataSource)envCtx.lookup("foo");