Easy JavaMagazine - Criando aplicação web mcv + jpa

Java

01/04/2012

Boa noite,

Estou fazendo o tutorial da ediçao 4 da easy javamagazine. Fiz as classes de entidades e seus controladores conforme o tutotial, Fiz tambem index.jsp e cadastrar.jsp. Quando fui desenvolver o servlet de cadastrar tive problemas ao chamar o PessoaJpaController.create()

new PeopleJpaController(null,null).create(p)

erro: unreported exception br.com.entidades.exceptions.RollbackFailureException; must be caught or declared to be thrown

mesmo quando eu eu crio o construtor padrao e o bloco try-catch continua com problema pois ao executar a aplicação da um erro de exceção do rollback

nao sei o que pode ser
Cesar Alberto

Cesar Alberto

Curtidas 0

Respostas

Davi Costa

Davi Costa

01/04/2012

Posta seus alguns de seus fontes...principalmente o trecho que dá o erro... e cola seu erro inteiro vai ficar mais fácil a comunidade te ajudar

att Davi
GOSTEI 0
Cesar Alberto

Cesar Alberto

01/04/2012

Bom entao vamos lá pelo passo a passo que conforme o tutorial:

1º Criei as classes de entidade. Abaixo segue a classe Pessoa:

package br.com.entidades;

import java.io.Serializable;
import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToOne;

/**
 *
 * @author cesar
 */
@Entity
public class People implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    private String nome;
    @OneToOne(cascade= CascadeType.ALL)
    private Endereco endereco;

    //metodos getters e setters omitidos
    
}



E a classe de entidade Endereco:

package br.com.entidades;

import java.io.Serializable;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

/**
 *
 * @author cesar
 */
@Entity
public class Endereco implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    private String rua;
    private String cidade;
    private String estado;

   // metodos getters e setters omitidos
    
}


O 2º passo seria criar as classes do controlador do jpa. Abaixo segue a classe PeopleJpaController:

package br.com.entidades;

import br.com.entidades.exceptions.NonexistentEntityException;
import br.com.entidades.exceptions.RollbackFailureException;
import java.io.Serializable;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Query;
import javax.persistence.EntityNotFoundException;
import javax.transaction.UserTransaction;

/**
 *
 * @author cesar
 */
public class PeopleJpaController implements Serializable {

    public PeopleJpaController(UserTransaction utx, EntityManagerFactory emf) {
        this.utx = utx;
        this.emf = emf;
    }
    private UserTransaction utx = null;
    private EntityManagerFactory emf = null;

    public EntityManager getEntityManager() {
        return emf.createEntityManager();
    }

