下面的代码中的第二个JNDI查找失败,但作为一个独立的应用程序针对Glassfish(已配置为通过JNDI公开QueueConnectionFactoryDataSource)运行时发生异常。但是,当删除行jndiContext.close()时,代码可以正常工作。

在实际的代码中,对close()的调用是由Spring在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);
    }
}

最佳答案

您的JNDI实现可能仅支持InitialContext对象的单个静态实现。您可以使用sun中的文档来确定如何找出JNDI上下文工厂的实际具体类型是什么,然后找到详细说明close的作用的实现文档。

关于java - 为什么在InitialContext上调用close()会中断所有以后的查找(Glassfish)的JNDI?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1345623/

10-12 04:15