Usar o plugin do vraptor-hibernate com Hibernate 5.2

82 views
Skip to first unread message

Edi Linux

unread,
Mar 16, 2018, 2:37:24 PM3/16/18
to caelum-vraptor
Olá pessoal,

Queria saber se é possível utilizar o plugin vraptor-hibernate com o Hibernate 5.2.
Fazendo uns testes vi que as coisas mudaram...

Ao tentar injetar uma session no meu construtor tenho o retorno.
br.com.caelum.vraptor.InterceptionException: java.lang.ClassCastException: org.hibernate.service.ServiceRegistry$833358108$Proxy$_$$_WeldClientProxy cannot be cast to org.hibernate.boot.registry.StandardServiceRegistry

Rodrigo Turini

unread,
Mar 17, 2018, 9:05:58 AM3/17/18
to caelum-...@googlegroups.com
oi Edi

consegue fazer um mvn dependency:tree e enviar a saída por aqui? 

--
Você recebeu essa mensagem porque está inscrito no grupo "caelum-vraptor" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para caelum-vrapto...@googlegroups.com.
Para postar nesse grupo, envie um e-mail para caelum-...@googlegroups.com.
Acesse esse grupo em https://groups.google.com/group/caelum-vraptor.
Para mais opções, acesse https://groups.google.com/d/optout.

Edi Linux

unread,
Mar 17, 2018, 2:41:21 PM3/17/18
to caelum-vraptor
Olá Rodrigo,

Consigo sim!
Porém gostaria de acrescentar algumas coisas.

1 - O plugin: 
<dependency>
    <groupId>br.com.caelum.vraptor</groupId>
    <artifactId>vraptor-hibernate</artifactId>
    <version>4.1.0</version>
</dependency>

Precisa de uma nova versão especifica para hibernate 5, pq maneira de criar uma SessionFactory mudou.

protected void setUp() throws Exception {
       
// A SessionFactory is set up once for an application!
       
final StandardServiceRegistry registry = new StandardServiceRegistryBuilder()
                       
.configure() // configures settings from hibernate.cfg.xml
                       
.build();
       
try {
                sessionFactory
= new MetadataSources( registry ).buildMetadata().buildSessionFactory();
       
}
       
catch (Exception e) {
               
// The registry would be destroyed by the SessionFactory, but we had trouble building the SessionFactory
               
// so destroy it manually.
               
StandardServiceRegistryBuilder.destroy( registry );
       
}
}

O que eu fiz até agora:

Crei uma classe de teste com o código da documentação do HB e tentei criar uma Instancia de SessionFactory (Não utilizei CDI apenas dei new em tudo o que precisava...)
Resultado: Consegui criar uma instancia de SessionFactory e de Session e até fiz um 'SELECT 1' pra testar e está ok.

Dai então:
Dei um git clone no plugin subi ele pra dentro do projeto que estou testando
Criei um @Producer @ApplicationScoped para a classe org.hibernate.boot.Metadata

Só que agora me deparo com um problema de CDI alias talvez seja problema com o weld...
Ele não consegue injetar um org.hibernate.service.ServiceRegistry quando ele vai construir o objeto MetadataBuilder
Veja o erro:
org.hibernate.HibernateException: Unexpected type of ServiceRegistry [org.hibernate.service.ServiceRegistry$2103965144$Proxy$_$$_WeldClientProxy] encountered in attempt to build MetadataBuilder

O que eu já fiz até agora pra tentar contornar:
- Troquei a dependência da CDI 1.1 pra 1.2
R: mesmo erro.

- Troquei a dependência do Weld da versão 2.1.2 até a versão 2.4.6 (fui testando todas até chegar na 2.4.6)
R: mesmo erro.

- Removi o Weld e tentei rodar o projeto em um container JEE (wildfly 10.1.0) nesse caso tive que trocar o hibernate-validation-cdi por hibernate-validation
e dar um exclude na dependência jboss-logging
R: mesmo erro.

Estou agora pretendendo testar outra implementação da CDI o OpenWebBeans da apache...

em relação ao pom, agora eu tenho dois 1 para JEE e outro para Web Container qual deles vc quer ver?

Edi Linux

