[RESOLVIDO] JPA funciona no console mas não na web

12 respostas
A

Tenho um sistema que se conecta via JPA em uma base que funciona tudo bem quando utilizado via console, mas não na web. Já não estou entendendo nada disso o.O, estou utilizando com tomcat 6.0
meu persistence.xml não está errado, senão não me traria resultados no console:
persistence.xml

<persistence 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 persistence_1_0.xsd" version="1.0">
  <persistence-unit name="noticias" transaction-type="RESOURCE_LOCAL">
   <provider>oracle.toplink.essentials.PersistenceProvider</provider>
	<class>modelo.noticias.Categoria</class>
	<class>modelo.noticias.Equipe</class>
	<class>modelo.noticias.Funcionario</class>
	<class>modelo.noticias.Noticia</class>
	<class>modelo.noticias.NoticiaPortal</class>
	<class>modelo.noticias.Portal</class>
	<class>modelo.noticias.Status</class>
	<class>modelo.noticias.Banner</class>
    <properties>
     <property name="toplink.jdbc.driver" value="com.mysql.jdbc.Driver"/>
     <property name="toplink.jdbc.url" value="jdbc:mysql://localhost:3306/noticias"/>
     <property name="toplink.jdbc.user" value="noticias"/>
     <property name="toplink.jdbc.password" value="noticias"/>
   </properties>
  </persistence-unit>
</persistence>

resource/Noticia.java

package br.com.bb.direc.jpa.resources;

import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;

 public class Noticias {
    protected EntityManagerFactory emf;

     public EntityManagerFactory getEMF (){
        emf = Persistence.createEntityManagerFactory("noticias");
        return emf;
    }
}

e eu capturo a conex no meu controle:

EntityManagerFactory emf;
    private EntityManager em;
    Query q;
    Logging log = new Logging("Intranet");

    public Controle(EntityManagerFactory resource){
    	this.emf = resource;
    	em = (EntityManager) emf.createEntityManager();
    }

tudo funciona perfeitamente se eu realizar um teste via console:

static Controle dao = new Controle(new Noticias().getEMF());

	public static void main(String ... args){
		List<Status> lista = dao.getFromNamedQuery("Status.findAll", new ArrayList());
		for (Status u : lista){
    		System.out.print(u.getId() + " - " + u.getNome() + "\n");
    	        }
	}

o resultado disso acima é:
1 - Em edição
2 - Pronto para publicação
3 - Liberada
4 - Cancelada

OK até aqui. Se eu tentar fazer isso em um scriplet:

<%
ListasNoticias ldao = new ListasNoticias();
request.setAttribute("listaStatus", ldao.getListaDeStatus());
%>

chamando este metodo:

static Controle dao = new Controle(new Noticias().getEMF());

	public List<Status> getListaDeStatus(){
		List<Status> lista = dao.getFromNamedQuery("Status.findAll", new ArrayList());
		return lista;
	}

eu ganho esse monstro:

GRAVE: Servlet.service() for servlet jsp threw exception
javax.persistence.PersistenceException: No Persistence provider for EntityManager named noticias
	at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:54)
	at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:32)
	at br.com.bb.direc.jpa.resources.Noticias.getEMF(Noticias.java:10)
	at br.com.bb.direc.controle.noticias.ListasNoticias.<clinit>(ListasNoticias.java:14)
	at org.apache.jsp.APPS.adm.noticias.nova_002dnoticia_jsp._jspService(nova_002dnoticia_jsp.java:68)
	at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
	at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:374)
	at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:342)
	at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:267)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at aldux.autenticacao.filtros.FiltroAutenticacao.doFilter(FiltroAutenticacao.java:58)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:849)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
	at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:454)
	at java.lang.Thread.run(Thread.java:662)
05/10/2011 13:13:51 org.apache.catalina.core.ApplicationDispatcher invoke
GRAVE: Servlet.service() for servlet jsp threw exception
java.lang.NullPointerException
	at org.apache.jsp._500_jsp._jspService(_500_jsp.java:79)
	at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
	at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:374)
	at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:342)
	at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:267)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:646)
	at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:438)
	at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:374)
	at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:302)
	at org.apache.catalina.core.StandardHostValve.custom(StandardHostValve.java:416)
	at org.apache.catalina.core.StandardHostValve.throwable(StandardHostValve.java:271)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:142)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:849)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
	at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:454)
	at java.lang.Thread.run(Thread.java:662)
