Problemas com JPA 2 e Spring 3 no JBoss 5.1 [RESOLVIDO]

5 respostas
C

Boa tarde

Pessoal, nos estamos desenvolvendo um software utilizando JPA 2 (Hibernate 4 como provider) e Spring 3, até o momento esse sistema iria rodar em um conteiner que segue a especificação JEE 6, onde JPA 2 esta incluída, agora há a necessidade desse mesmo software rodar também em um conteiner JEE 5, que no caso será o JBoss 5.1.

Realizei vários testes com todos os frameworks que utilizamos no software, assim seria possível verificar sua compatibilidade com o conteiner mais antigo, VRaptor 3.4, Hibernate 4 e Spring 3, consegui fazer funcionar, bastando apenas trocar alguns JAR’S que no JBoss estavam causando erros de incompatibilidade que são eles SL4J, LOG4J e o XML-APIS.

Para conseguir fazer funcionar a JPA 2 segui alguns tutorias de pessoas que estavam com o mesmo problema, segue os links:

http://java.dzone.com/articles/ejb3-jpa-error-when-migrating
https://community.jboss.org/thread/159628?_sscc=t

Ao realizar o deploy do .war no JBoss 5.1 é gerado a seguinte exception:

WARN  [FileZippedJarVisitor] HHH015010: Unable to find file (ignored): vfszip:/C:/Java/jboss/server/default/deploy/AppJpaSpring.war/WEB-INF/classes/
java.io.FileNotFoundException: C:\Java\jboss\server\default\deploy\AppJpaSpring.war\WEB-INF\classes (O sistema nÒo pode encontrar o caminho especificado)
        at java.util.zip.ZipFile.open(Native Method)
        at java.util.zip.ZipFile.<init>(ZipFile.java:127)
        at java.util.jar.JarFile.<init>(JarFile.java:135)
        at java.util.jar.JarFile.<init>(JarFile.java:72)
        at org.hibernate.ejb.packaging.FileZippedJarVisitor.doProcessElements(FileZippedJarVisitor.java:69)
        at org.hibernate.ejb.packaging.AbstractJarVisitor.getMatchingEntries(AbstractJarVisitor.java:148)
        at org.hibernate.ejb.packaging.NativeScanner.getClassesInJar(NativeScanner.java:126)
        at org.hibernate.ejb.Ejb3Configuration.addScannedEntries(Ejb3Configuration.java:484)
        at org.hibernate.ejb.Ejb3Configuration.scanForClasses(Ejb3Configuration.java:851)
       at org.hibernate.ejb.Ejb3Configuration.configure(Ejb3Configuration.java:596)
       at org.hibernate.ejb.HibernatePersistence.createContainerEntityManagerFactory(HibernatePersistence.java:72)

Mas mesmo com essa exception sendo gerada, a aplicação é iniciada normalmente, mas o EntityManagerFactory não é criado, assim ao solicitar um recurso que realiza uma chamada no banco de dados, outra exception é gerada:

Caused by: java.lang.IllegalArgumentException: org.hibernate.hql.internal.ast.QuerySyntaxException: Operadora is not mapped [ FROM Operadora]
        at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1348)
        at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1289)
        at org.hibernate.ejb.AbstractEntityManagerImpl.createQuery(AbstractEntityManagerImpl.java:288)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:597)
        at org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.java:240)
        at $Proxy907.createQuery(Unknown Source)
        at br.com.crud.dao.OperadoraDAO.todos(OperadoraDAO.java:28)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:597)

Gostaria de saber se alguém sabe oque pode estar causando tais erros, e se no caso do JBoss 5.1 com JPA 2 são necessárias outras configurações ?

Obrigado.

5 Respostas

Hebert_Coelho

O primeiro eu não sei, agora o segundo: Operadora is not mapped

Você mapeou a classe?

C

Boa Tarde

Então, sim a classe esta mapeada certo, o problema é que o Spring não esta conseguindo subir o contexto de persistência por algum motivo, fiz alguns outros testes com JUnit e funcionou normal, e também realizei o deploy do mesmo .war no Tomcat 7 e funcionou normal.

Valeu.

paulo1911

Olá amigo, acredito que n jboss 5 nao vai rolar.

vc usou o Tomcat 7 que tem suporte jee6 web profile no minimo, o que ja é suficiente pra rodar sua app.

Teste com o jboss 6 pra ver se rola, se rolar ai é do suporte mesmo a java ee6.

fica a dica

C

Boa tarde

Então Paulo, realmente estou achando que o problema esteja ligado a incompatibilidade do conteiner com a JPA 2, nos tutoriais que segui e informações que achei na net, uns falam que conseguiram rodar fazendo algumas mudanças em uns arquivos de configuração do JBoss, e outros dizem que a mesma mudança não resolveu o problema, vou fazer um teste no JBoss 6 para ver se nele a aplicação com JPA 2 funciona normal.

Valeu.

C

Boa tarde

Então, consegui fazer a aplicação funcionar no JBoss 5.1, para isso foi necessário algumas mudanças na aplicação e principalmente na parte das libs dos frameworks.

O Hibernate que utilizei foi o 4.1.2, nesse foi necessário a remoção dos jars do log4J e xml-apis, pois estes já estão no JBoss, e caso você os adicione no seu WEB-INF/lib o JBoss lança uma ClassCastException.

No caso do VRaptor, estou utilizando a versão 3.4.1, neste só foi necessário declarar o filtro no web.xml, isso foi necessário porque sem a declaração explicita o contexto não era iniciado.

O Spring utilizado foi o 3.1.1, nesse a configuração é basicamente no applicationContext, porque para a criação do EntityManagerFactory é necessário apontar explicitamente o local do seu persistence.xml, segue o código do applicationContext.xml:

<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
		<property name="dataSource" ref="dataSource" />
		<property name="jpaVendorAdapter">
			<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" />
		</property>
		<property name="persistenceXmlLocation" value="classpath:META-INF/spring-persistence.xml" />
	</bean>
    
	<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager" lazy-init="false">
		<property name="entityManagerFactory" ref="entityManagerFactory" />
	</bean>
		  
	<tx:annotation-driven transaction-manager="transactionManager" />

Para que o Spring possa gerenciar a contexto de persistência foi necessário usar tag persistenceXmlLocation para localizar o persistence.xml, usando a tag persistenceUnitName o Spring não conseguia localizar as entidades e criar o EntityManagerFactory.

Na configuração da JPA 2 a mudança necessária foi com relação a nomenclatura do persistence.xml, no JBoss 5.1 tiver que renomear para um outro nome, no caso modifiquei para spring-persistence.xml, o arquivo ficou da seguinte forma:

<?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="contexto" transaction-type="RESOURCE_LOCAL">
         <class></class>
         <shared-cache-mode>ENABLE_SELECTIVE</shared-cache-mode>
    	 <properties>
		    <property name="hibernate.show_sql" value="false" />
		    <property name="hibernate.format_sql" value="false" />
		    <property name="hibernate.cache.provider_class" value="org.hibernate.cache.ehcache.SingletonEhCacheProvider" />
                    <property name="hibernate.cache.region.factory_class" value="org.hibernate.cache.ehcache.SingletonEhCacheRegionFactory" />
                    <property name="hibernate.cache.use_second_level_cache" value="true" />
                    <property name="hibernate.cache.use_query_cache" value="true" />
                    <property name="hibernate.cache.configuration_file_resource_path" value="/ehcache.xml" />
        </properties>
    </persistence-unit>
</persistence>

Valeu.

Criado 9 de maio de 2012
Ultima resposta 11 de mai. de 2012
Respostas 5
Participantes 3