2010-06-14 55 views
7

我想测试作为内部Web应用程序一部分的一些新功能。这个新代码使用通常由应用服务器(tomcat)提供的数据库连接。如何在没有应用程序服务器的情况下欺骗数据源的jndi查找

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

有谁知道我可以'欺骗'上下文,或数据源,检索数据库配置,而不实际上创建一个Web应用程序实例在服务器上?

回答

4

随着春天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> 
+0

这正是我一直在寻找,谢谢。 – Wiszh 2010-06-17 19:00:10

+0

Lauri,'JndiObjectFactoryBean'如何知道在Spring目录中查找'my-db'?你不需要提供上下文环境吗?特别是在这个环境中,你会设置什么值java.naming.factory.initial? – 2011-04-15 21:22:42

+0

Lauri,请参阅我的问题http://stackoverflow.com/questions/5682732/what-value-should-property-java-naming-factory-initial-have-when-using-springs。 – 2011-04-15 21:57:21

0

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

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.

相关问题