Solucionado (ver solução)
Solucionado
(ver solução)
8
respostas

JBWEB000065: HTTP Status 500 - Could not initialize class br.com.caelum.livraria.dao.JPAUtil

Não entendo porque está sendo exibido este erro quando tento abrir o livro.xhtml no browser, já que usei o JPAUtil normalmente para popular o banco.

Minha class livroBean:

@ManagedBean
public class LivroBean {

    private Livro livro = new Livro();
    private Integer autorId;

    public Integer getAutorId() {
        return autorId;
    }

    public void setAutorId(Integer autorId) {
        this.autorId = autorId;
    }

    public Livro getLivro() {
        return livro;
    }

    public void gravarAutor() {
        Autor autor = new DAO<Autor> (Autor.class).buscaPorId(this.autorId);
        this.livro.adicionaAutor(autor);
    }

    public void gravar() {
        System.out.println("Gravando livro " + this.livro.getTitulo());

        if (livro.getAutores().isEmpty()) {
            throw new RuntimeException("Livro deve ter pelo menos um Autor.");
        }

        new DAO<Livro>(Livro.class).adiciona(this.livro);
    }

    public List<Autor> getAutores() {
        return new DAO<Autor> (Autor.class).listaTodos();
    }
}
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:f="http://java.sun.com/jsf/core">

<h:body>
    <h1>Novo Livro</h1>
    <h:form>
        <fieldset>
            <legend>Dados do Livro</legend>
            <h:panelGrid columns="2">

                <h:outputLabel value="Titulo:" for="titulo" />
                <h:inputText id="titulo" value="#{livroBean.livro.titulo}" />

                <h:outputLabel value="ISBN:" for="isbn" />
                <h:inputText id="isbn" value="#{livroBean.livro.isbn}" />

                <h:outputLabel value="Preço:" for="preco" />
                <h:inputText id="preco" value="#{livroBean.livro.preco}" />

                <h:outputLabel value="Data de Lançamento:" for="dataLancamento" />
                <h:inputText id="dataLancamento"
                    value="#{livroBean.livro.dataLancamento}" />
                <h:commandButton value="Gravar" action="#{livroBean.gravar}" />
            </h:panelGrid>
        </fieldset>
        <fieldset>
            <legend>Dados do Autor</legend>
            <h:outputLabel value="Selecione Autor:" for="autor"/>
            <h:selectOneMenu id="autor" >
                <f:selectItems value="#{livroBean.autores}" />
            </h:selectOneMenu>
            <h:commandButton value="Gravar Autor" action="#{livroBean.gravarAutor}"/>
        </fieldset>
    </h:form>
</h:body>

</html>
8 respostas

