下面代码中的第二个JNDI查找失败,当作为针对Glassfish的独立应用程序(已配置为通过JNDI公开QueueConnectionFactory
和DataSource
)运行时出现异常。但是,当删除行jndiContext.close()
时,代码可以正常工作。
在真实代码中,close()
对JndiObjectFactoryBean
的调用是由{{3}}进行的,所以我无法轻易删除它。
这是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);
}
}
答案 0 :(得分:0)
您的JNDI实现可能只支持InitialContext对象的单个静态实现。您可以使用sun处的文档来确定如何找出JNDI上下文工厂的实际具体类型,然后找到详细说明close的功能的实现文档。