Java SEコンソールアプリケーションのJNDIを設定しようとしています。新しいInitialContext()の無限再帰
私は、次のコードを持っている:
public class FooMain {
public static void main (String args[]) throws NamingException {
Context context = new InitialContext();
context.bind("foo", "bar");
}
}
&hellipを。私が使用して私のFooMain
クラスを呼び出すと
public class MyContextFactory implements InitialContextFactory {
private static Hashtable store = new Hashtable();
@Override
public Context getInitialContext(Hashtable environment) throws NamingException {
return new InitialContext() {
@Override
public void bind(String name, Object obj) {
store.put(name, obj);
}
@Override
public Object lookup(String name) {
return store.get(name);
}
};
}
}
:
java -Djava.naming.factory.initial=MyContextFactory -cp ... FooMain
を私は無限再帰と最終的なStackOverflowの例外を取得:
Exception in thread "main" java.lang.StackOverflowError
at java.security.AccessController.doPrivileged(Native Method)
at com.sun.naming.internal.VersionHelper12.getContextClassLoader(VersionHelper12.java:185)
at com.sun.naming.internal.ResourceManager.getApplicationResources(ResourceManager.java:549)
at com.sun.naming.internal.ResourceManager.getInitialEnvironment(ResourceManager.java:244)
at javax.naming.InitialContext.init(InitialContext.java:240)
at javax.naming.InitialContext.<init>(InitialContext.java:192)
at MyContextFactory$1.<init>(MyContextFactory.java:20)
at MyContextFactory.getInitialContext(MyContextFactory.java:20)
at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:684)
at javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:313)
at javax.naming.InitialContext.init(InitialContext.java:244)
at javax.naming.InitialContext.<init>(InitialContext.java:192)
at MyContextFactory$1.<init>(MyContextFactory.java:20)
at MyContextFactory.getInitialContext(MyContextFactory.java:20)
at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:684)
at javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:313)
at javax.naming.InitialContext.init(InitialContext.java:244)
at javax.naming.InitialContext.<init>(InitialContext.java:192)
at MyContextFactory$1.<init>(MyContextFactory.java:20)
at MyContextFactory.getInitialContext(MyContextFactory.java:20)
at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:684)
at javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:313)
at javax.naming.InitialContext.init(InitialContext.java:244)
at javax.naming.InitialContext.<init>(InitialContext.java:192)
...
私が作ることができ、コンテキストファクトリは、以下のように定義されますコードは "environment" Hashtableを作成し、そこにMyContextFactory
クラスの名前を置いて( "java.naming.factory.initial"キーの下に)、次にを作成します
Context context = new InitialContext(environment);
しかし、私の質問は:どのように私はこの作品が引数なしのコンストラクタを使用して「-Djava.naming.factory使用してファクトリクラスの名前を供給することができますHashtableの環境を受け取るコンストラクタを使用してJVMの起動時に ".initial"?
これは興味深い質問です。 'InitialContext'は実際にはコンストラクタでカスタムファクトリを探してそれを使うことを知っている' Context'のラッパーです。 JVMを起動する前にファクトリを置き換えると、デフォルトのファクトリは決して使用されないので、再帰が発生します。これを修正する方法はわかりませんが、InitialContextのコードを読み込み、デフォルトが実行されないときの動作をオーバーライドすることになると思われます。 –
提案されている調査方法:匿名の内部クラスを使用できない場合があります。これは、InitialContextの遅延初期化コンストラクタを使用する必要があると思われるためです。 –
はい、そうでした。 –