Cara...esse negócio de formatar com ``` não tá rolando... que coisa complicada... Aprendi kkkkk finalmente kkkkkkkk

Pode colar a pilha da exception aqui? Acho que talvez tenha mais alguma informação que pode ser útil para descobrirmos o erro.

PS: O seu código não estava saindo formatado pq vc não tava dando enter depois das três aspas.

JBWEB000309: type JBWEB000066: Exception report

JBWEB000068: message Could not initialize class br.com.caelum.livraria.dao.JPAUtil

JBWEB000069: description JBWEB000145: The server encountered an internal error that prevented it from fulfilling this request.

JBWEB000070: exception

javax.servlet.ServletException: Could not initialize class br.com.caelum.livraria.dao.JPAUtil
    javax.faces.webapp.FacesServlet.service(FacesServlet.java:606)
JBWEB000071: root cause

java.lang.NoClassDefFoundError: Could not initialize class br.com.caelum.livraria.dao.JPAUtil
    br.com.caelum.livraria.dao.DAO.listaTodos(DAO.java:55)
    br.com.caelum.livraria.bean.LivroBean.getAutores(LivroBean.java:31)
    sun.reflect.GeneratedMethodAccessor57.invoke(Unknown Source)
    sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    java.lang.reflect.Method.invoke(Method.java:498)
    javax.el.BeanELResolver.getValue(BeanELResolver.java:304)
    com.sun.faces.el.DemuxCompositeELResolver._getValue(DemuxCompositeELResolver.java:176)
    com.sun.faces.el.DemuxCompositeELResolver.getValue(DemuxCompositeELResolver.java:203)
    org.apache.el.parser.AstValue.getValue(AstValue.java:166)
    org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:189)
    com.sun.faces.facelets.el.TagValueExpression.getValue(TagValueExpression.java:109)
    javax.faces.component.ComponentStateHelper.eval(ComponentStateHelper.java:194)
    javax.faces.component.ComponentStateHelper.eval(ComponentStateHelper.java:182)
    javax.faces.component.UISelectItems.getValue(UISelectItems.java:129)
    com.sun.faces.renderkit.SelectItemsIterator.initializeItems(SelectItemsIterator.java:202)
    com.sun.faces.renderkit.SelectItemsIterator.hasNext(SelectItemsIterator.java:135)
    com.sun.faces.renderkit.html_basic.MenuRenderer.renderOptions(MenuRenderer.java:761)
    com.sun.faces.renderkit.html_basic.MenuRenderer.renderSelect(MenuRenderer.java:843)
    com.sun.faces.renderkit.html_basic.MenuRenderer.encodeEnd(MenuRenderer.java:297)
    javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:877)
    javax.faces.component.UIComponent.encodeAll(UIComponent.java:1826)
    javax.faces.render.Renderer.encodeChildren(Renderer.java:168)
    javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:847)
    javax.faces.component.UIComponent.encodeAll(UIComponent.java:1819)
    javax.faces.component.UIComponent.encodeAll(UIComponent.java:1822)
    javax.faces.component.UIComponent.encodeAll(UIComponent.java:1822)
    com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:447)
    com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:125)
    com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:120)
    com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
    com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:139)
    javax.faces.webapp.FacesServlet.service(FacesServlet.java:594)
JBWEB000072: note JBWEB000073: The full stack trace of the root cause is available in the JBoss Web/7.5.9.Final-redhat-1 logs.

Bom, o erro indica que a classe JPAUtil não está sendo adicionada a aplicação que é instalada no seu wildfly.. Acho que pode ser algum problema de configuração no projeto, agora não sei exatamente o que... Para verificar se é isso mesmo, vc pode dar uma olhada na pasta de deployments do wildfly e verificar se todas as classes esperadas estão lá...

Estou usando o JBoss. REtirei a parte abaixo do livro.xhtml e abriu normal:

        <fieldset>
            <legend>Dados do Autor</legend>
            <h:outputLabel value="Selecione Autor:" for="autor"/>
            <h:selectOneMenu id="autor" >
                <f:selectItems value="#{livroBean.autores}" />
            </h:selectOneMenu>
            <h:commandButton value="Gravar Autor" action="#{livroBean.gravarAutor}"/>
        </fieldset>

No livroBean.java não existe nenhum método com o nome "autores", apenas o getAutores. Será que é isso? Se não for, por que na linha do selectItems não está escrito #{livroBean.getAutores} ?

O problema é na hora de popular o combo. Esta linha está gerando o erro :

<f:selectItems value="#{livroBean.autores}" />

Quando vc usa a expression language e quer invocar getters, vc não precisa colocar o nome do método inteiro.. é só colocar a parte que representa a propriedade em si..

Em relação ao erro, deixou de acontecer pq vc retirou o trecho do código que invocava o método da listagem, que soltava a exception. Ainda acho que é problema no deploy...

solução!

Descobri que era o banco de dados. Estava usando MariaDB, com as properties abaixo:

        <properties>
            <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver" />
            <property name="javax.persistence.jdbc.url" value="jdbc:mariadb://localhost:3306/livrariadb?user=root;password=myPassword" />
            <property name="javax.persistence.jdbc.user" value="root" />
            <property name="javax.persistence.jdbc.password" value="" />

            <property name="hibernate.hbm2ddl.auto" value="update" />
            <property name="hibernate.show_sql" value="true" />
            <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5InnoDBDialect" />
        </properties>

Resolvi testar com o DB2, que é o banco de desenvolvimento aqui do trabalho e deu certo. Acho que o hibernate não se dá muito bem com esse tal de MariaDB. Em casa usei o MySQL e funcionou de primeira.