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

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.

[code]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() {
}

}
[/code]
A iniciação da minha EM

[code]package br.com.locadora.util;

import javax.persistence.EntityManager;

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

// 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);
	}
}

}
[/code]

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

[code]<?xml version="1.0" encoding="UTF-8"?>

	<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"/>
	</properties>

</persistence-unit>
[/code] que chama meu context.xml [code]<?xml version="1.0" encoding="UTF-8"?> [/code] 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.

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 ?

[quote=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 ?
[/quote]
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.

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/