如何在没有app服务器的情况下欺骗数据源的jndi查找

时间:2010-06-14 18:14:34

标签: java datasource jndi

我想测试一些内部网络应用程序的新功能。此新代码使用通常由应用程序服务器(tomcat)提供的数据库连接。

我不想在本地计算机上重新创建整个Web应用程序来测试新代码,因为我只需要运行一个函数。

有没有人知道我如何“欺骗”上下文或数据源来检索数据库配置,而无需在服务器上实际创建Web应用程序实例?

3 个答案:

答案 0 :(得分:4)

在Spring SimpleNamingContextBuilder和Apache BasicDataSource的帮助下,您可以执行类似的操作(我通常在需要JNDI的测试类中的静态块中使用它):

BasicDataSource dataSource = new BasicDataSource();
dataSource.setDriverClassName(db_driver_name);
dataSource.setUrl(db_connection_url);
dataSource.setUsername(db_username);
dataSource.setPassword(db_password);
SimpleNamingContextBuilder builder = new SimpleNamingContextBuilder();
builder.bind(jndi_name, dataSource);
builder.activate();

jndi_name的值可能如下所示:java:comp/env/jdbc/my-db

设置完成后,通常通过JNDI查找数据库连接的代码应该可以正常工作。例如,上面的代码可以使用这个Spring配置:

<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
  <property name="jndiName" value="java:comp/env/jdbc/my-db"/>
</bean>

答案 1 :(得分:1)

这里列出的解决方案看起来比一年前我提出的那样简单,当时我不得不做同样的事情。我基本上创建了自己非常简单的DataSource实现并将其添加到新的Initial Context。

http://penguindreams.org/blog/running-beans-that-use-application-server-datasources-locally/

答案 2 :(得分:0)

使用TomcatJNDI,您可以访问在Tomcat中配置的每个JNDI资源,就像在Web应用程序中一样。实现它的代码很简单,看起来像

TomcatJNDI tomcatJNDI = new TomcatJNDI();
tomcatJNDI.processContextXml(contextXmlFile);
tomcatJNDI.start();

DataSource ds = (DataSource) InitialContext.doLookup("java:comp/env/path/to/datasource")

Go here to read more about it.