Javax.persistence.TransactionRequiredException

2 respostas
P

Estou programando um WebService (JAX-WS e Glassfish) mas estou recebendo a exceção javax.persistence.TransactionRequiredException. Segue o código

Classe Web Service

package Produto;

import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebService;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

@WebService
public class ProdutoWebService {
    @PersistenceContext
    private EntityManager em;

    @WebMethod
    public void incluir(
            @WebParam(name="produto") Produto produto) {
        try {
            em.persist(produto);
            em.flush();
        }
        catch(Exception exception) {
            System.out.println(exception.toString());
        }
    }
}

persistence.xml

<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence">
    <persistence-unit name="webservice">
        <jta-data-source>jdbc/webserviceResource</jta-data-source>
        <class>Produto.Produto</class>
        <class>Produto.ProdutoWebService</class>
        <properties>
            <property name="eclipselink.ddl-generation" value="drop-and-create-tables"/>
        </properties>
    </persistence-unit>
</persistence>

Por favor, me ajudem. Valeu.

2 Respostas

restarac

Bem de certa forma está correto...

O gerenciador de transações do Server Container EE somente é aplicavel aos EJBs. E como um WebService não é um EJB então ele não realiza a transação para você.

Ou seja, fora de um EJB ele não permite você fazer:
em.getTransaction().begin()
Para ter o poder de transação é necessário injetar um UserTransaction e fazer na mao. Isso tambem ocorre com o JSF ao usar os ManagedBeans.
@Resource
    private UserTransaction transaction;

    public void seuMetodo(){
            transaction.begin();
            //Seu codigo aqui na transação...
            transaction.commit();
    }
nel

proveyourself você pode perfeitamente transformar seu WS em um EJB. O Java EE se tornou muito interessante e com anotações para facilitar sua vida, como o Webservice RESTful.

O colega acima já explicou basicamente, mas me assustei com algo. Você quer injetar seu EntityManager em um WS ? Cara, o que houve com o MVC ? Cadê a divisão de camadas e responsabilidades do sistema ? Isso é não se faz amigo. Repense para não começar a desenvolver errado.

E para finalizar, isso não é dúvida de iniciante, procure postar na área correta do fórum, como JEE.
Abraços.

Criado 10 de fevereiro de 2010
Ultima resposta 15 de ago. de 2012
Respostas 2
Participantes 3