Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can I spoof a jndi lookup for a datasource without a app server

I want to test some new functionality which is part of an internal web app. This new code uses a database connection normally provided by an app server (tomcat).

I do not want to recreate the entire web app on my local machine to test the new code, since I only need to run one function.

Does anyone know how I can 'spoof' a Context, or Datasource, to retrieve the database config, without actually creating a web app instance on a server?

like image 586
Wiszh Avatar asked Jun 14 '10 18:06

Wiszh


1 Answers

With the help of Spring SimpleNamingContextBuilder and Apache BasicDataSource, you can do something like this (I usually have this in a static block in test classes that need 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();

The value of jndi_name might look like this: java:comp/env/jdbc/my-db

Once this is set up, code that normally looks up the database connection via JNDI should work. The code above would for example work with this Spring config:

<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
  <property name="jndiName" value="java:comp/env/jdbc/my-db"/>
</bean>
like image 196
Lauri Lehtinen Avatar answered Sep 30 '22 10:09

Lauri Lehtinen