java:comp / env /は何をしますか?


116

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/価値の接頭辞、私が言ったエラーになるだろう「名前のJDBCは、このコンテキストでバインドされていない」と


3
最初にどちらを使用しましたか?あなたの質問は、2番目の例を誤って使用している(jdbc/locしたがってjava:comp/env/jdbc/loc正しい)ことを意味しますが、cherouvimの回答は、最初の例を誤って使用している(java:comp/env/jdbc/locしたがってjdbc/loc、正しい)ことを意味します。とにかく、本当の答えは:それは現在の状況に依存します。
BalusC 2010年

1
機能しないものは、暗黙のとおり、実際にはjava:comp / env / jdbc / locがありませんでした。ポイントされたコンテキストファイルには、「loc」リソースが含まれていました。「現在の」コンテキストの可能性は何ですか?
ダニー

回答:


100

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

名前空間のルートコンテキストには、「comp」という名前のバインディングがあり、コンポーネント関連のバインディング用に予約されているサブツリーにバインドされています。「comp」という名前はコンポーネントの略です。ルートコンテキストには他のバインディングはありません。ただし、ルートコンテキストは、ポリシーの将来の拡張、特にコンポーネント自体ではなく、ユーザーや部門などの他のタイプのエンティティに関連付けられているリソースに名前を付けるために予約されています。たとえば、将来のポリシーでは、「java:user / alice」や「java:org / engineering」などの名前を使用して、ユーザーおよび組織/部門に名前を付けることができるようになる可能性があります。

「comp」コンテキストには、「env」と「UserTransaction」の2つのバインディングがあります。「env」という名前は、コンポーネントの環境関連バインディング用に予約されているサブツリーにバインドされており、そのデプロイメント記述子によって定義されています。「env」は環境の略です。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");

私はこれを正しく理解していたと思いましたが、さらにコメントがあったので、自分がそうしたことを逆に理解しました。Tomcatコンテキスト記述子がデフォルトでjava:comp / envに移動した場合、それは値からjava:comp / envを省略できることを意味しませんか?私の場合は、「名前jdbcがこのコンテキストにバインドされていません」というエラーを解消するために追加する必要がありました。
ダニー

4
「foo」を使用してバインドし、「java:comp / env / foo」を使用して検索します。見ていblog.cherouvim.com/javax-sql-datasource-exposed-through-jndi
cherouvim

3
上記のリンクはスタンドアロンのJNDIチュートリアルからのもので、元はdocs.oracle.com/javase/jndi/tutorial/beyond/misc/policy.htmlから入手できます。
Danilo Piazzalunga 2013

ルックアップに/ -esがさらにある場合はどうなりますか?「java:com / env / foo / bar」のように、jndiNameの値は「foo / bar」または「foo.bar」ですか?
Pieter De Bie

正しいjndiName値は "foo / bar" @PieterDeBrieになります。
tftdias 2015年

37

プロパティもありますresourceRefJndiObjectFactoryBeanに設定がとき、されtrue、自動的に文字列を付加するために使用されjava:comp/env/、それが存在しない場合。

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

3

何度か試してみて、Tomcatのソースコードを深く調べたところ、単純なプロパティuseNaming = "false"でうまくいくことがわかりました。Tomcat がjava:comp / env / liferayではなくjava:/ liferayという名前を解決するようになりました


リソース定義を含む完全な例を提供できますか?Tomcat 8.5でこれをうまくセットアップできませんでした。より包括的な例を使用すると、間違いを見つけやすくなるでしょう。
RobertG
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.