Erro de persistencia: java.lang.ExceptionInInitializerError

16 respostas
manolo

Bom dia pessoal!

Sou iniciante na programção com o Java EE, mas estou me esforçando muito para aprender.

Antes de mais nada gostaria de relatar que já pesquisei e tentei resolver meu problema de varias maneiras, mas infelizmente não estou conseguindo sucesso.

Estou realizando um formulario (bem simples) de cadastro de um contato, com as tecnologias Hibernate, JSF 2.0 e uma implementação PrimeFaces.

O problema é que não estou conseguindo persistir meu objeto no banco de forma alguma.

Abaixo segue as classes:

Parte da Visão

<h:head>
        <title>Cadastro de Clientes TCC Ciência da Computação</title>
    </h:head>
    <h:body>
        <h:graphicImage value="/imagens/unifil.gif" style="width: 250px; padding-bottom: 10px "></h:graphicImage>
        <h:form>
            <p:panel header="Cadastrar Novo Contato" style="margin-right: 870px">
                <h:panelGrid columns="2" cellpadding="5" >

                    <h:outputText  value="Nome:"></h:outputText>
                    <p:inputText size="25" value="#{controleCliente.nome}" required="true" requiredMessage="Campo Obrigatório"></p:inputText>

                    <h:outputText value="Endereço:"></h:outputText> 
                    <p:inputText size="25" value="#{controleCliente.endereco}"></p:inputText>

                    <h:outputText value="Tel Residencial:"></h:outputText> 
                    <p:inputText size="25" value="#{controleCliente.telRes}"></p:inputText>

                    <h:outputText value="Tel Celular:"></h:outputText>
                    <p:inputText size="25" value="#{controleCliente.telCel}"></p:inputText>

                    <h:outputText value="E-mail:"></h:outputText>
                    <p:inputText size="25" value="#{controleCliente.eMail}"></p:inputText>

                </h:panelGrid>

                <h:panelGrid columns="2">

                    <p:commandButton value="Gravar" actionListener="#{controleCliente.gravarFormulario}"></p:commandButton>
                    <p:commandButton value="Limpar" type="reset"></p:commandButton>
                </h:panelGrid>

Classe de Controle:

package com.amazonaws.controle;

import com.amazonaws.modelo.Contato;
import com.amazonaws.modelo.ContatoHelper;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;

/**
 *
 * @author Marcia
 */
@ManagedBean
@RequestScoped
public class ControleCliente {

    private String nome;
    private String endereco;
    private String telRes;
    private String telCel;
    private String eMail;

    public String geteMail() {
        return eMail;
    }

    public void seteMail(String eMail) {
        this.eMail = eMail;
    }

    public String getEndereco() {
        return endereco;
    }

    public void setEndereco(String endereco) {
        this.endereco = endereco;
    }

    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    public String getTelCel() {
        return telCel;
    }

    public void setTelCel(String telCel) {
        this.telCel = telCel;
    }

    public String getTelRes() {
        return telRes;
    }

    public void setTelRes(String telRes) {
        this.telRes = telRes;
    }

    public void limparFormulario() {
        this.nome = "";
        this.endereco = "";
        this.telCel = "";
        this.telRes = "";
    }

    public void gravarFormulario() {

        Contato contato = new Contato();
        ContatoHelper grvcontato = new ContatoHelper();

        contato.setNome(nome);
        contato.setEndereco(endereco);
        contato.setTelres(telRes);
        contato.setTelcel(telCel);
        contato.setEmail(eMail);

        grvcontato.gravarContato(contato);

    }
}

Parte do modelo ou persistencia:

package com.amazonaws.modelo;

import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.Transaction;


/**
 *
 * @author Marcia
 */
public class ContatoHelper {

    Session session = null;
    Transaction tx = null;

    public ContatoHelper() {
        this.session = HibernateUtil.getSessionFactory().getCurrentSession();
    }

    public void gravarContato(Contato contato) {

        try {
            
            tx.begin();
            session.save(contato);
            session.flush();
            tx.commit();
            
        } catch (HibernateException ex) {
            ex.printStackTrace();
            
        } finally {
            session.close();
        }
    }
}


Peço desculpa caso seja um erro besta, mas como eu disse ainda sou iniciante na area de desenvolvimento web.

Caso haja a necessidade de postar mais alguma classe não hesite em pedir, pois estou a disposição.

p.s: Esta gerando a exeção java.lang.ExceptionInInitializerError

