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.
- 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.