Scopo de transação + web service[RESOLVIDO]

3 respostas
diegohsi

Bom diia pessoal,
estou com um problema durante a persistencia de dados quando consumo um serviço disponibilizado no proprio container (tomcat 7 + cxf2).

O controle da minha transação esta sendo feito por um filtro no web.xml e tenho um objeto ThreadLocalque armazeno meu entity manager.

package br.com.locadora.web.filtro;

import javax.persistence.EntityManager;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

import br.com.locadora.util.EMLocal;

public class FiltroConexao implements Filter {

	public void doFilter(ServletRequest request, ServletResponse response,
			FilterChain chain) throws ServletException {
		
		EntityManager em = EMLocal.getEntityManager();
		
		try {
			em.getTransaction().begin();

			chain.doFilter(request, response);

			em.getTransaction().commit();
		} catch (Throwable ex) {
			try {
				if (em.getTransaction().isActive()) {
					em.getTransaction().rollback();
				}
			} catch (Throwable t) {
				t.printStackTrace();
			}
			throw new ServletException(ex);
		} finally {
			EMLocal.cleanEntityManager();
		}
	}

	public void init(FilterConfig config) throws ServletException {
	}

	public void destroy() {
	}
}
A iniciação da minha EM
package br.com.locadora.util;

import javax.persistence.EntityManager;

public class EMLocal {
	private static ThreadLocal<EntityManager> emLocal = new ThreadLocal<EntityManager>();

	// se ja existir uma EntityManager instanciada para a thread local,
	// retorna-a. Se nao
	// existir ainda, instancia a EntityManager armazenando-a na thread local e
	// a retorna.
	public static synchronized EntityManager getEntityManager() {
		EntityManager em = emLocal.get();
		if (em == null) {
			em = EMF.get().createEntityManager();
			emLocal.set(em);
		}
		return em;
	}

	// Fecha a EntityManager da thread local e define a mesma como null
	public static void cleanEntityManager() {
		EntityManager em = emLocal.get();
		if (em != null) {
			emLocal.get().close();
			emLocal.set(null);
		}
	}
}

Como dizia, quando eu persisto os dados dentro do meu container, ou seja, pelo aplicativo web ele faz normal, quando tento persistir chamndo um serviço do web-service nao o faz.

1. Debuguei, ta chamando o serviço certo, porém quando chega no dao para persistir que o objeto nao esta sendo gerenciado pelo entity manager. Mas não lança a exceção.
Ja tentei remover o filtro e criar uma entitymanager no proprio método mais ainda não persiste.

o arquivo que o entitymanagerfactory chama para ser instanciado é este 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="locadoraScopus" transaction-type="RESOURCE_LOCAL">
		
		<non-jta-data-source>java:/comp/env/jdbc/locadora_ds</non-jta-data-source>
		<class>br.com.locadora.dominio.Ator</class>
		<class>br.com.locadora.dominio.Filme</class>
		<class>br.com.locadora.dominio.Cliente</class>
		<class>br.com.locadora.dominio.Dvd</class>
		<class>br.com.locadora.dominio.Emprestimo</class>
		<class>br.com.locadora.dominio.EmprestimoPK</class>
		<class>br.com.locadora.dominio.Genero</class>
		
		<properties>
			<property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5InnoDBDialect" />
			<property name="hibernate.show_sql" value="true"/>
			<property name="hibernate.hbm2ddl.auto" value="update" />
            <property name="hibernate.show_sql" value="false" />
            <property name="hibernate.format_sql" value="false"/>
<!-- 			<property name="hibernate.hbm2ddl.auto" value="update"/> -->
		</properties>
	
	</persistence-unit>
</persistence>
que chama meu context.xml
<?xml version="1.0" encoding="UTF-8"?>
<Context reloadable="true">
	<Resource name="jdbc/locadora_ds" 
		auth="Container" 
		type="javax.sql.DataSource"
		maxActive="100" 
		maxIdle="30" maxWait="10000" 
		username="root" password="root"
		driverClassName="com.mysql.jdbc.Driver"
		url="jdbc:mysql://localhost:3306/mydb?autoReconnect=true" />
</Context>
Pessoal, consegui resolver o problema sexta feira passada,. COmo eu utilizava um filtro para iniciar e finalizar a transação mapeado no web.xml do tomcat as vezes ao acessar via web service ele não iniciava a transação, não sei mais acho que deve ter algum motivo que eu não saiba, e não que seja uma falha da tecnologia. Então para solucionar o problema eu comecei a testar se a trnsação não estiver iniciada eu inicio. So isso.

3 Respostas

R

Vc criou seu Web Service para persistir os dados assim com sua aplicação web ?

Se sim, seu Web Service tem que usar o mesmo persistence-unit da sua aplicação web…

E outra vc tem que passar para seu web service um xml com as informações do seu objeto e recuperar isso no webservice vc esta fazendo ?

diegohsi

robsonsan:
Vc criou seu Web Service para persistir os dados assim com sua aplicação web ?

Se sim, seu Web Service tem que usar o mesmo persistence-unit da sua aplicação web…

E outra vc tem que passar para seu web service um xml com as informações do seu objeto e recuperar isso no webservice vc esta fazendo ?


Sim, meu persistence.xml consta tambem no meu projeto desktop que acessa o ws, e todos meus tipos complexos (objetos) que trafegam na rede esttão nos 2 lados, porem no lado que consome o serviço eles estaão mapeados para parsear o xml retornado do webservice. Mais so para testar tenho um serviço que retorna void para o consumidor, ou seja, nao retorna nada, e um teste para apenas persistir e nad aocorre e não da erro em nenhum lado.
Não sei oque fazer, a unica solução que tenho em mente é tentar configurar o spring no meu projeto para controlar a transação.

Não sei mais que testes eu poderia fazer.

diegohsi

Pssoal alguem tem uma luz, nao consegui ainda persistir os dados, nao da erro nehum =/

Para quem quiser me ajudar e da uma olhada no meu projeto, estaria muito agradecido.

http://code.google.com/p/locadora-desktop-web-ws/
http://locadora-desktop-web-ws.googlecode.com/svn/trunk/
Criado 24 de janeiro de 2013
Ultima resposta 25 de jan. de 2013
Respostas 3
Participantes 2