Muito obrigado pela atenção de todos

16 Respostas

A

Opa, bom dia.

Se possível, coloca o stack completo e o código do HibernateUtil …

[]'s

hugo.hlcxcx

Modifique o seu método gravarContato da seguinte forma:

//Coloque isso no try tx = session.getTransaction(); tx.begin(); session.save(contato); session.flush(); tx.commit();

manolo

Alex.Brito está na mão:

Stack:

27/10/2011 11:26:09 com.sun.faces.context.AjaxExceptionHandlerImpl log
GRAVE: JSF1073: javax.faces.event.AbortProcessingException obtido durante o processamento de INVOKE_APPLICATION 5: UIComponent-ClientId=j_idt8:j_idt22, Message=java.lang.ExceptionInInitializerError
27/10/2011 11:26:09 com.sun.faces.context.AjaxExceptionHandlerImpl log
GRAVE: java.lang.ExceptionInInitializerError
javax.faces.event.AbortProcessingException: java.lang.ExceptionInInitializerError
	at javax.faces.event.MethodExpressionActionListener.processAction(MethodExpressionActionListener.java:182)
	at javax.faces.event.ActionEvent.processListener(ActionEvent.java:88)
	at javax.faces.component.UIComponentBase.broadcast(UIComponentBase.java:769)
	at javax.faces.component.UICommand.broadcast(UICommand.java:300)
	at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:794)
	at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1259)
	at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:81)
	at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
	at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
	at javax.faces.webapp.FacesServlet.service(FacesServlet.java:409)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:304)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:224)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:185)
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:151)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
	at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:929)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:405)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:269)
	at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:515)
	at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:302)
	at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
	at java.lang.Thread.run(Thread.java:662)
Caused by: java.lang.ExceptionInInitializerError
	at com.amazonaws.modelo.HibernateUtil.<clinit>(HibernateUtil.java:27)
	at com.amazonaws.modelo.ContatoHelper.<init>(ContatoHelper.java:22)
	at com.amazonaws.controle.ControleCliente.gravarFormulario(ControleCliente.java:76)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:597)
	at org.apache.el.parser.AstValue.invoke(AstValue.java:262)
	at org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:278)
	at javax.faces.event.MethodExpressionActionListener.processAction(MethodExpressionActionListener.java:153)
	... 25 more
Caused by: org.hibernate.HibernateException: hibernate.cfg.xml not found
	at org.hibernate.util.ConfigHelper.getResourceAsStream(ConfigHelper.java:147)
	at org.hibernate.cfg.Configuration.getConfigurationInputStream(Configuration.java:1405)
	at org.hibernate.cfg.Configuration.configure(Configuration.java:1427)
	at org.hibernate.cfg.AnnotationConfiguration.configure(AnnotationConfiguration.java:972)
	at com.amazonaws.modelo.HibernateUtil.<clinit>(HibernateUtil.java:23)
	... 34 more

Classe HibernateUtil:
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.amazonaws.modelo;

import org.hibernate.cfg.AnnotationConfiguration;
import org.hibernate.SessionFactory;

/**
 * Hibernate Utility class with a convenient method to get Session Factory object.
 *
 * @author Marcia
 */
public class HibernateUtil {

    private static final SessionFactory sessionFactory;
    
    static {
        try {
            // Create the SessionFactory from standard (hibernate.cfg.xml) 
            // config file.
            sessionFactory = new AnnotationConfiguration().configure().buildSessionFactory();
        } catch (Throwable ex) {
            // Log the exception. 
            System.err.println("Initial SessionFactory creation failed." + ex);
            throw new ExceptionInInitializerError(ex);
        }
    }
    
    public static SessionFactory getSessionFactory() {
        return sessionFactory;
    }
}

Obrigado!

manolo

[b]hugo.hlcxcx,

realizei a substituição como sugerido, mas o erro ainda persisti!

Obrigado.[/b]

A

Então, ele não está conseguindo localizar o arquivo do hibernate.

Você tem esse arquivo né ? Onde você o colocou ?

[]'s

manolo

[b]Tenho sim Alex!

Ele esta no mesmo pacote que o HibernateUtil.java, arquivo de engenharia reversa, e POJO’s.

Estranho que quando eu executo o HQL ele retorna os registros que adicionei manualmente no banco anteriormente, sem gerar nenhuma exeção.[/b]

hugo.hlcxcx

