7
respostas

Problemas com o selectItems

Agradeço se alguém puder ajudar...

Arquivo livro.xhtml

<?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:panelGrid>
        </fieldset>

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

        <h:commandButton value="Gravar" action="#{livroBean.gravar}" />
    </h:form>
</h:body>

</html>

LivroBean:

package br.com.caelum.livraria.bean;

import java.util.List;

import javax.faces.bean.ManagedBean;

import br.com.caelum.livraria.dao.DAO;
import br.com.caelum.livraria.modelo.Autor;
import br.com.caelum.livraria.modelo.Livro;

@ManagedBean
public class LivroBean {

    private Livro livro = new Livro();

    public Livro getLivro() {
        return livro;
    }

    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(){
        List<Autor> autores = new DAO<Autor>(Autor.class).listaTodos();
        System.out.println(autores);
        return autores;
    }
}

Mensagens do Console:

...
GRAVE: Error Rendering View[/livro.xhtml]
javax.el.ELException: /livro.xhtml @35,57 value="#{livroBean.autores}": Error reading [autores] on type [br.com.caelum.livraria.bean.LivroBean]

...
7 respostas

Oi hiltonmarins,

Estranho ter dado esse erro, pois olhando seu código está tudo certinho.

Aparece mais alguma coisa no Console? Dá uma conferida se a consulta na DAO(método listaTodos()) está certinha.

Caro Rodrigo,

Isolei a o método lista todos em uma classe de teste:

public class Teste {

    public static void main(String[] args) {
        EntityManager em = new JPAUtil().getEntityManager();
        CriteriaQuery<Autor> query = em.getCriteriaBuilder().createQuery(Autor.class);
        query.select(query.from(Autor.class));

        List lista = em.createQuery(query).getResultList();

        for (int i=0; i<lista.size(); i++) {
            System.out.println(lista.get(i).toString());
        }
        em.close();
    }
}

E realmente apresenta um erro. Entretanto eu ainda não consegui identificar. Veja o console:

Exception in thread "main" java.lang.NoClassDefFoundError: antlr/RecognitionException
    at org.hibernate.hql.internal.ast.ASTQueryTranslatorFactory.createQueryTranslator(ASTQueryTranslatorFactory.java:59)
    at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:103)
    at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:80)
    at org.hibernate.engine.query.spi.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:168)
    at org.hibernate.internal.AbstractSessionImpl.getHQLQueryPlan(AbstractSessionImpl.java:221)
    at org.hibernate.internal.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:199)
    at org.hibernate.internal.SessionImpl.createQuery(SessionImpl.java:1735)
    at org.hibernate.ejb.AbstractEntityManagerImpl.createQuery(AbstractEntityManagerImpl.java:452)
    at org.hibernate.ejb.criteria.CriteriaQueryCompiler.compile(CriteriaQueryCompiler.java:221)
    at org.hibernate.ejb.AbstractEntityManagerImpl.createQuery(AbstractEntityManagerImpl.java:587)
    at br.com.caelum.livraria.dao.Teste.main(Teste.java:17)
Caused by: java.lang.ClassNotFoundException: antlr.RecognitionException
    at java.net.URLClassLoader.findClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    ... 11 more

Oi hiltonmarins,

Parece que está faltando alguma lib de dependência do hibernate no seu projeto.

Dá uma conferida na pasta WebContent/WEB-INF/lib do seu projeto e veja se tem os seguintes jars:

antlr-2.7.7.jar
dom4j-1.6.1.jar
hibernate-commons-annotations-4.0.1.Final.jar
hibernate-core-4.1.8.Final.jar
hibernate-entitymanager-4.1.8.Final.jar
hibernate-jpa-2.0-api-1.0.1.Final.jar
hibernate-validator-4.3.0.Final.jar
javassist-3.15.0-GA.jar
javax.faces-2.1.14.jar
jboss-logging-3.1.0.GA.jar
jboss-transaction-api_1.1_spec-1.0.0.Final.jar
mysql-connector-java-5.1.22-bin.jar
validation-api-1.0.0.GA.jar

Rodrigo,

Acidentalmente devo ter movido a lib antlr-2.7.7.jar. A classe Teste funciona perfeitamente mas ao carregar a página livro.xhtml o combobox não é populado. Porque será?

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

insira seu código aqui


Oi hiltonmarins,

Pergunta básica, mas só para garantir, tem algum autor cadastrado no seu banco de dados?

Caso positivo, faz o seguinte, roda o projeto, abre essa página no browser, clica com o botão direito no browser e escolhe para exibir o código fonte da página.

Poste aqui o código fonte da página, para eu ver se tem algum problema na exibição do selectItems.

Sim, populei todas as tabelas. Segue abaixo o código fonte da página:


<?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"><body>
    <h1>Novo Livro</h1>
<form id="j_idt4" name="j_idt4" method="post" action="/livraria/livro.xhtml" enctype="application/x-www-form-urlencoded">
<input type="hidden" name="j_idt4" value="j_idt4" />

        <fieldset>
            <legend>Dados do Livro</legend><table>
<tbody>
<tr>
<td><label for="j_idt4:titulo">
Titulo:</label></td>
<td><input id="j_idt4:titulo" type="text" name="j_idt4:titulo" /></td>
</tr>
<tr>
<td><label for="j_idt4:isbn">
ISBN:</label></td>
<td><input id="j_idt4:isbn" type="text" name="j_idt4:isbn" /></td>
</tr>
<tr>
<td><label for="j_idt4:preco">
Preço:</label></td>
<td><input id="j_idt4:preco" type="text" name="j_idt4:preco" /></td>
</tr>
<tr>
<td><label for="j_idt4:dataLancamento">
Data de Lançamento:</label></td>
<td><input id="j_idt4:dataLancamento" type="text" name="j_idt4:dataLancamento" /></td>
</tr>
</tbody>
</table>

        </fieldset>

        <fieldset>
            <legend>Dados do Autor</legend><label for="j_idt4:autor">
Selecione Autor:</label><select name="j_idt4:j_idt13" size="1"></select><input type="submit" name="j_idt4:j_idt15" value="Gravar Autor" />
        </fieldset><input type="submit" name="j_idt4:j_idt17" value="Gravar" /><input type="hidden" name="javax.faces.ViewState" id="javax.faces.ViewState" value="-7593110369033020664:-7760124534220910680" autocomplete="off" />
</form></body>

</html>

Estranho, a combo de autores está indo vazia pra tela:

<select name="j_idt4:j_idt13" size="1"></select>

No seu controller, no método getAutores tinha um system.out:

public List<Autor> getAutores(){
    List<Autor> autores = new DAO<Autor (Autor.class).listaTodos();
    System.out.println(autores);
    return autores;
}

Sabe se ele chegou a imprimir no console do eclipse essa lista de autores?

Deixa desse jeito pra ficar facil de achar no console:

System.out.println("LISTA DE AUTORES: " +autores);