2016-02-12 49 views
0

我正在用Java创建桌面应用程序NetBean和我想连接glassfish服务器。这是我的代码来获取数据源:从Java中的glassfish服务器获取jdbc资源

private DataSource getDataSourceFromJNDI(String jndiDataSourceName) { 
    try { 
     Properties p = new Properties(); 
     p.setProperty(Context.INITIAL_CONTEXT_FACTORY, "com.sun.enterprise.naming.SerialInitContextFactory"); 
     p.setProperty(Context.STATE_FACTORIES, "com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl"); 
     p.setProperty(Context.URL_PKG_PREFIXES, "com.sun.enterprise.naming"); 
     InitialContext ic = new InitialContext(p); 
     return (DataSource) ic.lookup(jndiDataSourceName); 
    } catch (NamingException e) { 
     log.error("JNDI error while retrieving " + jndiDataSourceName, e); 
     throw new AuthorizationException(e); 
    } 
} 

我的资源名称是:pooljdnibd。在我的代码设置jdniDataSourceName像不同的方式:

java:comp/env/pooljdnibd 
java:global/pooljdnibd 
java:jdbc/pooljdnibd 
jdbc/pooljdnibd 
pooljdnibd 

和所有给我一个例外:

javax.naming.NoInitialContextException: Cannot instantiate class: com.sun.enterprise.naming.SerialInitContextFactory [Root exception is java.lang.ClassNotFoundException: com.sun.enterprise.naming.SerialInitContextFactory] 
+0

你是什么意思'与玻璃鱼服务器连接?你想从Glassfish获取DataSource?为什么?这段代码只能在EJB容器内工作。 – NeplatnyUdaj

回答

1

这是不可能的访问GlassFish服务器之外的JNDI注册Glassfish的资源通常(适用于任何其他Java EE服务器)。

您可以访问的JNDI中的唯一资源是EJB组件,如果它们具有远程接口的话。另一种选择是通过HTTP协议(任何类型的服务,如SOAP或REST)创建服务,并连接到它。连接到各种服务的技术当然是不同的。

一旦您访问在服务器上运行的EJB或服务,您可以从JNDI中注册的Datasource中检索数据。但是您需要从数据源检索数据,而不是数据源本身。您可以通过在Glassfish内部运行的EJB或服务中发出查询来完成此操作,然后将结果返回到称为服务的桌面应用程序。