Второй поиск JNDI в приведенном ниже коде неудачно с исключением при запуске в качестве автономного приложения против Glassfish (который был настроен для предоставления QueueConnectionFactory
и DataSource
через JNDI). Однако код отлично работает при удалении строки jndiContext.close()
.Почему вызов close() на InitialContext прерывает JNDI для всех будущих поисков (Glassfish)?
В реальном коде, вызов close()
производится весной в JndiObjectFactoryBean
, поэтому я не могу ее легко удалить.
Это ошибка в Glassfish, или я делаю что-то неправильно (например, неправильная настройка или неправильное кодирование)?
import javax.naming.Context;
import javax.naming.InitialContext;
public class TestInitCtx {
private final static String QUEUE_CONNECTION_FACTORY_JNDI_NAME = "QCF";
private final static String DATA_SOURCE_JNDI_NAME = "DS";
public static void main(String[] args) throws Exception {
Context jndiContext = new InitialContext();
jndiContext.lookup(QUEUE_CONNECTION_FACTORY_JNDI_NAME);
// In Glassfish, this line causes the second lookup
// to throw a com.sun.enterprise.connectors.ConnectorRuntimeException
// (wrapping a NullPointerException)
jndiContext.close();
jndiContext = new InitialContext();
jndiContext.lookup(DATA_SOURCE_JNDI_NAME);
}
}
ОК, но Spring вызывает close() для контекста для меня. Должен ли я отказаться от использования Spring, если мой объект InitialContext является одним из этих статических? –