Easy JavaMagazine - Criando aplicação web mcv + jpa
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
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
Curtidas 0
Respostas
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
att Davi
GOSTEI 0
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:
E a classe de entidade Endereco:
O 2º passo seria criar as classes do controlador do jpa. Abaixo segue a classe PeopleJpaController:
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:
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:
Vou colocar tambem os arquivos de configuração:
persistence.xml
web.xml
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.
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
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
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
01/04/2012
Deu certo ?
Valeu !
Valeu !
GOSTEI 0