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

Dúvida no Ex. 2 da Aula 4 - Completando o sistema e lidando com escopos do JSF 2

Após configurar o novo selectOneMenu e o método getAutores na classe LivroBean, ao acessar a view livro (http://localhost:8080/livraria/livro.xhtml) recebo a exception:

HTTP Status 500 - java.util.ArrayList cannot be cast to javax.faces.model.SelectItem type Exception report

message java.util.ArrayList cannot be cast to javax.faces.model.SelectItem

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

exception

javax.servlet.ServletException: java.util.ArrayList cannot be cast to javax.faces.model.SelectItem javax.faces.webapp.FacesServlet.service(FacesServlet.java:606) org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) root cause

java.lang.ClassCastException: java.util.ArrayList cannot be cast to javax.faces.model.SelectItem com.sun.faces.renderkit.SelectItemsIterator.initializeItems(SelectItemsIterator.java:189) 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:875) javax.faces.component.UIComponent.encodeAll(UIComponent.java:1786) javax.faces.render.Renderer.encodeChildren(Renderer.java:168) javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:845) javax.faces.component.UIComponent.encodeAll(UIComponent.java:1779) javax.faces.component.UIComponent.encodeAll(UIComponent.java:1782) javax.faces.component.UIComponent.encodeAll(UIComponent.java:1782) com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:437) com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:124) 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) org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)


Seguem a view e a classe:

<?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">

Novo Livro

Dados do Livro

Dados do Autor

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 List getAutores(){ return new DAO(Autor.class).listaTodos(); }

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.class).adiciona(this.livro);

}

}

3 respostas

Segue a view (utlizando "_" para exibir o código): <?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 < h:form> <_fieldset> <_legend>Dados do Livro

Dados do Autor

<_/html>

<_?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 o autor: " for="autor" /> <_h:selectOneMenu value="#{livroBean.autorId}" id="autor"> <_f:selectItem 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>
solução!

Problema resolvido!