2017-01-24 15 views
1

Tomcat 8を実行しているサーバーを設定して、そのサーバー上で実行されている多数のアプリケーションがJNDI URLリソースを利用できるようにしようとしています。アプリは、Maven(No Spring)を使用したプレーンなJSP /サーブレットです。Tomcat 8のグローバルJNDI URLリソースはどのように使用しますか?

私は使用しようとしているグローバルリソースの2つの例を持っています.1つは正しく動作するDataSourceで、もう1つは正しくないURLです。 GlobalNamingResources要素内トムキャットのcontext.xml Tomcatのweb.xmlに

<Resource name="APPNAME" auth="Container" type="javax.sql.DataSource" 
    maxTotal="100" maxIdle="30" maxWaitMillis="10000" username="appuser" 
    password="password" driverClassName="oracle.jdbc.driver.OracleDriver" 
    url="aUrl" /> 

、データソースのためにそれのトップレベルの要素

<resource-ref> 
    <res-ref-name>APPNAME</res-ref-name> 
    <res-type>javax.sql.DataSource</res-type> 
    <res-auth>Container</res-auth> 
    <res-sharing-scope>Unshareable</res-sharing-scope> 
</resource-ref> 

のDataSource

、およびそれは動作します

URLリソースについて、私はこのserver.xmlで

<Resource name="url/LOGIN_MODULE_CONFIGURATION_SERVICE" auth="Container" 
    type="java.net.URL" factory="com.mycompany.objectfactory.JndiUrlObjectFactory" 
    url="AValidUrl" /> 

マイオブジェクトファクトリは、この答えと同様に作成されたている:私はそれがされていたことを証明するために、いくつかのprintln文を追加除きTomcat: use FTP connection via JNDIは、それは正しいURLを使用していました。

私は、次のTomcatのweb.xmlの

<resource-ref> 
    <res-ref-name>url/LOGIN_MODULE_CONFIGURATION_SERVICE</res-ref-name> 
    <res-type>java.net.URL</res-type> 
    <res-auth>Container</res-auth> 
</resource-ref> 

最後にこれをアクセスするコードを持っています。このコードは、jarを逆コンパイルした結果であり、サードパーティのjarファイルではありませんが、ソースコードはありません。例外は、jndiReference = ic.lookup(serviceName);行で発生します。 serviceNameはリソースの名前であり、jndiRootは常にnullです(このメソッドを呼び出すコードはnullになります)。 getInitialContext()メソッドは、すでに作成されていない場合はjavax.naming.InitialContextという新しいインスタンスを作成します。

public static URL getUrl(final String serviceName, final String jndiRoot) { 
    URL result = null; 
    if (!isEmpty((Object) serviceName)) { 
     final InitialContext ic = getInitialContext(); 
     Object jndiReference = null; 
     try { 
      jndiReference = ic.lookup(serviceName); 
     } catch (NamingException ex) { 
      ex.printStackTrace(); 
      if (!isEmpty((Object) jndiRoot)) { 
       final String name = String.valueOf(jndiRoot) + serviceName; 
       try { 
        jndiReference = ic.lookup(name); 
       } catch (NamingException ex2) { 
        ex.printStackTrace(); 
       } 
      } 
     } 
     if (jndiReference instanceof URL) { 
      result = (URL) jndiReference; 
     } else if (jndiReference instanceof Reference) { 
      final Reference reference = (Reference) jndiReference; 
      final RefAddr refAddr = reference.get("spec"); 
      try { 
       result = new URL(getString(refAddr.getContent())); 
      } catch (MalformedURLException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 
    return result; 
} 

プロパティからの行は、リソースpropertyserviceurl=url/LOGIN_MODULE_CONFIGURATION_SERVICE

へのマップは私もトムキャットのcontext.xmlにリソースリンクを追加しようとしていることをファイル。私は、ResourceLinkの名前を一意にし、グローバルの値を実際のResourceと同じにしようとしました。リソースの代わりにResourceLink名にマップするプロパティファイルを変更してみましたが、私はいつも同じ結果を得ています。

<ResourceLink name="url/LOGIN_MODULE_CONFIGURATION_SERVICE" 
    global="url/LOGIN_MODULE_CONFIGURATION_SERVICE" type="java.net.URL" /> 

例外は

javax.naming.NameNotFoundException: Name [url/LOGIN_MODULE_CONFIGURATION_SERVICE] is not bound in this Context. Unable to find [url]. 
at org.apache.naming.NamingContext.lookup(NamingContext.java:816) 
at org.apache.naming.NamingContext.lookup(NamingContext.java:173) 
at org.apache.naming.SelectorContext.lookup(SelectorContext.java:163) 
at javax.naming.InitialContext.lookup(InitialContext.java:417) 
at com.mycompany.common.supplement.web.WebHelper.getUrl(WebHelper.java:739) 

私はこの1つに数日費やしていると私はこの作業を取得するために必要なものの構成を考え出す問題を抱えています。私は最大のハードルは、私がリソースにアクセスしようとするJavaコードを変更できないことだと思います。

答えて

0

私はそれを動作させました。名前がどこにも参照されていないので、ResourceLinkがどのように動作しているかはわかりません。しかし、もし何かが違うなら、それはうまくいかないでしょう。基本的に私はこれを呼び出すコードを更新することができないので、java:/comp/env/をリソース名の先頭に追加する必要がありました。

リソースをTomcatサーバーに更新しました。

propertyserviceurl=java:/comp/env/url/LOGIN_MODULE_CONFIGURATION_SERVICE 
にプロパティファイルのエントリを更新しました
<ResourceLink name="url/LOGIN_MODULE_CONFIGURATION_SERVICE" 
    global="java:/comp/env/url/LOGIN_MODULE_CONFIGURATION_SERVICE" type="java.net.URL" /> 

にトムキャットのcontext.xmlにリソースリンクを更新しました

<Resource name="java:/comp/env/url/LOGIN_MODULE_CONFIGURATION_SERVICE" auth="Container" 
    type="java.net.URL" factory="com.mycompany.objectfactory.JndiUrlObjectFactory" 
    url="AValidUrl" /> 

へのXML

関連する問題