[keycloak-user] SPI with a third party database. Could not find any META-INF/persistence.xml file in the classpath

Dmitry Telegin dt at acutus.pro
Thu Nov 22 05:55:36 EST 2018


Hello Luis,

The path to persistence.xml you've found in the logs is the default location of persistence.xml for Keycloak's main module (server-war). But it is unused, since Keycloak uses custom persistence.xml location:
https://github.com/keycloak/keycloak/blob/master/model/jpa/src/main/java/org/keycloak/connections/jpa/util/JpaUtils.java#L47

You can use the same method (or at least the same technique) to load yours.

Cheers,
Dmitry Telegin
CTO, Acutus s.r.o.
Keycloak Consulting and Training

Pod lipami street 339/52, 130 00 Prague 3, Czech Republic
+42 (022) 888-30-71
E-mail: info at acutus.pro

On Thu, 2018-11-22 at 11:18 +0100, Luis Rodríguez Fernández wrote:
> Hello there,
> 
> I am using the standalone server distribution [1].
> 
> We need to extend the keycloak server [2] and we need to access a third
> party database to get some data.
> 
> I developed a sample domain extension based on the keycloak example domain
> extension [3]. The deployment of this example one works at the first try,
> thanks!!!
> 
> My sample domain extension access a third party database (mysql), so in
> wildfly...
> 
> - I install the mysql driver
> - I create a datasource
> 
> ... and in my sample I create a META-INF/persistence.xml
> 
> <persistence version>
>     <persistence-unit name="JavaHelps" transaction-type="RESOURCE_LOCAL">
>         <non-jta-data-source>java:/MySqlDS</non-jta-data-source>
> <class>my.entity.Class</class>
> <properties>
>          <property name="hibernate.dialect"
> value="org.hibernate.dialect.MySQLDialect"/>
> </properties>
>     </persistence-unit>
> </persistence>
> 
> I add my sample  $KEYCLOAK_HOME/bin/jboss-cli.sh --command="module add
> --name=...
> 
> And it seems that wildfly likes evrything (from standard output), you can
> see below part of the wildfly output at startup time. However when I run it
> I get:
> 
> Uncaught server error: java.lang.ExceptionInInitializerError.... Caused by:
> javax.persistence.PersistenceException: No Persistence provider for
> EntityManager named JavaHelps
> 
> I found a workaround: having a deeper look at the standard output I saw
> this message...
> 
> parse checking if
> "$KEYCLOAK_HOMEl/modules/system/layers/keycloak/org/keycloak/keycloak-server-subsystem/main/server-war/WEB-INF/classes/META-INF/persistence.xml"
> exists, result = false
> 10:59:55,279 TRACE [org.jboss.as.jpa] (MSC service thread 1-1) parsed
> persistence unit definitions for war server-war
> 
> ... so if I copy my persistence.xml to that location my domain extension
> sample WORKS! My question is WHY???
> 
> Any thoughts on this?
> 
> Thanks in advance,
> 
> Luis
> 
> [1]
> https://downloads.jboss.org/keycloak/4.6.0.Final/keycloak-4.6.0.Final.zip
> [2]
> https://www.keycloak.org/docs/latest/server_development/index.html#_extensions
> [3]
> https://github.com/keycloak/keycloak/tree/master/examples/providers/domain-extension
> 
> 10:59:54,575 INFO  [org.jboss.as.connector.subsystems.datasources]
> (ServerService Thread Pool -- 28) WFLYJCA0005: Deploying non-JDBC-compliant
> driver class com.mysql.jdbc.Driver (version 5.1)
> 
> 10:59:55,071 INFO  [org.jboss.as.connector.subsystems.datasources] (MSC
> service thread 1-8) WFLYJCA0001: Bound data source [java:/MySqlDS]
> 
> 10:59:55,158 TRACE [org.jboss.as.jpa] (MSC service thread 1-7) parse
> checking if
> "/content/domain-extension-example.jar/META-INF/persistence.xml" exists,
> result = true
> 10:59:55,163 TRACE [org.jboss.as.jpa] (MSC service thread 1-7) parse
> persistence.xml: attribute value(0) = JavaHelps
> 10:59:55,163 TRACE [org.jboss.as.jpa] (MSC service thread 1-7) parse
> persistence.xml: attribute value(1) = RESOURCE_LOCAL
> 10:59:55,164 TRACE [org.jboss.as.jpa] (MSC service thread 1-7) parse
> persistence.xml: element=non-jta-data-source
> 10:59:55,164 TRACE [org.jboss.as.jpa] (MSC service thread 1-7) parse
> persistence.xml: element=class
> 10:59:55,164 TRACE [org.jboss.as.jpa] (MSC service thread 1-7) parse
> persistence.xml: element=properties
> 10:59:55,165 TRACE [org.jboss.as.jpa] (MSC service thread 1-7) parse
> persistence.xml: reached ending persistence-unit tag
> 10:59:55,165 INFO  [org.jboss.as.jpa] (MSC service thread 1-7) WFLYJPA0002:
> Read persistence.xml for JavaHelps
> 10:59:55,166 TRACE [org.jboss.as.jpa] (MSC service thread 1-7)
> PersistenceUnitMetadataImpl(version=2.1) [
> name: JavaHelps
> jtaDataSource: null
> nonJtaDataSource: java:/MySqlDS
> transactionType: RESOURCE_LOCAL
> provider: org.hibernate.jpa.HibernatePersistenceProvider
> classes[
> com.javahelps.jpa.Student ]
> packages[
> ]
> mappingFiles[
> ]
> jarFiles[
> ]
> validation-mode: AUTO
> shared-cache-mode: UNSPECIFIED
> properties[
> hibernate.dialect: org.hibernate.dialect.MySQLDialect
> ]]
> 10:59:55,167 TRACE [org.jboss.as.jpa] (MSC service thread 1-7) parsed
> persistence unit definitions for jar domain-extension-example.jar
> 10:59:55,168 TRACE [org.jboss.as.jpa] (MSC service thread 1-7) incrementing
> PU count for domain-extension-example.jar by 1
> 10:59:55,174 DEBUG [org.jboss.as.jpa] (MSC service thread 1-3) added
> javax.persistence.api dependency to domain-extension-example.jar
> 10:59:55,174 DEBUG [org.jboss.as.jpa] (MSC service thread 1-3) added
> org.hibernate.bytecodetransformer dependency to domain-extension-example.jar
> 10:59:55,175 DEBUG [org.jboss.as.jpa] (MSC service thread 1-3) added
> org.jboss.as.jpa dependency to domain-extension-example.jar
> 10:59:55,175 DEBUG [org.jboss.as.jpa] (MSC service thread 1-3) added
> org.jboss.as.jpa.spi dependency to domain-extension-example.jar
> 10:59:55,175 DEBUG [org.jboss.as.jpa] (MSC service thread 1-3) added
> (default provider) org.hibernate dependency to domain-extension-example.jar
> (since 1 PU(s) didn't specify jboss.as.jpa.providerModule)
> 10:59:55,175 DEBUG [org.jboss.as.jpa] (MSC service thread 1-3) added
> org.hibernate dependency to domain-extension-example.jar
> 10:59:55,196 TRACE [org.jboss.as.jpa] (MSC service thread 1-8) install
> persistence unit definition for jar domain-extension-example.jar
> 10:59:55,196 TRACE [org.jboss.as.jpa] (MSC service thread 1-8) adding
> 'vfs:/content/domain-extension-example.jar/' to annotation index map
> 10:59:55,196 TRACE [org.jboss.as.jpa] (MSC service thread 1-8) returning
> global (module) Persistence Provider
> org.hibernate.jpa.HibernatePersistenceProvider
> 10:59:55,199 DEBUG [org.jboss.as.jpa] (MSC service thread 1-8) loaded
> persistence provider adapter
> org.jboss.as.jpa.hibernate5.HibernatePersistenceProviderAdaptor from
> classloader ModuleClassLoader for Module "org.hibernate" version
> 5.3.6.Final from local module loader @400cff1a (finder: local module finder
> @275710fc (roots:
> /media/hdd/keycloak-4.6.0.Final/modules,/media/hdd/keycloak-4.6.0.Final/modules/system/layers/keycloak,/media/hdd/keycloak-4.6.0.Final/modules/system/layers/base))
> 10:59:55,202 TRACE [org.jboss.as.jpa] (MSC service thread 1-8) add second
> level cache dependencies with properties '{caches=entity,
> container=hibernate}'
> 10:59:55,203 TRACE [org.jboss.as.jpa] (MSC service thread 1-8) added
> PersistenceUnitService (phase 1 of 2) for 'service
> jboss.persistenceunit."domain-extension-example.jar#JavaHelps".__FIRST_PHASE__'.
> PU is ready for injector action.
> 10:59:55,204 TRACE [org.jboss.as.jpa] (MSC service thread 1-8) returning
> global (module) Persistence Provider
> org.hibernate.jpa.HibernatePersistenceProvider
> 10:59:55,206 INFO
> [org.keycloak.subsystem.server.extension.KeycloakProviderDeploymentProcessor]
> (MSC service thread 1-4) Deploying Keycloak provider:
> domain-extension-example.jar
> 10:59:55,234 TRACE [org.jboss.as.jpa] (MSC service thread 1-6) install
> persistence unit definition for jar domain-extension-example.jar
> 10:59:55,234 TRACE [org.jboss.as.jpa] (MSC service thread 1-6) adding
> 'vfs:/content/domain-extension-example.jar/' to annotation index map
> 10:59:55,234 TRACE [org.jboss.as.jpa] (MSC service thread 1-6) returning
> global (module) Persistence Provider
> org.hibernate.jpa.HibernatePersistenceProvider
> 10:59:55,235 TRACE [org.jboss.as.jpa] (MSC service thread 1-6) add second
> level cache dependencies with properties '{caches=entity,
> container=hibernate}'
> 10:59:55,235 TRACE [org.jboss.as.jpa] (MSC service thread 1-6) added
> PersistenceUnitService (phase 2 of 2) for 'service
> jboss.persistenceunit."domain-extension-example.jar#JavaHelps"'.  PU is
> ready for injector action.
> 
> 10:59:55,645 INFO  [org.jboss.as.jpa] (ServerService Thread Pool -- 57)
> WFLYJPA0010: Starting Persistence Unit (phase 1 of 2) Service
> 'domain-extension-example.jar#JavaHelps'
> 10:59:55,695 INFO  [org.hibernate.jpa.internal.util.LogHelper]
> (ServerService Thread Pool -- 57) HHH000204: Processing PersistenceUnitInfo
> [
> name: JavaHelps
> ...]
> 
> 10:59:56,038 INFO  [org.jboss.as.jpa] (ServerService Thread Pool -- 57)
> WFLYJPA0010: Starting Persistence Unit (phase 2 of 2) Service
> 'domain-extension-example.jar#JavaHelps'
> 
> 


More information about the keycloak-user mailing list