Cara, o arquivo hibernate.cfg.xml deve ficar solto no diretório src do seu projeto.

A

Seu projeto é Web, correto ? Você só tem esse projeto, ou tem vários projetos, tipo, um projeto web, um orm, etc … ?? Está utilizando Maven, Ant ??

Se for um único projeto web, tenta colocar o arquivo na raiz do src mesmo …

testa ai.

[]'s

manolo

Pessoal, vocês estão certos!

Bobeira total minha, a exeção foi resolvida. Mas agora esta gerando esta outra encrenca dos infernos:

27/10/2011 12:24:14 com.sun.faces.context.AjaxExceptionHandlerImpl log GRAVE: JSF1073: javax.faces.event.AbortProcessingException obtido durante o processamento de INVOKE_APPLICATION 5: UIComponent-ClientId=j_idt8:j_idt22, Message=org.hibernate.SessionException: Session was already closed 27/10/2011 12:24:14 com.sun.faces.context.AjaxExceptionHandlerImpl log GRAVE: org.hibernate.SessionException: Session was already closed javax.faces.event.AbortProcessingException: org.hibernate.SessionException: Session was already closed at javax.faces.event.MethodExpressionActionListener.processAction(MethodExpressionActionListener.java:182) at javax.faces.event.ActionEvent.processListener(ActionEvent.java:88) at javax.faces.component.UIComponentBase.broadcast(UIComponentBase.java:769) at javax.faces.component.UICommand.broadcast(UICommand.java:300) at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:794) at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1259) at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:81) at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101) at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118) at javax.faces.webapp.FacesServlet.service(FacesServlet.java:409) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:304) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:224) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:185) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:151) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100) at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:929) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:405) at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:269) at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:515) at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:302) at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) at java.lang.Thread.run(Thread.java:662) Caused by: org.hibernate.SessionException: Session was already closed at org.hibernate.impl.SessionImpl.close(SessionImpl.java:275) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at org.hibernate.context.ThreadLocalSessionContext$TransactionProtectionWrapper.invoke(ThreadLocalSessionContext.java:301) at $Proxy101.close(Unknown Source) at com.amazonaws.modelo.ContatoHelper.gravarContato(ContatoHelper.java:38) at com.amazonaws.controle.ControleCliente.gravarFormulario(ControleCliente.java:84) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at org.apache.el.parser.AstValue.invoke(AstValue.java:262) at org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:278) at javax.faces.event.MethodExpressionActionListener.processAction(MethodExpressionActionListener.java:153) ... 25 more

Obrigado pela colaboração Hugo e Alex!

manolo

Agora quando eu gero a consulta HQL e relatada a seguinte mensagem de erro:

java.io.FileNotFoundException: FileObject MasterFileObject[C:\Users\Marcia\Documents\NetBeansProjects\CadastroCliente\src\java\com\amazonaws\modelo\hibernate.cfg.xml@103b97:1eba4cf,valid=false] is not valid. at org.netbeans.modules.masterfs.filebasedfs.fileobjects.FileObj.getInputStream(FileObj.java:147)

A

Sobre o primeiro erro, tenta fazer o seguinte

sessionFactory.openSession();

[]'s

manolo

Desculpa Alex, mas onde eu devo adionar a linha:

A

Desculpe, respondi rápido, estava saindo para almoçar.

você pode trocar o código

public ContatoHelper() {  
        //isso
        this.session = HibernateUtil.getSessionFactory().getCurrentSession(); 
        //Por isso
        this.session = HibernateUtil.getSessionFactory().openSession();  
   }

Acho que funciona.

[]'s

manolo

Alex,

agora funcionou cara!

Você pode me explicar qual era o problema?

Muito obrigado pela ajuda. :slight_smile:

A

Então, pelo que eu entendo é o seguinte.

O método getCurrentSession() vai retornar a sessão corrente dentro da factory. Porém você não abriu nenhuma sessão (conexão com o banco), logo a mesma está fechada.

Já o método openSession(), cria uma nova conexão com o banco e abre a sessão para você.

Um possível problema, seria você nunca fechar essas conexões. Mas você já tem um .close() no finally … então é “sussa”

Acho que é isso, deu uma clariada ?

[]'s

manolo

Ahhh sim…

Consegui entender agora.

Vou tentar popular uma table agora, espero que de certo!

Obrigado de novo Alex.

Criado 27 de outubro de 2011
Ultima resposta 27 de out. de 2011
Respostas 16
Participantes 3