unread,
Mar 17, 2018, 4:03:45 PM3/17/18
to caelum-vraptor
OpenWebBeans não funciona com VRaptor 4 + Tomcat 8...

Rodrigo Turini

unread,
Mar 18, 2018, 10:45:12 AM3/18/18
to caelum-...@googlegroups.com
oi Edi

como solução rápida, você não consegue apenas sobrescrever o factory creator do plugin usando a forma nova do hibernate 5 em seu projeto? Esse link da documentação te dá uma ideia de como sobrescrever comportamentos e usar o @specializes pra customizacoes;


abracos

--

Edi Linux

unread,
Mar 18, 2018, 11:08:37 AM3/18/18
to caelum-vraptor
Então Rodrigo,

Eu escrevi um texto longo talvez você não tenha me entendido...
Eu fiz um clone do plugin e modifiquei o código para que ficasse do jeito que está na documentação do HB 5.
Eu não sobreescrevi o plugin mas acredito que o efeito é o mesmo...

Porém o weld não está conseguindo criar o objeto Metadata...
Pra criar um Objeto Metadata eu preciso de um ServiceRegistry
private static final Logger LOGGER = LoggerFactory.getLogger(ServiceRegistryCreator.class);
private Configuration cfg;

/**
* @deprecated CDI eyes only
*/
public ServiceRegistryCreator() {
}

@Inject
public ServiceRegistryCreator(Configuration cfg) {
this.cfg = cfg;
}

@Produces
@ApplicationScoped
public ServiceRegistry getInstance() {
LOGGER.debug("creating a service registry");
return new StandardServiceRegistryBuilder().applySettings(cfg.getProperties()).build();
}

public void destroy(@Disposes ServiceRegistry serviceRegistry) {
LOGGER.debug("destroying service registry");
StandardServiceRegistryBuilder.destroy(serviceRegistry);
}

E o código pra criar um Objeto Metadata:
private static final Logger LOGGER = LoggerFactory.getLogger(MetadataCreator.class);  
private ServiceRegistry serviceRegistry;
private static Metadata metadata;

/**
* @deprecated CDI eyes only
*/
protected MetadataCreator() {
this(null);
}

@Inject
public MetadataCreator(ServiceRegistry serviceRegistry) {
this.serviceRegistry = serviceRegistry;
MetadataCreator.metadata = new MetadataSources(this.serviceRegistry).buildMetadata();
}
@Produces
@ApplicationScoped
public Metadata getInstance() {
LOGGER.debug("creating a metadata object");
return new MetadataSources(this.serviceRegistry).buildMetadata();
}
public static Metadata getInstanceStatic() {
return MetadataCreator.metadata;
}

Quando o Weld tenta dar new MetadataSources(this.serviceRegistry).buildMetadata();
O hibernate lança uma exception:
org.hibernate.HibernateException: Unexpected type of ServiceRegistry [org.hibernate.service.ServiceRegistry$2103965144$Proxy$_$$_WeldClientProxy] encountered in attempt to build MetadataBuilder

Será que usando CDI 2.0 eu consigo contornar isso?

Edi Linux

unread,
Mar 19, 2018, 7:38:40 AM3/19/18
to caelum-vraptor
Segue meu mvn tree

