我想测试一些内部网络应用程序的新功能。此新代码使用通常由应用程序服务器(tomcat)提供的数据库连接。
我不想在本地计算机上重新创建整个Web应用程序来测试新代码,因为我只需要运行一个函数。
有没有人知道我如何“欺骗”上下文或数据源来检索数据库配置,而无需在服务器上实际创建Web应用程序实例?
答案 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")