我想测试作为内部Web应用程序一部分的一些新功能。这个新代码使用通常由应用服务器(tomcat)提供的数据库连接。如何在没有应用程序服务器的情况下欺骗数据源的jndi查找
我不想在本地机器上重新创建整个Web应用程序来测试新代码,因为我只需要运行一个函数。
有谁知道我可以'欺骗'上下文,或数据源,检索数据库配置,而不实际上创建一个Web应用程序实例在服务器上?
我想测试作为内部Web应用程序一部分的一些新功能。这个新代码使用通常由应用服务器(tomcat)提供的数据库连接。如何在没有应用程序服务器的情况下欺骗数据源的jndi查找
我不想在本地机器上重新创建整个Web应用程序来测试新代码,因为我只需要运行一个函数。
有谁知道我可以'欺骗'上下文,或数据源,检索数据库配置,而不实际上创建一个Web应用程序实例在服务器上?
随着春天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>
这里列出的解决方案看起来比我想出了大约一年前,当我不得不做同样的事情简单一些。我基本上做了我自己非常简单的DataSource实现并将其添加到新的初始上下文中。
http://penguindreams.org/blog/running-beans-that-use-application-server-datasources-locally/
随着TomcatJNDI你可以访问你在Tomcat配置为使用Web应用程序做的每一个JNDI资源。实现它的代码很简单,看起来像
TomcatJNDI tomcatJNDI = new TomcatJNDI();
tomcatJNDI.processContextXml(contextXmlFile);
tomcatJNDI.start();
DataSource ds = (DataSource) InitialContext.doLookup("java:comp/env/path/to/datasource")
这正是我一直在寻找,谢谢。 – Wiszh 2010-06-17 19:00:10
Lauri,'JndiObjectFactoryBean'如何知道在Spring目录中查找'my-db'?你不需要提供上下文环境吗?特别是在这个环境中,你会设置什么值java.naming.factory.initial? – 2011-04-15 21:22:42
Lauri,请参阅我的问题http://stackoverflow.com/questions/5682732/what-value-should-property-java-naming-factory-initial-have-when-using-springs。 – 2011-04-15 21:57:21