2010-11-30 34 views
6

私は私のJava Webアプリケーションを構成するために春を使用して、次のように私のSpring構成で、私は桟橋のためのJNDI経由でデータソースを取得:Tomcatの桟橋JNDIルックアップの対

<jee:jndi-lookup id="dataSource" jndi-name="jdbc/myDataSource" />

が、これは、Tomcatのでは動作しません。

<jee:jndi-lookup id="dataSource" jndi-name="java:comp/env/jdbc/myDataSource" />

いただきましたこの問題を解決するための最良の方法を:Tomcatので、私はこれを行うには?私はすでに構成を外部化する方法としてJNDIを使用しているので、外部化された構成を外部化できません。同時に私は2つの別々のSpring設定ファイルを持っているという考えを絶対に嫌っています。助けて!!!

答えて

7

を私は答えhereを見つけたが、私はそれは少し複雑だと思ったが、それは非常に使用するように私にアイデアを与えるでしたクールServerDetectorクラスブロガーが見つけた

私は動的に私が実行しているサーバーの種類を把握することができたら、私は残りの作業を行うために春の式言語を使用することができました:

<jee:jndi-lookup id="myAppDataSource" 
    jndi-name="#{ (AppServerType == 'Jetty' ? 'jdbc/' : 'java:comp/env/jdbc/') + 
        'myAppDataSource' }" /> 

簡単!

1

これを行う最もクリーンな方法は、設定を構成することです。 ;)

Springプロパティプレースホルダを使用します。

http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/beans.html#beans-factory-placeholderconfigurer

を参照してください。基本的な考え方は、あなただけの財産であなたの春の設定でプレースホルダを置くことで、それがプロパティファイルからプロパティをマッチング読み込みます。ビルドプロセスでプロパティファイルを生成します。ビルドツール(ant)が環境変数を読み込んだ後、トークンで設定されたスケルトンファイルに基づいて、環境に適したプロパティファイルを作成する場所を確認しました。

+0

jndi-nameというプロパティのプレースホルダからこの値を使用するとしますか?またはJNDIを完全にスキップすることはできますか? – HDave

+1

@hdave、jndi-name = "{jndi.name}"に設定します.jndi.nameは、ビルドプロセスによって生成されるビルドファイル内のプロパティです。問題を解決したようですが、このテクニックは間違いなく最終的には間違いなく役立ちます。 – hvgotcodes

+0

私はすぐにWebsphereのサポートに移行する予定で、JNDIパスに向けて独自のファンキーなアプローチがあることを理解しています。 – HDave

4

いくつかの実験の後、私は、JettyがTomcatと同じJNDIパスを使用するように強制することができたことを理解しました。

<New id="myDataSource" class="org.mortbay.jetty.plus.naming.Resource"> 
    <!-- We MUST specify the entire JNDI path here to force compliance with the Tomcat/J2EE convention --> 
    <Arg>java:comp/env/jdbc/myDataSource</Arg> 
    <Arg> 
    <New class="com.atomikos.jdbc.nonxa.AtomikosNonXADataSourceBean"> 
    <Set name="uniqueResourceName">sbeDatabase</Set> 
       ............... 
    </New> 
    </Arg> 
</New> 

ない、これが理想的ですが、それが動作するかどうかを確認します。次のスニペットは、私のjetty-env.xmlファイルからです。

更新

あなたがWAR内のあなたの桟橋-env.xmlファイルを置けばそれは動作します...しかし、何らかの理由で、1のためにあなたはWARの外と内のコンテキストフラグメントファイルにこの設定を移動します桟橋の「コンテクスト」ディレクトリには、それは例外をスロー:

はそれをチェックアウト:http://jira.codehaus.org/browse/JETTY-273

+0

私はこれが好きです。なぜなら、それは春がそのxml癌に依存しないからです。 –

関連する問題