【问题标题】:Can not create initial context in java program无法在 java 程序中创建初始上下文
【发布时间】:2019-02-06 11:10:33
【问题描述】:
public static void setupInitialContext() {
    try {
        System.out.println("Loading Initial Context");
        NamingManager.setInitialContextFactoryBuilder(new InitialContextFactoryBuilder() {

            @Override
            public InitialContextFactory createInitialContextFactory(Hashtable<?, ?> environment)
                    throws NamingException {
                return new InitialContextFactory() {
                    @Override
                    public Context getInitialContext(Hashtable<?, ?> environment) throws NamingException {
                        InitialContext context = null;

                        try {
                            context = new MockLocalContext();
                        } catch (Exception ex) {
                            ex.printStackTrace();
                        }

                        return context;
                    }

                };
            }

        });
        System.out.println("Loaded Initial Context");
    } catch (NamingException ne) {
        ne.printStackTrace();
    }
}

    public static void main(String[] args) throws NamingException {
    setupInitialContext();
    InitialContext context = new InitialContext();
    context.lookup(DS_ORACLE);
}


MockLocalContext 是一个扩展 javax.naming.InitialContext 类的类。 这是创建 InitialContext 对象时的错误。

我得到以下堆栈跟踪:

Exception in thread "main" java.lang.StackOverflowError
at com.sun.naming.internal.VersionHelper12$2.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at com.sun.naming.internal.VersionHelper12.getJndiProperties(Unknown Source)
at com.sun.naming.internal.ResourceManager.getInitialEnvironment(Unknown Source)
at javax.naming.InitialContext.init(Unknown Source)
at javax.naming.InitialContext.<init>(Unknown Source)
at net.citigroup.mexico.pg.pgs.mock.MockLocalContext.<init>(MockLocalContext.java:97)
at net.citigroup.mexico.pg.pgs.mock.MockLocalContext.<init>(MockLocalContext.java:95)
at net.citigroup.mexico.pg.pgs.mock.MockLocalContext$3$1.getInitialContext(MockLocalContext.java:400)
at javax.naming.spi.NamingManager.getInitialContext(Unknown Source)
at javax.naming.InitialContext.getDefaultInitCtx(Unknown Source)
at javax.naming.InitialContext.init(Unknown Source)
at javax.naming.InitialContext.<init>(Unknown Source)
at net.citigroup.mexico.pg.pgs.mock.MockLocalContext.<init>(MockLocalContext.java:97)
at net.citigroup.mexico.pg.pgs.mock.MockLocalContext.<init>(MockLocalContext.java:95)
at net.citigroup.mexico.pg.pgs.mock.MockLocalContext$3$1.getInitialContext(MockLocalContext.java:400)
at javax.naming.spi.NamingManager.getInitialContext(Unknown Source)
at javax.naming.InitialContext.getDefaultInitCtx(Unknown Source)
at javax.naming.InitialContext.init(Unknown Source)
at javax.naming.InitialContext.<init>(Unknown Source)
at net.citigroup.mexico.pg.pgs.mock.MockLocalContext.<init>(MockLocalContext.java:97)
at net.citigroup.mexico.pg.pgs.mock.MockLocalContext.<init>(MockLocalContext.java:95)
at net.citigroup.mexico.pg.pgs.mock.MockLocalContext$3$1.getInitialContext(MockLocalContext.java:400)
at javax.naming.spi.NamingManager.getInitialContext(Unknown Source)
at javax.naming.InitialContext.getDefaultInitCtx(Unknown Source)
at javax.naming.InitialContext.init(Unknown Source)
at javax.naming.InitialContext.<init>(Unknown Source)

内容相同的多行,我只是对其进行了修剪以适应这里。谢谢!

【问题讨论】:

  • 你得到什么错误?
  • 你能显示更多的堆栈跟踪吗?
  • 上述错误。请找出答案。
  • 您的代码中是否有递归调用?
  • 不,当我调用 setupInitialContext() 方法时出现上述错误,

标签: java java-deployment-toolkit noinitialcontextexception


【解决方案1】:
class MyContext extends InitialContext {

private Hashtable store;

public MyContext(Hashtable store) throws NamingException {
    super(true);
    this.store = store;
}

@Override
public void bind(String name, Object obj) {
    store.put(name, obj);
}

@Override
public Object lookup(String name) {
    return store.get(name);
}    

}

public class FooMain {

private static final int    ANSWER    = 42;
private static final String JNDI_NAME = "/config/theAnswerToEverything";

public static void main (String args[]) throws NamingException {
    Context context = new InitialContext();
    putInContext(                    JNDI_NAME, ANSWER);

    int answer = retrieveFromContext(JNDI_NAME);
    Assert.assertEquals(ANSWER, answer);
    System.out.printf("%d\n", answer);
}


private static void putInContext(final String key, final Object value) throws NamingException {
    Context context = new InitialContext();
    context.bind(key, value);
}

private static int retrieveFromContext(final String key) throws NamingException {
    Context context = new InitialContext();
    return (int) context.lookup(key);
}}


public class MyContextFactory implements InitialContextFactory {

private static Hashtable store = new Hashtable();

/*
  Do not confuse [store] with [environment]. They serve different
  purposes.
 */

@Override
public Context getInitialContext(Hashtable environment) throws NamingException {
    return new MyContext(store);
}}

this code is used to remove error while creating an InitialContext the code goes recursively...

在扩展 InitialContext 时构造函数应该为真。

【讨论】:

    【解决方案2】:

    看起来你的 MockLocalContext 启动了一个 InitialContext,它试图获取默认的初始上下文,即 MockLocalContext,它启动 MockLocalContext,它启动一个 InitialContext,依此类推。

    【讨论】:

    • 是的,但是相同的代码在不同的机器上运行并且没有错误。
    • 另一台机器上可能有不同的默认初始上下文。
    • 这怎么可能.. 你能解释一下我应该做什么。
    猜你喜欢
    • 1970-01-01
    • 2013-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-19
    • 2013-03-10
    • 1970-01-01
    相关资源
    最近更新 更多