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コードを変更できないことだと思います。