質問

コードで次の検索を試してみると、次のようになります。

Context initCtx = new InitialContext();
Context envCtx = (Context) initCtx.lookup("java:comp/env");
return (DataSource) envCtx.lookup("jdbc/mydb"); 

次の例外が発生します。

java.sql.SQLException: QueryResults: Unable to initialize naming context: 
    Name java:comp is not bound in this Context at 
    com.onsitemanager.database.ThreadLocalConnection.getConnection
    (ThreadLocalConnection.java:130) at     
    ...

JBoss に続いて組み込み JBoss をインストールしました ウィキの説明. 。そして、「デフォルトですべての WAR をスキャンする」デプロイメントを使用して Tomcat を構成しました。 構成 Wiki ページ.

設定ページを引用すると、

JNDI

接続プーリング、EJB、JPA、トランザクションなどの組み込みJBOSSコンポーネントは、JNDIを広範囲に使用してサービスを公開します。埋め込まれたJBossは、TomcatのJNDIインスタンス化の上に自分自身を重ねることにより、TomcatのJNDI実装をオーバーライドします。これにはいくつかの理由があります。

  1. これらのサービスをすべてserver.xml内で宣言する必要を避けるため
  2. Java:WebアプリとEJBの間のComp Namespaceの見た目のない統合を可能にするため。
  3. TomcatのJNDI実装には、いくつかのJBOSSコンポーネントが機能する能力を妨げるいくつかの重要なバグがあります
  4. 私たちは、リモートで検索できる EJB やその他のサービスをリモート処理するオプションを提供したいと考えています。

上記の引用によると、java:comp/env でルックアップできるように Tomcat の JNDI 実装をオーバーライドする JBoss ネーミング サービスを設定する方法について何か考えている人はいますか?

参考 - 私の環境 Tomcat 5.5.9、Seam 2.0.2sp、Embedded JBoss (Beta 3)、

注記:データベース接続用の -ds.xml ファイルが正しく設定されており、指示に従ってクラスパス上でアクセスできます。

次の点にも注意してください。私はこの質問を組み込み Jboss フォーラムと Seam ユーザー フォーラムに投稿しました。

役に立ちましたか?

解決

応答ツールキットをありがとうございます。はい、java:jdbc/mydb に直接アクセスしてデータソースにアクセスできますが、ENC 経由で接続する既存のコード ベースを使用しています。ここで私が見つけた興味深い情報をいくつか紹介します...

  1. 上記のコードは次のように動作します。 JBoss 4.2.2.GA 使用されている JNDI ctx パラメータは次のとおりです。
    java.naming.factory.initial = org.jnp.interfaces.namingcontextfactory java.naming.factory.url.pkgs = org.jboss.naming:org.jnp.interfaces:org.jboss.naming:org.jnp.interfaces

  2. 上記のコードは次のように動作します。 トムキャット 5.5.x 使用されている JNDI ctx パラメータは次のとおりです。
    java.naming.factory.initial = org.apache.naming.java.javaurlcontextfactory java.factory.url.pkgs = org.apache.naming

  3. 上記のコードは次のエラーで失敗します 組み込み JBoss (ベータ 3) Tomcat 5.5.x では上記のエラー メッセージが表示されます。
    java.naming.factory.initial = org.apache.naming.java.javaurlcontextfactory javaing.factory.url.pkgs = org.apache.naming上記のコードは、上記のエラーで失敗します。

埋め込み JBoss JNDI 設定で何をする必要があるか考えている人はいますか?

他のヒント

java:comp/env はエンタープライズ ネーミング コンテキスト (ENC) として知られており、グローバルには表示されません。見る ここ 詳細については。データソースが登録されているグローバル JNDI 名を見つける必要があります。

これを行う最も簡単な方法は、JBoss の Web ベースの JMX コンソールに移動し、「JNDIView」(名前は正確にはわかりませんが、現在ホームにあります) MBean を探すことです。この MBean には、JNDI バインドされたすべてのオブジェクトのコンテキスト パスを表示する、呼び出し可能なリスト メソッドが必要です。

Jboss Embedded でも同様の問題が発生しましたが、最終的にファイルでの再生を修正しました。テストデータソース-ds.xml

追加する

<mbean code="org.jboss.naming.NamingAlias" name="jboss.jmx:alias=testDatasource">
    <attribute name="FromName">jdbc/Example DataSource</attribute>
    <attribute name="ToName">java:/testDatasource</attribute>
</mbean>

問題は、jboss が宣言されたすべてのデータソースに接頭辞 java:/ を追加することでした。それで最終的に、testDatasourceという名前のデータソースができ、jdbc/Example DataSourceへのディレクティブでオーバーライドされました。

うまくいくことを願っています

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top