Не могу создать начальный контекст в Java-программе - PullRequest
0 голосов
/ 31 августа 2018
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)

Это одна строка для многих строк с одинаковым содержанием, я просто обрезал ее, чтобы уместить здесь. Спасибо!

Ответы [ 2 ]

0 голосов
/ 03 сентября 2018
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...

конструктор должен быть истинным, в то время как Extennds InitialContext.

0 голосов
/ 31 августа 2018

Похоже, что ваш MockLocalContext инициирует InitialContext, который пытается получить начальный контекст по умолчанию, который является MockLocalContext, который инициирует MockLocalContext, который инициирует InitialContext и т. Д., И т. Д.

...