Conexión a PostgreSQL de la aplicación OSGI desplegada en el contenedor de KaraF
-
26-12-2019 - |
Pregunta
Estoy usando Hibernate para conectarme a PostgreSQL desde un contenedor Karaf 2.3.4, cuando implemento mi paquete hay una excepción que dice javax.naming.amenotfoundException OSGI: Service / Javax.SQL.DataSource / "(Osgi.jndi .Service.name= JDBC / Postgresds).
Aquí está mi archivo Persistance.xml
<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.0">
<persistence-unit name="HibernateOSGi_ContainerManaged"
transaction-type="JTA">
<jta-data-source>osgi:service/javax.sql.DataSource/(osgi.jndi.service.name=jdbc/postgresds)</jta-data-source>
<class>org.hibernate.osgitest.entity.DataPoint</class>
<exclude-unlisted-classes>true</exclude-unlisted-classes>
<properties>
<property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect" />
<property name="hibernate.hbm2ddl.auto" value="create-drop" />
<property name="hibernate.archive.autodetection" value="class" />
<property name="hibernate.show_sql" value="true" />
<property name="hibernate.format_sql" value="true" />
</properties>
</persistence-unit>
</persistence>
Aquí está mi archivo blueprint.xml:
<?xml version="1.0" encoding="UTF-8"?>
<blueprint default-activation="eager"
xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:jpa="http://aries.apache.org/xmlns/jpa/v1.0.0" xmlns:tx="http://aries.apache.org/xmlns/transactions/v1.0.0">
<bean id="dpService" class="org.hibernate.osgitest.DataPointServiceImpl">
<jpa:context unitname="HibernateOSGi_ContainerManaged" property="entityManager" />
<tx:transaction method="*" value="Required" />
</bean>
<service ref="dpService" interface="org.hibernate.osgitest.DataPointService" />
<command-bundle xmlns="http://karaf.apache.org/xmlns/shell/v1.1.0">
<command name="dp/add">
<action class="org.hibernate.osgitest.command.AddCommand">
<property name="dpService" ref="dpService" />
</action>
</command>
<command name="dp/getAll">
<action class="org.hibernate.osgitest.command.GetAllCommand">
<property name="dpService" ref="dpService" />
</action>
</command>
<command name="dp/deleteAll">
<action class="org.hibernate.osgitest.command.DeleteAllCommand">
<property name="dpService" ref="dpService" />
</action>
</command>
</command-bundle>
</blueprint>
y aquí está mi archivo DataSource-Postgres.xml
<?xml version="1.0" encoding="UTF-8"?>
<!--
Install the driver in Karaf. As it is no bundle we use the wrap protocol to create a suitable Manifest on the fly:
> install -s wrap:mvn:postgresql/postgresql/9.1-901.jdbc4
As a last step copy this file to the deploy folder
-->
<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0">
<bean id="dataSource" class="org.postgresql.ds.PGPoolingDataSource" destroy-method="close">
<property name="serverName" value="localhost:5432/postgres" />
<property name="user" value="postgres" />
<property name="password" value="159357123" />
<property name="dataSourceName" value="postgresds" />
</bean>
<service interface="javax.sql.DataSource" ref="dataSource">
<service-properties>
<entry key="osgi.jndi.service.name" value="jdbc/postgresds" />
</service-properties>
</service>
</blueprint>
y aquí está mis características.xml:
<?xml version="1.0" encoding="UTF-8"?>
<features>
<feature name="hibernate-test">
<feature>karaf-framework</feature>
<!-- JTA -->
<config name="org.apache.aries.transaction">
aries.transaction.recoverable = true
aries.transaction.timeout = 600
aries.transaction.howl.logFileDir =
${karaf.data}/txlog
aries.transaction.howl.maxLogFiles = 2
aries.transaction.howl.maxBlocksPerFile = 512
aries.transaction.howl.bufferSizeKBytes = 4
</config>
<bundle start-level="30">mvn:org.apache.geronimo.specs/geronimo-jta_1.1_spec/1.1.1
</bundle>
<bundle start-level="30">mvn:org.apache.aries.transaction/org.apache.aries.transaction.blueprint/1.0.0
</bundle>
<bundle start-level="30">mvn:org.apache.aries.transaction/org.apache.aries.transaction.manager/1.0.1
</bundle>
<!-- JPA -->
<!-- <bundle start-level="30">mvn:org.hibernate.javax.persistence/hibernate-jpa-2.1-api/1.0.0-SNAPSHOT</bundle> -->
<bundle start-level="30">mvn:org.apache.geronimo.specs/geronimo-jpa_2.0_spec/1.1
</bundle>
<bundle start-level="30">mvn:org.apache.aries/org.apache.aries.util/1.0.0
</bundle>
<bundle start-level="30">mvn:org.apache.aries.jpa/org.apache.aries.jpa.api/1.0.0
</bundle>
<bundle start-level="30">mvn:org.apache.aries.jpa/org.apache.aries.jpa.blueprint.aries/1.0.0
</bundle>
<bundle start-level="30">mvn:org.apache.aries.jpa/org.apache.aries.jpa.container/1.0.0
</bundle>
<bundle start-level="30">mvn:org.apache.aries.jpa/org.apache.aries.jpa.container.context/1.0.1
</bundle>
<!-- JNDI -->
<bundle start-level="30">mvn:org.apache.aries.jndi/org.apache.aries.jndi.api/1.0.0
</bundle>
<bundle start-level="30">mvn:org.apache.aries.jndi/org.apache.aries.jndi.core/1.0.0
</bundle>
<bundle start-level="30">mvn:org.apache.aries.jndi/org.apache.aries.jndi.rmi/1.0.0
</bundle>
<bundle start-level="30">mvn:org.apache.aries.jndi/org.apache.aries.jndi.url/1.0.0
</bundle>
<bundle start-level="30">mvn:org.apache.aries.jndi/org.apache.aries.jndi.legacy.support/1.0.0
</bundle>
<feature>jdbc</feature>
<!-- Taken from Karaf-Tutorial -->
<bundle>mvn:org.hibernate.common/com.springsource.org.hibernate.annotations.common/4.1.0.Final</bundle>
<bundle>mvn:commons-collections/commons-collections/3.2.1</bundle>
<bundle>mvn:commons-pool/commons-pool/1.5.4</bundle>
<bundle>mvn:commons-dbcp/commons-dbcp/1.4</bundle>
<bundle>mvn:commons-lang/commons-lang/2.6</bundle>
<bundle>wrap:mvn:net.sourceforge.serp/serp/1.13.1</bundle>
<!-- These do not natively support OSGi, so using 3rd party bundles. -->
<bundle>mvn:org.apache.servicemix.bundles/org.apache.servicemix.bundles.antlr/2.7.7_5
</bundle>
<bundle>mvn:org.jboss.javassist/com.springsource.javassist/3.15.0.GA
</bundle>
<bundle>mvn:org.apache.servicemix.specs/org.apache.servicemix.specs.jsr303-api-1.0.0/2.2.0
</bundle>
<bundle>mvn:org.apache.servicemix.bundles/org.apache.servicemix.bundles.ant/1.8.2_2
</bundle>
<bundle>mvn:org.apache.servicemix.bundles/org.apache.servicemix.bundles.dom4j/1.6.1_5
</bundle>
<bundle>wrap:mvn:postgresql/postgresql/9.1-901.jdbc4</bundle>
<!--<bundle>mvn:mysql/mysql-connector-java/5.1.18</bundle>-->
<bundle>blueprint:file:C:/Users/yahya/Desktop/Examples/Nouveau/HibernateOSGi-master/datasource-postgres.xml
</bundle>
<!-- These do not natively support OSGi, so wrap with BND. -->
<bundle>wrap:mvn:org.jboss/jandex/1.1.0.Alpha1</bundle>
<bundle>wrap:mvn:org.hibernate.common/hibernate-commons-annotations/4.0.1.Final</bundle>
<bundle>mvn:com.fasterxml/classmate/0.5.4</bundle>
<bundle>mvn:org.jboss.logging/jboss-logging/3.1.0.GA</bundle>
<!-- JACC is optional. -->
<!--<bundle>mvn:javax.servlet/javax.servlet-api/3.0.1</bundle> <bundle>mvn:org.jboss.spec.javax.security.jacc/jboss-jacc-api_1.4_spec/1.0.2.Final</bundle> -->
<!-- hibernate-validator is optional. -->
<!--<bundle>wrap:mvn:javax.validation/validation-api/1.0.0.GA</bundle>
<bundle>mvn:org.hibernate/hibernate-validator/4.2.0.Final</bundle> -->
<bundle>mvn:org.hibernate/hibernate-core/4.2.2.Final</bundle>
<bundle>mvn:org.hibernate/hibernate-entitymanager/4.2.2.Final</bundle>
<!-- TODO: It seems that the persistence unit bundle needs to be started
before hibernate-osgi. When the BundleActivator is started, the persistence
unit is provided even though HibernateOSGi_ContainerManaged hasn't completely
started yet. If that happens, you'll get an "illegal bundle state" exception.
Is there a way for the activator to watch for bundles with PUs before registering
the persistence provider? -->
<bundle>mvn:org.hibernate/HibernateOSGi_ContainerManaged/1.0.0
</bundle>
<bundle>mvn:org.hibernate/hibernate-osgi/4.2.2.Final</bundle>
</feature>
</features>
El stacktrace completo es:
javax.naming.amenotfoundException: OSGI: Service / Javax.SQL.DataSource / "(Osgi.jndi.service.name= JDBC / Postgress)" en org.apache.ars.jndi.url.serviceregistryContext.lookup (ServiceRegistryContext.Java :113) [72: org.apache.ars.jndi.url: 1.0.0] en org.apache.ars.jndi.url.serviceregistryContext.lookup (ServiceRegistryContext.Java:144) [72: org.apache.ars.jndi.url: 1.0.0] en org.apache.arios.jndi.delegatecontext.lookup (Delegatecontext.Java:161) [70: org.apache.aries.jndi.core: 1.0.0] en javax.naming.initialcontext.lookup (InicialContext.Java:411) [: 1.7.0_51] en org.apache.aries.jpa.containener.unit.impl.jndidataurce.getds (jndidatasurce.java:65) [67: org.apache.aries.jpa.container: 1.0.0] en org.apache.aries.jpa.container.unit.impl.delayedlookupdatasource.getconnection (retardedlookupdatasource.java:36) [67: org.apache.aries.jpa.container: 1.0.0] en org.hibernate.ejb.connection.inycheddatasourceconnectionprovider.getconnectection (inyecteddatasourceconnectionprovider.java:70) [91: org.hibernate.entitymanager: 4.2.2.final] en org.hibernate.engine.jdbc.internal.jdbcservicesimpl $ ConnectionProviderjdbcConnectionAccess.ObtainConnection (jdbcservicesimpl.java:242) [90: org.hibernate.core: 4.2.2.final] en org.hibernate.engine.jdbc.internal.jdbcservicesimpl.configure (jdbcservicesimpl.java:117) [90: org.hibernate.core: 4.2.2.final] en org.hibernate.service.internal.standardserviceergistryimpl.configureservice (estándareserviceergistryimpl.java:75) [90: org.hibernate.core: 4.2.2.final] en org.hibernate.service.internal.abstractserviceregistryimpl.initializeservice (abstractserviceregistryimpl.java:159) [90: org.hibernate.core: 4.2.2.final] en org.hibernate.service.internal.abstractserviceregistryimpl.getservice (abstractserviceregistryimpl.java:131) [90: org.hibernate.core: 4.2.2.final] en org.hibernate.cfg.configuration.buildTyPeregistrations (Configuration.Java:1797) [90: org.hibernate.core: 4.2.2.final] en org.hibernate.cfg.configuration.buildSessionFactory (Configuration.Java:1755) [90: org.hibernate.core: 4.2.2.final] en org.HiberNate.EJB.EntityManagerFactoryImpl. (EntityManagerFactoryImpl.Java:96) [91: org.HiberNate.EntityManager: 4.2.2.Final] en org.hibernate.ejb.ejb3configuration.buildentitymanagerfactory (ejb3configuration.java:914) [91: org.hibernate.entitymanager: 4.2.2.final] en org.hibernate.osgi.osgipersistenceProvider.createContanerEntityManagerFactory (OsgipersistenceProvider.Java:99) [96: org.hiberNate.OSGI: 4.2.2.final] en org.apache.aries.jpa.container.impl.entitymanagerfactorymanager.creeEntityManagerFactories (EntityManagerFactoryManager.Java:329) [67: org.apache.aries.jpa.container: 1.0.0] en org.apache.aries.jpa.container.impl.entitymanagerfactorymanager.registerEntityManagerFactories (EntityManagerFactoryManager.Java:242) [67: org.apache.aries.jpa.container: 1.0.0] en org.apache.aries.jpa.container.impl.entitymanagerfactorymanager.bundlestatechange (EntityManagerFactoryManager.Java:185) [67: org.apache.aries.jpa.container: 1.0.0] en org.apache.ies.jpa.containener.impl.persistenceBundlemanager.setupManager (PersistenceBundlemanager.Java:394) [67: org.apache.aries.jpa.container: 1.0.0] en org.apache.aries.jpa.containener.impl.persistenceBundlemanager.AdingService (PersistenceBundLemanager.Java:209) [67: org.apache.aries.jpa.container: 1.0.0] en org.osgi.util.tracker.serviceTracker $ seguimiento.Customizeradding (ServiceTracker.Java:932) [Karaf.jar: 2.3.4] en org.osgi.util.tracker.serviceTracker $ seguimiento.Customizeradding (ServiceTracker.Java:1) [Karaf.jar: 2.3.4] en org.osgi.util.tracker.abstractTracked.Trackadding (AbstractTracked.Java:256) [karaf.jar: 2.3.4] en org.osgi.util.tracker.abstracttracked.track (abstracttracked.java:229) [karaf.jar: 2.3.4] en org.osgi.util.tracker.serviceTracker $ seguimiento.servicechanged (ServiceTracker.Java:894) [Karaf.jar: 2.3.4] en org.apache.felix.framework.util.eventdispatcher.invokeservicelistenercallback (eventdispatcher.java:932) [org.apache.felix.framework-4.0.3.jar:] en org.apache.felix.Framework.Util.Eventdispatcher.fireeVentDispatcher.FireEVentImMediate (EventDispatcher.Java:793) [org.apache.felix.framework-4.0.3.jar:] en org.apache.felix.framework.util.eventdispatcher.fireserviceevent (eventdispatcher.java:543) [org.apache.felix.framework-4.0.3.jar:] en org.apache.felix.framework.felix.fireserviceEvent (felix.java:4260) [org.apache.felix.framework-4.0.3.jar:] en org.apache.felix.Framework.felix.Registerservice (Felix.Java:3275) [org.apache
.felix.Framework-4.0.3.jar:] en org.apache.felix.framework.bundlecontextimpl.registerservice (bundlecontextimpl.java:346) [org.apache.felix.framework-4.0.3.jar:] en org.apache.felix.framework.bundlecontextimpl.Registerservice (bundlecontextimpl.java:320) [org.apache.felix.framework-4.0.3.jar:] en org.hibernate.osgi.hiberNateBundleactivator.start (HibernateBundleActivator.Java:80) [96: org.hiberNate.OSGI: 4.2.2.final] en org.apache.felix.framework.util.secureaction.startactivator (Securex.Java:645) [org.apache.felix.framework-4.0.3.jar:] en org.apache.felix.framework.felix.activatebundle (felix.java:1977) [org.apache.felix.framework-4.0.3.jar:] en org.apache.felix.framework.felix.startBundle (Felix.Java:1895) [org.apache.felix.Framework-4.0.3.jar:] en org.apache.felix.framework.bundleimpl.start (bundleimpl.java:944) [org.apache.felix.framework-4.0.3.jar:] en org.apache.felix.framework.bundleimpl.start (bundleimpl.java:931) [org.apache.felix.framework-4.0.3.jar:] en org.apache.karaf.features.internal.featuresserviceimpl.installfeatures (featuresserviceimpl.java:488) [25: org.apache.karaaf.features.core: 2.3.4] en org.apache.karaaf.features.internal.featuresserviceimpl.installfeature (featuresserviceimpl.java:405) [25: org.apache.karaaf.features.core: 2.3.4] en org.apache.karaf.features.internal.featuresserviceimpl.installfeature (featuresserviceimpl.java:401) [25: org.apache.karaf.features.core: 2.3.4] en org.apache.karaf.features.command.installfeatureComand.DoExecute (installfeaturecommand.java:62) [27: org.apache.karaf.features.command: 2.3.4] en org.apache.karaf.features.command.featurescommandsupport.doexecute (característicasCommandsupport.java:41) [27: org.apache.karaaf.features.command: 2.3.4] en org.apache.karaf.shell.console.esgicommandsupport.execute (Osgicommandsupport.java:38) [14: org.apache.karaaf.Shell.Console: 2.3.4] en org.apache.felix.gogo.commands.basic.abstractcommand.execute (abstractcommand.java:35) [14: org.apache.karaf.Shell.Console: 2.3.4] en org.apache.felix.gogo.runtime.commandproxy.execute (commandproxy.java:78) [14: org.apache.karaf.shell.console: 2.3.4] en org.apache.felix.gogo.runtime.clidos.executecmd (Closure.Java:474) [14: org.apache.karaaf.Shell.Console: 2.3.4] en org.apache.felix.gogo.runtime.clidos.executestatement (Closure.Java:400) [14: org.apache.karaf.shell.console: 2.3.4] en org.apache.felix.gogo.runtime.pipe.run (pipe.java:108) [14: org.apache.karaf.shell.console: 2.3.4] en org.apache.felix.gogo.runtime.cliendo.exeCUTE.EXECUTE (CLOURE.JAVA:183) [14: org.apache.karaf.Shell.Console: 2.3.4] en org.apache.felix.gogo.runtime.clidos.execute (Closure.Java:120) [14: org.apache.karaf.Shell.Console: 2.3.4] en org.apache.felix.gogo.runtime.comMandSessionImpl.Execute (CommandSessionImpl.Java:89) [14: org.apache.karaf.shell.console: 2.3.4] en org.apache.karaf.shell.console.jline.console.run (console.java:183) [14: org.apache.karaf.shell.console: 2.3.4] en java.lang.thread.run (hilo.java:744) [: 1.7.0_51]Resolví este problema y actualicé la lista de archivos como dijo M. Cristian, pero el es un otro problema extraño: cuando se reinicia Karaaf y intentando insertar datos a través de la consola de KaraF, la letra de la consola: la no es una transacción activa, por lo que Probé la otra forma utilizando EntityManager y el problema ya no aparece.
Solución
Su código no puede funcionar, ya que la fuente de datos se publica en el mismo contexto de planos donde se usa una unidad de persistencia.
El problema es que el plan esperará un servicio enitityManagerFactory para inyectar.Así que la fuente de datos nunca será publicada.Aries JPA detectará que debería crear una EntityManagerFactory para su paquete, pero el tiempo de espera intentará encontrar el DataSource.
Así que ponga la fuente de datos en un haz de Spearate y debería funcionar.