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);
}
}