osgiapache-felixbndtoolsamdatufelix-dependency-manager

Amdatu JPA (bndtools, felix DM) not resolving DataSource service


So I was loosely following the Amdatu JPA video tutorial and I almost got it working...

At a glance everything seems to be fine, only DataSource service is not resolved and I don't know why. It seems to me that it is registered. So how would I go debugging this, there should be some way to debug this, right? When starting I have this in msg log:

[CM Configuration Updater (Update: pid=org.amdatu.jpa.datasourcefactory.dd8bf61e-01b1-4732-9b0c-bba96e1f5aff)] DEBUG org.amdatu.jpa.datasourcefactory - ServiceEvent REGISTERED - [javax.sql.DataSource] - org.amdatu.jpa.datasourcefactory

Output of "dm":

[5] org.amdatu.jpa.datasourcefactory
  org.osgi.service.cm.ManagedServiceFactory(service.pid=org.amdatu.jpa.datasourcefactory) registered
    org.osgi.service.log.LogService service optional available
  javax.sql.DataSource(validationQuery=SELECT 1,name=ManagedDS,driverName=postgresql,serviceName=ManagedDS) registered
    org.osgi.service.log.LogService service optional available
    org.osgi.service.jdbc.DataSourceFactory (osgi.jdbc.driver.class=org.postgresql.Driver) service required available
    javax.transaction.TransactionManager service required available

So the output above should mean that DataSource is registered, right?

[31] org.amdatu.jpa.extender
  org.amdatu.jpa.extender.PersistenceBundleManager() registered
    org.osgi.service.log.LogService service optional available
    javax.persistence.spi.PersistenceProvider service required available
    active (Meta-Persistence=*) bundle optional available
  java.lang.Object(bundle=32) registered
    org.osgi.service.log.LogService service optional available
    org.amdatu.jpa.extender.PersistenceBundleManager service required available
  org.amdatu.jpa.extender.PersistenceUnitInfoImpl@7175ee92 unregistered
    javax.persistence.spi.PersistenceProvider (javax.persistence.provider=org.eclipse.persistence.jpa.PersistenceProvider) service required available
    javax.sql.DataSource (name=ManagedDS) service required unavailable

Everything further that depends on DataSource is obviously not resolved

    javax.persistence.EntityManager service required unavailable

So what I don't get is why is DataSource not resolved there? I checked and it seems it is registered with property name=ManagedDS, but I am quite new to Felix DS so I am not really sure what is happening here.

I also tried adding this

    @ServiceDependency(filter="(name=ManagedDS)")
private volatile DataSource ds;

to one of my services, but that too cannot be resolved. Thanks for any help regarding this, but what I would be most grateful of would be a way to debug and solve this myself.


Solution

  • So, Amdatu video tutorial suggested I should add

    Import-Package: javax.sql;version=1.0.0
    

    to my bundles. I tried removing that and it works (I did that when it stopped resolving that import after I set all versions to small ranges. Still don't know why it did that and wish that I tried that sooner)

    So my guess as to why it works now - packages in my OSGi container were probably using two different versions/instances of javax.sql.DataSource. Probably one from postgres package and other someplace else (system?). Maybe one of the OSGi gurus can comment on this and clear it up?

    Another sub-question is as that video suggested it is a good thing to add that import, what can I do to make it work or if it not important should I just not bother?