[keycloak-user] ClassNotFoundException: Custom UserStorageProvider

Marek Posolda mposolda at redhat.com
Thu Mar 2 05:02:36 EST 2017


Hi,

it seems that it is Hibernate, which is not able to find your classes. I 
guess that you are trying to configure JDBC URL, user and password 
directly in persistence.xml and that's maybe an issue.

I suggest to rather configure the datasource in standalone.xml and then 
use the property "jta-data-source" in your persistence.xml pointing to 
that. Besides classloading issues, another advantage is, that you will 
automatically have connection-pooling, connection liveness checks 
(optional) etc. See our example "providers/user-storage-jpa" for 
inspiration, which is doing the same.

Marek

On 02/03/17 10:42, Danny Trunk wrote:
> Hello,
>
> I've implemented a custom User Storage Provider to connect to a
> configurable (external) database through Hibernate/JDBC:
>
> public class MyUserStorageProviderFactory implements
> UserStorageProviderFactory<MyUserStorageProvider> {
>       // ...
>       public MyUserStorageProvider create(KeycloakSession session,
> ComponentModel model) {
>           logger.info(">>>>>> Creating factory");
>           PersistenceConfig config = new
> PersistenceConfig(model.getConfig());
>           entityManagerFactory = new
> HibernatePersistenceProvider().createContainerEntityManagerFactory(getPersistenceUnitInfo(),
> config.asProperties());
>           entityManager = entityManagerFactory.createEntityManager();
>           return new MyUserStorageProvider(entityManager, session, model);
>       }
>       // ...
> }
>
> In src/main/resources/META-INF I've placed a file named
> jboss-deployment-structure.xml:
> <?xml version="1.0" ?>
> <jboss-deployment-structure>
>       <deployment>
>           <dependencies>
>               <module name="org.hibernate" />
>               <module name="org.jboss.logging" />
>               <module name="org.keycloak.keycloak-core" />
>               <module name="org.keycloak.keycloak-server-spi" />
>               <module name="org.postgresql" />
>           </dependencies>
>       </deployment>
> </jboss-deployment-structure>
>
> Although there's a dependency for org.postgresql I'm getting a
> ClassNotFoundException when trying to authenticate:
> WARN  [org.keycloak.services] (default task-6) KC-SERVICES0013: Failed
> authentication: org.hibernate.service.spi.ServiceException: Unable to
> create requested service [org.hibernate.engine.jdbc.env.spi.JdbcEnvironment]
>           ...
> Caused by:
> org.hibernate.boot.registry.classloading.spi.ClassLoadingException:
> Unable to load class [org.postgresql.Driver]
>           ...
> Caused by: java.lang.ClassNotFoundException: Could not load requested
> class : org.postgresql.Driver
>
> PostgreSQL is deployed as module as described here:
> https://keycloak.gitbooks.io/server-installation-and-configuration/content/topics/database/jdbc.html
> _______________________________________________
> keycloak-user mailing list
> keycloak-user at lists.jboss.org
> https://lists.jboss.org/mailman/listinfo/keycloak-user




More information about the keycloak-user mailing list