05/10/2011 13:13:51 org.apache.catalina.core.StandardHostValve custom
GRAVE: Exception Processing ErrorPage[exceptionType=java.lang.Exception, location=/500.jsp]
org.apache.jasper.JasperException: java.lang.NullPointerException
	at org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:522)
	at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:416)
	at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:342)
	at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:267)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:646)
	at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:438)
	at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:374)
	at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:302)
	at org.apache.catalina.core.StandardHostValve.custom(StandardHostValve.java:416)
	at org.apache.catalina.core.StandardHostValve.throwable(StandardHostValve.java:271)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:142)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:849)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
	at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:454)
	at java.lang.Thread.run(Thread.java:662)
Caused by: java.lang.NullPointerException
	at org.apache.jsp._500_jsp._jspService(_500_jsp.java:79)
	at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
	at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:374)
	... 19 more

Alguma sugestão?

12 Respostas

brunorota

em qual pasta está seu persistence.xml?

A

META-INF

brunorota

Já tentou usar uma operação dentro de um Servlet?

A

Tentarei neste instante, guentaí ^^

A

cara,

primeiro vc deve no seu persistence.xml colocar transaction-type= “JTA”, para que vc deixe o conteiner gerencie suas transações.
segundo, vc deve criar uma classe utilitaria para criar seu entitymanagerFactory como singleton, pois é um processo pesado e vc ta fazendo isso toda hora.

o melhor seria vc utilizar EJB ou Spring, por ela iria fazer esse servico para vc.

espero ter te ajudado.

t+

furuta

Esta exception ocorre pois ele não está encontrando seu persistence.xml.

Não adianta usar JTA com Tomcat, pois ele não tem suporte pra JTA. O mesmo vale pro EJB.
Talvez usar Spring só pra isto seja matar mosca com bazuca.

No seu código tem alguns problemas:

  1. Não utilize scriptlet. Se for realmente necessário usar jsp, use expression languages;
  2. Como alguém já disse, vc só precisa de um EntityManagerFactory pra toda a aplicação. Guarde ele em um singleton.

Eu sei que é muita informação, mas Java é assim mesmo, tem que saber muita coisa para fazer um simples CRUD.

Boa sorte!

A

Obrigado pelas respostas gente, mas deixa eu esclarecer alguns pontos para ficar mais fácil. Estou em uma empresa onde a linguagem que tem que se utilizar é o jsp puro, não gosto, prefiro jsf+primefaces+ejb+glassfish, mas como não tenho essa flexibilidade aqui fica difícil. O JPA está funcionando normal, não tenho nenhum erro ao executá-lo no eclipse como classe, o que eu não estou entendendo é porque que não está funcionando na web. Tentei fazer com servlet e não funcionou. Não estou entendendo o porquê desta mensagem. Ta dano até raiva kkkkk

furuta

http://javahowto.blogspot.com/2007/06/where-to-put-persistencexml-in-web-app.html

A

Posicionamento do persistence está fora de questão infelizmente, está tudo certo aqui como eu disse, já rodo a implementação em classe java, só não consigo fazer funcionar na web, isso que ta pegando. Estou procurando implementação de listener de servlet agora, assim tentarei realizar a chamada via servçet com a escuta

maior_abandonado

cara pelo erro que você colocou, também me parece ser pronao ter encontrado o persistence.xml… você disse que colocou ele dentro do diretorio META-INF, e o META-INF ta onde?

A

Descobri a disgrama aqui na empresa, a versão do toplink que eles utilizam estava SUPER ultrapassada -.-, baixei a ultima versão do toplink essentials e funcionou. Sabia que não era código, utilizo já a algum tempo o JPA, mas nunca tinha passado por isso, eu sabia que não tinha nada errado kkkkk.
Vlw a ajuda gente.

furuta

:thumbup:

Criado 5 de outubro de 2011
Ultima resposta 7 de out. de 2011
Respostas 12
Participantes 5