[INFO] br.com.teste.myapp:MyApp:war:0.0.1-SNAPSHOT
[INFO] +- javax.servlet:javax.servlet-api:jar:3.1.0:provided
[INFO] +- javax.enterprise:cdi-api:jar:1.2:compile
[INFO] |  +- javax.interceptor:javax.interceptor-api:jar:1.2:compile
[INFO] |  \- javax.inject:javax.inject:jar:1:compile
[INFO] +- org.jboss.weld.servlet:weld-servlet-core:jar:2.4.6.Final:compile
[INFO] |  +- org.jboss.weld.environment:weld-environment-common:jar:2.4.6.Final:compile
[INFO] |  +- org.jboss.weld:weld-spi:jar:2.4.SP2:compile
[INFO] |  +- org.jboss.weld.probe:weld-probe-core:jar:2.4.6.Final:compile
[INFO] |  +- org.jboss.weld:weld-core-jsf:jar:2.4.6.Final:compile
[INFO] |  +- org.jboss.spec.javax.el:jboss-el-api_3.0_spec:jar:1.0.0.Alpha1:compile
[INFO] |  +- org.jboss.logging:jboss-logging:jar:3.2.1.Final:compile
[INFO] |  \- org.jboss.classfilewriter:jboss-classfilewriter:jar:1.2.1.Final:compile
[INFO] +- org.jboss.weld:weld-core-impl:jar:2.4.6.Final:compile
[INFO] |  +- org.jboss.weld:weld-api:jar:2.4.SP2:compile
[INFO] |  +- org.jboss.spec.javax.annotation:jboss-annotations-api_1.2_spec:jar:1.0.0.Final:compile
[INFO] |  \- org.jboss.spec.javax.interceptor:jboss-interceptors-api_1.2_spec:jar:1.0.0.Final:compile
[INFO] +- br.com.caelum:vraptor:jar:4.2.0-RC5:compile
[INFO] |  +- br.com.caelum:iogi:jar:1.0.1:compile
[INFO] |  +- net.vidageek:mirror:jar:1.6.1:compile
[INFO] |  +- com.thoughtworks.paranamer:paranamer:jar:2.7:compile
[INFO] |  +- com.thoughtworks.xstream:xstream:jar:1.4.7:compile
[INFO] |  |  +- xmlpull:xmlpull:jar:1.1.3.1:compile
[INFO] |  |  \- xpp3:xpp3_min:jar:1.1.4c:compile
[INFO] |  +- javax.annotation:javax.annotation-api:jar:1.2:compile
[INFO] |  \- javax.ejb:javax.ejb-api:jar:3.2:compile
[INFO] |     \- javax.transaction:javax.transaction-api:jar:1.2:compile
[INFO] +- br.com.caelum.vraptor:vraptor-jpa:jar:4.0.5:compile
[INFO] +- javax.servlet:jstl:jar:1.2:compile
[INFO] +- org.hibernate.validator:hibernate-validator-cdi:jar:6.0.8.Final:compile
[INFO] |  \- org.hibernate.validator:hibernate-validator:jar:6.0.8.Final:compile
[INFO] |     \- com.fasterxml:classmate:jar:1.3.4:compile
[INFO] +- javax.validation:validation-api:jar:2.0.1.Final:compile
[INFO] +- br.com.caelum.vraptor:vraptor-simple-validator:jar:4.1.0-RC3:compile
[INFO] +- com.google.guava:guava:jar:15.0:compile
[INFO] +- br.com.caelum.vraptor:vraptor-java8:jar:4.0.0.Final:compile
[INFO] +- javax.servlet.jsp:jsp-api:jar:2.2:provided
[INFO] +- javax.el:javax.el-api:jar:3.0.0:provided
[INFO] +- org.javassist:javassist:jar:3.22.0-GA:compile
[INFO] +- org.slf4j:slf4j-api:jar:1.7.25:compile
[INFO] +- org.slf4j:slf4j-log4j12:jar:1.7.5:compile
[INFO] |  \- log4j:log4j:jar:1.2.17:compile
[INFO] +- com.google.code.gson:gson:jar:2.8.2:compile
[INFO] +- br.com.caelum.vraptor:vraptor-jodatime:jar:4.1.0-RC3:compile
[INFO] |  \- joda-time:joda-time:jar:2.3:compile
[INFO] +- commons-fileupload:commons-fileupload:jar:1.3.3:compile
[INFO] |  \- commons-io:commons-io:jar:2.2:compile
[INFO] +- com.itextpdf:itextpdf:jar:5.5.13:compile
[INFO] +- org.hibernate:hibernate-entitymanager:jar:5.2.15.Final:compile
[INFO] |  +- org.hibernate:hibernate-core:jar:5.2.15.Final:compile
[INFO] |  |  +- antlr:antlr:jar:2.7.7:compile
[INFO] |  |  \- org.jboss:jandex:jar:2.0.3.Final:compile
[INFO] |  +- dom4j:dom4j:jar:1.6.1:compile
[INFO] |  +- org.hibernate.common:hibernate-commons-annotations:jar:5.0.1.Final:compile
[INFO] |  +- org.hibernate.javax.persistence:hibernate-jpa-2.1-api:jar:1.0.0.Final:compile
[INFO] |  +- net.bytebuddy:byte-buddy:jar:1.6.14:compile
[INFO] |  \- org.jboss.spec.javax.transaction:jboss-transaction-api_1.2_spec:jar:1.0.1.Final:compile
[INFO] +- org.hibernate:hibernate-search-orm:jar:5.9.0.Final:compile
[INFO] |  \- org.hibernate:hibernate-search-engine:jar:5.9.0.Final:compile
[INFO] |     +- org.apache.lucene:lucene-core:jar:5.5.5:compile
[INFO] |     +- org.apache.lucene:lucene-misc:jar:5.5.5:compile
[INFO] |     +- org.apache.lucene:lucene-analyzers-common:jar:5.5.5:compile
[INFO] |     +- org.apache.lucene:lucene-facet:jar:5.5.5:compile
[INFO] |     |  \- org.apache.lucene:lucene-queries:jar:5.5.5:compile
[INFO] |     \- org.apache.lucene:lucene-queryparser:jar:5.5.5:compile
[INFO] \- junit:junit:jar:4.12:test
[INFO]    \- org.hamcrest:hamcrest-core:jar:1.3:test
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 47.030 s
[INFO] Finished at: 2018-03-19T08:33:29-03:00


