15

私は次のものを持っています...

Context aContext = = new InitialContext(settings);
aContext.lookup("java:comp/env/DB2_DB");

また、試してみました...

aContext.lookup("DB2_DB");

web.xml

<resource-ref>
    <description>
    </description>
    <res-ref-name>DB2_DB</res-ref-name>
    <res-type>javax.sql.DataSource</res-type>
    <res-auth>Application</res-auth>
    <res-sharing-scope>Shareable</res-sharing-scope>
    <mapped-name>DB2_DB</mapped-name>
</resource-ref>

次に、私のibm-web-bnd.xmlで...

<resource-ref name="DB2_DB" binding-name="jdbc/DB2DB" />

Websphereでは、リソース> JDBC>データソースにバインディング名が表示されます

しかし、アプリケーションを実行すると...

原因: javax.naming.NameNotFoundException: コンテキスト: Node04Cell/nodes/Node04/servers/server1、名前: DB2_DB: 名前 DB2_DB の最初のコンポーネントが見つかりません。[ルート例外は org.omg.CosNaming.NamingContextPackage.NotFound: IDL:omg.org/CosNaming/NamingContext/NotFound:1.0]^M

これは WAS6-8.5 からの移植プロジェクトです

4

3 に答える 3

16

ええと、この質問はかなり古いもので、まだ受け入れられた回答がないようです。

実際に何が起こるかは次のとおりです。

  1. コードは への JNDI ルックアップを実行しjava:comp/env/DB2_DBます。
  2. WebSphere は、WAS 独自のデプロイメント記述子 ( ) を使用して、アプリケーション バインディングを WebSphere JNDI ツリー内の実名ibm-web-bnd.xmlに「変換」します( )。DB2_DBjdbc/DB2DB
  3. WebSphere はjdbc/DB2DBそれを検索し、呼び出し元に返します。

最初のルックアップでを取得しNameNotFoundExceptionています - のルックアップ。問題は見つけることではありません。コンポーネントの環境内を見つけることです。java:comp/env/DB2_DBjdbc/DB2DBDB2_DB

あなたのデプロイメント記述子は私には問題ないように見えるので、問題の理由は次のとおりだと思います。

Context aContext = new InitialContext(settings);

InitialContextを提供してインスタンスを構築していますHashtable。はHashtable、構築に特別なパラメータを提供する必要がある場合に便利ですが、いつ使用し、いつ使用しないかを知っておく必要があります。JavaEE コンテナー内で実行され、コンテナーの JNDI ツリーへの単純なアクセスを必要とするコードは、コンストラクターに提供する必要はほとんどありません。HashtableInitialContext

たとえば、遠く離れた外部の JNDI ツリーでルックアップを行うように指示するキーが含まれsettingsていても、驚かないでしょう。InitialContextPROVIDER_URL

したがって、そのパラメーターを破棄することから始めます。

Context aContext = new InitialContext();

そして、もう一度試してみてください。

それでも失敗する場合は、WebSphere のdumpNamespaceユーティリティを使用して、WebSphere の JNDI ツリーを明確に把握してください。

于 2014-05-18T23:03:03.330 に答える