    public void create(People people) throws RollbackFailureException, Exception{
        EntityManager em = null;
        try {
            utx.begin();
            em = getEntityManager();
            em.persist(people);
            utx.commit();
        } catch (Exception ex) {
            try {
                utx.rollback();
            } catch (Exception re) {
                throw new RollbackFailureException(An error occurred attempting to roll back the transaction., re);
            }
            throw ex;
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public void edit(People people) throws NonexistentEntityException, RollbackFailureException, Exception {
        EntityManager em = null;
        try {
            utx.begin();
            em = getEntityManager();
            people = em.merge(people);
            utx.commit();
        } catch (Exception ex) {
            try {
                utx.rollback();
            } catch (Exception re) {
                throw new RollbackFailureException(An error occurred attempting to roll back the transaction., re);
            }
            String msg = ex.getLocalizedMessage();
            if (msg == null || msg.length() == 0) {
                Long id = people.getId();
                if (findPeople(id) == null) {
                    throw new NonexistentEntityException(The people with id  + id +  no longer exists.);
                }
            }
            throw ex;
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public void destroy(Long id) throws NonexistentEntityException, RollbackFailureException, Exception {
        EntityManager em = null;
        try {
            utx.begin();
            em = getEntityManager();
            People people;
            try {
                people = em.getReference(People.class, id);
                people.getId();
            } catch (EntityNotFoundException enfe) {
                throw new NonexistentEntityException(The people with id  + id +  no longer exists., enfe);
            }
            em.remove(people);
            utx.commit();
        } catch (Exception ex) {
            try {
                utx.rollback();
            } catch (Exception re) {
                throw new RollbackFailureException(An error occurred attempting to roll back the transaction., re);
            }
            throw ex;
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public List<People> findPeopleEntities() {
        return findPeopleEntities(true, -1, -1);
    }

    public List<People> findPeopleEntities(int maxResults, int firstResult) {
        return findPeopleEntities(false, maxResults, firstResult);
    }

    private List<People> findPeopleEntities(boolean all, int maxResults, int firstResult) {
        EntityManager em = getEntityManager();
        try {
            Query q = em.createQuery(select object(o) from People as o);
            if (!all) {
                q.setMaxResults(maxResults);
                q.setFirstResult(firstResult);
            }
            return q.getResultList();
        } finally {
            em.close();
        }
    }

    public People findPeople(Long id) {
        EntityManager em = getEntityManager();
        try {
            return em.find(People.class, id);
        } finally {
            em.close();
        }
    }

    public int getPeopleCount() {
        EntityManager em = getEntityManager();
        try {
            Query q = em.createQuery(select count(o) from People as o);
            return ((Long) q.getSingleResult()).intValue();
        } finally {
            em.close();
        }
    }
    
}


O 3º passo seria crias a tela de cadastro (cadastrar.jsp) bem básico e o servlet responsável pela camada de controller se entendi bem o padrão MVC. Segue o codido do servlet cadastrarServlet.java no metodo que nos interessa:

@Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        
        String nome = request.getParameter(nome);
        String rua = request.getParameter(rua);
        String cidade = request.getParameter(cidade);
        String estado = request.getParameter(estado);
        
        Endereco end = new Endereco();
        end.setRua(rua);
        end.setCidade(cidade);
        end.setEstado(estado);
        
        People p  = new People();
        p.setNome(nome);
        p.setEndereco(end);
        
        new PeopleJpaController(null,null).create(p);
    }


O problema ocorre exatamente nesta ultima linha do metodo acima. No tutorial aparece sem passagem de parametros. Criei o construtor sem parametros mas mesmo assim informava tratar uma exceção de RollbackFailureException e Exception. Bom, depois de feito isso rodei a aplicação e fui realizar um cadastro.

Segue abaixo o erro criado pelo log:

Grave: The log message is null.
br.com.entidades.exceptions.RollbackFailureException: An error occurred attempting to roll back the transaction.
	at br.com.entidades.PeopleJpaController.create(PeopleJpaController.java:49)
	at br.com.entidades.CadastrarServlet.doPost(CadastrarServlet.java:89)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:754)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:847)
	at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1539)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:281)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
	at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:655)
	at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:595)
	at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:98)
	at com.sun.enterprise.web.PESessionLockingStandardPipeline.invoke(PESessionLockingStandardPipeline.java:91)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:162)
	at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:330)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:231)
	at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:174)
	at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:828)
	at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:725)
	at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:1019)
	at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:225)
	at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:137)
	at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:104)
	at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:90)
	at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:79)
	at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:54)
	at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:59)
	at com.sun.grizzly.ContextTask.run(ContextTask.java:71)
	at com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:532)
	at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:513)
	at java.lang.Thread.run(Thread.java:722)
Caused by: java.lang.NullPointerException
	at br.com.entidades.PeopleJpaController.create(PeopleJpaController.java:47)
	... 28 more



Vou colocar tambem os arquivos de configuração:

persistence.xml
<?xml version=1.0 encoding=UTF-8?>
<persistence version=1.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_1_0.xsd>
  <persistence-unit name=WebApplicationPeoplePU transaction-type=JTA>
    <provider>oracle.toplink.essentials.PersistenceProvider</provider>
    <jta-data-source>jdbc/people</jta-data-source>
    <class>br.com.entidades.Endereco</class>
    <class>br.com.entidades.People</class>
    <exclude-unlisted-classes>true</exclude-unlisted-classes>
    <properties>
      <property name=toplink.ddl-generation value=create-tables/>
    </properties>
  </persistence-unit>
</persistence>


web.xml

<?xml version=1.0 encoding=UTF-8?>
<web-app version=3.0 xmlns=http://java.sun.com/xml/ns/javaee xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance xsi:schemaLocation=http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd>
    <servlet>
        <servlet-name>CadastrarServlet</servlet-name>
        <servlet-class>br.com.entidades.CadastrarServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>CadastrarServlet</servlet-name>
        <url-pattern>/cadastrar.do</url-pattern>
    </servlet-mapping>
    <session-config>
        <session-timeout>
            30
        </session-timeout>
    </session-config>
</web-app>


O que esta errado eu nao consegui enxerguar. Sei que não cria as tabelas no banco e lança essa exceção. Agradeço desde ja a ajuda dos colegas e pela paciencia.
GOSTEI 0
Davi Costa

Davi Costa

01/04/2012

Problema está aqui:

PeopleJpaController.java:47 Null Pointer
Dica, debuga esse linha e descobre qual objeto está nulo, depois é investigar o Porque que ele está nulo.
Olhando assim por cima
Vi que vc usa esse método:

public EntityManager getEntityManager() {
return emf.createEntityManager();
}

só que seu emf só é instanciado aqui nesse construtor:

public PeopleJpaController(UserTransaction utx, EntityManagerFactory emf) {
this.utx = utx;
this.emf = emf;
}

assim tb como seu utx, minha dúvida é, vc usa Spring?
Esse construtor é realmente chamado?

Att Davi
GOSTEI 0
Dyego Carmo

Dyego Carmo

01/04/2012

Deu certo ?

Valeu !
GOSTEI 0
POSTAR