Wildfly + Persistence.xml

Fala galera,

Estou tentando fazer um Provider no keycloak para buscar de um banco de dados de terceiros os usuários para fazer o login no sistema. Primeiramente usei esse código para fazer o deploy:

  https://github.com/keycloak/keycloak/tree/master/examples/providers/user-storage-simple 

Até aí foi tudo tranquilo, tive só que alterar o maven para importar o cara correto que em vez dessa tag:

<parent>
	<artifactId>keycloak-examples-providers-parent</artifactId>
	<groupId>org.keycloak</groupId>
	<version>4.0.0.Beta3-SNAPSHOT</version>
</parent>

Troquei a tag por essa aí em baixo :slight_smile: e funcionou perfeitamente o exemplo

<parent>
	<groupId>org.keycloak</groupId>
	<artifactId>keycloak-parent</artifactId>
	<version>3.4.3.Final</version>
</parent>

O problema que tive foi quando eu tentei colocar o JPA para rodar, ele não encontra o persistence.xml olha o erro:

2018-05-18 13:47:37,675 ERROR [br.com.test.DatabaseUserStorageProviderFactory] (default task-21) Failed to connect to database: javax.persistence.PersistenceException: No Persistence provider for EntityManager named TestUnit
	at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:61)
	at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:39)
	at br.com.test.DatabaseUserStorageProviderFactory.init(DatabaseUserStorageProviderFactory.java:32)
	at br.com.test.DatabaseUserStorageProviderFactory.create(DatabaseUserStorageProviderFactory.java:45)
	at br.com.test.DatabaseUserStorageProviderFactory.create(DatabaseUserStorageProviderFactory.java:13)
	at org.keycloak.storage.UserStorageManager.getStorageProviderInstance(UserStorageManager.java:90)
	at org.key

Como o keycloak usa o wildfly achei vários erros parecidos, falando que o persistence.xml estava em local errado e que o certo é colocar ele em src/main/recources/META-INF/persistence.xml, mas no meu caso ele está no lugar certo.

image

Para tirar a prova se estava funcionando o JPA fiz um caso de teste e ele conseguiu fazer um select em um banco de dados normalmente.

Persistence.xml

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
	<persistence-unit name="TestUnit">
		<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
		<jta-data-source>java:/PostgresDS</jta-data-source>
		<class>br.com.test.User</class>
		<properties>
			<!-- property name="hibernate.archive.autodetection" value="class" /-->
			<!-- Dados da conexão -->
			<!-- property name="javax.persistence.jdbc.driver" value="org.postgresql.Driver" />
			<property name="javax.persistence.jdbc.url" value="jdbc:postgresql://192.213.102.149:5432/test" />
			<property name="javax.persistence.jdbc.user" value="test" />
			<property name="javax.persistence.jdbc.password" value="test" /-->
			
			<!-- Propriedades do hibernate -->
			<property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect" />
			<property name="hibernate.show_sql" value="true" />
			<property name="hibernate.format_sql" value="false" />
			<property name="hibernate.hbm2ddl.auto" value="none" />

		</properties>
	</persistence-unit>
</persistence>

POM.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
		 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
	<parent>
		<groupId>org.keycloak</groupId>
		<artifactId>keycloak-parent</artifactId>
		<version>3.4.3.Final</version>
	</parent>

	<modelVersion>4.0.0</modelVersion>
	<groupId>org.keycloak.examples.userstorage</groupId>
	<artifactId>user-storage-properties-example</artifactId>
	<name>UserStorageProvider Simple Example</name>
	<packaging>jar</packaging>
	
	<dependencies>
		<!-- KEYCLOAK -->
		<dependency>
			<groupId>org.keycloak</groupId>
			<artifactId>keycloak-core</artifactId>
			<scope>provided</scope>
		</dependency>
		<dependency>
			<groupId>org.keycloak</groupId>
			<artifactId>keycloak-server-spi</artifactId>
			<scope>provided</scope>
		</dependency>
		<dependency>
			<groupId>org.jboss.logging</groupId>
			<artifactId>jboss-logging</artifactId>
			<scope>provided</scope>
		</dependency>
		
		<!-- HIBERNATE -->
		<dependency>
			<groupId>org.hibernate</groupId>
			<artifactId>hibernate-core</artifactId>
			<version>5.3.0.Final</version>
			<scope>provided</scope>
		</dependency>
		<dependency>
			<groupId>org.hibernate</groupId>
			<artifactId>hibernate-entitymanager</artifactId>
			<scope>provided</scope>
		</dependency>
		
		<!-- POSTGRESQL -->
		<dependency>
			<groupId>org.postgresql</groupId>
			<artifactId>postgresql</artifactId>
			<version>42.2.2</version>
			<scope>provided</scope>
		</dependency>
		
		<!-- LOG4J -->
		<dependency>
			<groupId>log4j</groupId>
			<artifactId>log4j</artifactId>
			<scope>compile</scope>
		</dependency>
		
		<!-- JUnit -->
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<scope>test</scope>
		</dependency>				
	</dependencies>

	<build>
		<finalName>user-storage-properties-example</finalName>
		<plugins>
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-compiler-plugin</artifactId>
				<configuration>
					<source>1.8</source>
					<target>1.8</target>
				</configuration>
			</plugin>
			<plugin>
				<groupId>org.wildfly.plugins</groupId>
				<artifactId>wildfly-maven-plugin</artifactId>
				<configuration>
					<skip>false</skip>
				</configuration>
			</plugin>
		</plugins>
	</build>
	<profiles>
		<profile>
			<id>product</id>
			<activation>
				<property>
					<name>product</name>
				</property>
			</activation>
			<build>
				<plugins>
					<!-- The example needs to be deployed during the product build, because it's testsuite's dependency.
						 We need to override setting from parent module. -->
					<plugin>
						<groupId>org.apache.maven.plugins</groupId>
						<artifactId>maven-deploy-plugin</artifactId>
						<configuration>
							<skip>false</skip>
						</configuration>
					</plugin>
				</plugins>
			</build>
		</profile>
	</profiles>
</project>

standalone.xml

<datasource jta="true" jndi-name="java:/PostgresDS" pool-name="PostgresDS" enabled="true" use-ccm="false">
	<connection-url>jdbc:postgresql://192.213.102.149:5432/test</connection-url>
	<driver-class>org.postgresql.Driver</driver-class>
	<driver>postgresql-42.2.2.jar</driver>
	<security>
		<user-name>test</user-name>
		<password>test</password>
	</security>
	<validation>
		<valid-connection-checker class-name="org.jboss.jca.adapters.jdbc.extensions.postgres.PostgreSQLValidConnectionChecker"/>
		<background-validation>true</background-validation>
		<exception-sorter class-name="org.jboss.jca.adapters.jdbc.extensions.postgres.PostgreSQLExceptionSorter"/>
	</validation>
</datasource>

Pra chamar a instancia estou fazendo assim:

EntityManagerFactory factory = Persistence.createEntityManagerFactory("TestUnit");
EntityManager manager = factory.createEntityManager();

Mas ele dá o erro na primeira linha

Alguém tem algum palpite?

Galera achei outro exemplo já usando o hibernate com o keycloak e funcionou segue link