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() {
}
}
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.
<?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>
<?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>