Em sexta-feira, 16 de março de 2018 15:37:24 UTC-3, Edi Linux escreveu:

Edi Linux

unread,
Mar 19, 2018, 9:13:20 AM3/19/18
to caelum-vraptor
Não tem condições de usar, CDI + Hibernate 5.2...

Troquei o CDI para 2.0
Removi o plugin do vraptor-hibernate e deixe o vraptor-jpa, porém os mesmos erros de WeldProxy continuam a aparecer...

@Inject
EntityManager manager

FullTextEntityManager fullTextEntityManager = Search.getFullTextEntityManager(manager);
fullTextEntityManager
.createIndexer().startAndWait();

Eu ganho um:
java
.lang.ClassCastException: org.jboss.weldx.persistence.EntityManager$1250136014$Proxy$_$$_WeldClientProxy cannot be cast to org.hibernate.Session

Ivo Sestren Junior

unread,
Apr 17, 2018, 3:11:34 PM4/17/18
to caelum-...@googlegroups.com
Bom, esta semana focado em melhorias estruturais nos projetos consegui resolver esta pendencia para utilizar o hibernate 5.

A única alteração foi feito na classe SessionFactoryCreator deixando ela da seguinte maneira no produces

@Produces
@ApplicationScoped
public SessionFactory getInstance() {
LOGGER.debug("creating a session factory");
ServiceRegistry sr = CDIProxies.unproxifyIfPossible(serviceRegistry);
return cfg.buildSessionFactory(sr);
}

Fazendo assim o hibernate e o cdi se entenderam, ja que agora entrega a classe real para o hibernate e não mais o proxy do cdi.

--
Você recebeu essa mensagem porque está inscrito no grupo "caelum-vraptor" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para caelum-vraptor+unsubscribe@googlegroups.com.
Para postar nesse grupo, envie um e-mail para caelum-vraptor@googlegroups.com.

Edi Linux

unread,
Apr 18, 2018, 1:48:27 PM4/18/18
to caelum-vraptor
Muito obrigado, vou implementar aqui.

Usei por muito tempo o Vraptor 3 com Spring DI apesar de eu ter percebido boas vantagens de se trabalhar com CDI
a forma antiga era bem mais prática se escrevia menos código...
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para caelum-vrapto...@googlegroups.com.
Para postar nesse grupo, envie um e-mail para caelum-...@googlegroups.com.

Ivo Sestren Junior

unread,
Apr 18, 2018, 8:16:25 PM4/18/18
to caelum-...@googlegroups.com
Acredito que isto poderia até virar um Pull Request, ja que a alteração resolve o problema do hibernate 5, e não atrapalha em nada no hibernate 4

Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para caelum-vraptor+unsubscribe@googlegroups.com.
Para postar nesse grupo, envie um e-mail para caelum-vraptor@googlegroups.com.
Reply all
Reply to author
Forward
0 new messages