users@glassfish.java.net

JNDI from a service bundle

From: Eduardo Solis <eleduardo.solis_at_gmail.com>
Date: Fri, 29 Apr 2011 13:21:40 -0500

Hi there!

Got a question. I am trying to create an osgi service (using declarative
services). what I want this service to do is to provide the JNDI lookup for
the datasource and hand-out connections to other bundles and to other J2EE
clients (servlet). I created the skeleton of the service and its service
declaration and things work fine.

public interface IConnectionGetter {

public Connection getConnection();
}


public class ConnectionGetterImpl implements IConnectionGetter {
private static final String MYCLASS = ConnectionGetterImpl.class.getName();
 private static Logger logger = Logger.getLogger(MYCLASS);

/*
 * (non-Javadoc)
 *
 * @see com.acs.connector.IConnectionGetter#getConnection()
 */
@Override
public Connection getConnection() {
 String method = "getConnection";
logger.entering(MYCLASS, method);
 Connection conn = null;
logger.exiting(MYCLASS, method);
return conn;
 }
}

This works fine, I can see the service in the registry and the servlet can
get to it (using @Resource to get it). Now, when I actually code the JNDI
lookup

public class ConnectionGetterImpl implements IConnectionGetter {
private static final String MYCLASS = ConnectionGetterImpl.class.getName();
 private static Logger logger = Logger.getLogger(MYCLASS);

/*
 * (non-Javadoc)
 *
 * @see com.acs.connector.IConnectionGetter#getConnection()
 */
@Override
public Connection getConnection() {
 String method = "getConnection";
logger.entering(MYCLASS, method);
 Connection conn = null;
try {
InitialContext context = new InitialContext();
 DataSource src = (DataSource) context.lookup("jdbc/testConnection");
conn = src.getConnection();
 } catch (NamingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
 } catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
 }
logger.exiting(MYCLASS, method);
return conn;
 }
}


As soon as I add the InitialContext I get this when I deploy the bundle
(autodeploy/bundles)

[#|2011-04-29T12:02:40.509-0500|SEVERE|glassfish3.1|javax.enterprise.system.std.com.sun.enterprise.server.logging|_ThreadID=96;_ThreadName=Thread-1;|java.lang.NullPointerException
at
com.sun.hk2.component.ExistingSingletonInhabitant.<init>(ExistingSingletonInhabitant.java:57)
 at
org.jvnet.hk2.osgiadapter.HK2Main$HK2ServiceTrackerCustomizer.addingService(HK2Main.java:273)
at
org.osgi.util.tracker.ServiceTracker$Tracked.customizerAdding(ServiceTracker.java:896)
 at
org.osgi.util.tracker.AbstractTracked.trackAdding(AbstractTracked.java:261)
at org.osgi.util.tracker.AbstractTracked.track(AbstractTracked.java:233)
 at
org.osgi.util.tracker.ServiceTracker$Tracked.serviceChanged(ServiceTracker.java:840)
at
org.apache.felix.framework.util.EventDispatcher.invokeServiceListenerCallback(EventDispatcher.java:871)
 at
org.apache.felix.framework.util.EventDispatcher.fireEventImmediately(EventDispatcher.java:733)
at
org.apache.felix.framework.util.EventDispatcher.fireServiceEvent(EventDispatcher.java:662)
 at org.apache.felix.framework.Felix.fireServiceEvent(Felix.java:3769)
at org.apache.felix.framework.Felix.access$000(Felix.java:80)
 at org.apache.felix.framework.Felix$2.serviceChanged(Felix.java:722)
at
org.apache.felix.framework.ServiceRegistry.registerService(ServiceRegistry.java:107)
 at org.apache.felix.framework.Felix.registerService(Felix.java:2854)
at
org.apache.felix.framework.BundleContextImpl.registerService(BundleContextImpl.java:251)
 at
org.apache.felix.scr.impl.manager.AbstractComponentManager.registerService(AbstractComponentManager.java:408)
at
org.apache.felix.scr.impl.manager.AbstractComponentManager.registerComponentService(AbstractComponentManager.java:419)
 at
org.apache.felix.scr.impl.manager.AbstractComponentManager$Unsatisfied.activate(AbstractComponentManager.java:1003)
at
org.apache.felix.scr.impl.manager.AbstractComponentManager.activateInternal(AbstractComponentManager.java:298)
 at
org.apache.felix.scr.impl.manager.AbstractComponentManager$1.doRun(AbstractComponentManager.java:138)
at
org.apache.felix.scr.impl.ComponentActivatorTask.run(ComponentActivatorTask.java:67)
 at
org.apache.felix.scr.impl.ComponentActorThread.run(ComponentActorThread.java:96)
at java.lang.Thread.run(Thread.java:662)
|#]


I found an example from Sahoo where he was doing the same lookup from an
activator only his was a wab rather than just a simple bundle.

Has anyone done this or is there an article somewhere on how to do this?

Thanks!

Eduardo Solis.