[JSF] java.lang.ClassCastException: java.lang.String cannot be cast to br.com.estagio.beans.Cid
18/05/2014
0
[b]O que eu quero: [/b] Quero colocar os valores do banco de dados cidade em um selectOneMenu para listar as cidades do estado de Goías por exemplo
[b]Problema: [/b] Criei a classe CidadeDAO, Cidade, ControllerCidade e ConverterCidade, mas quando executo a minha aplicação web, ele da o erro
java.lang.ClassCastException: java.lang.String cannot be cast to br.com.estagio.beans.Cidades
e não lista nadaa, segue abaixo oss codigos relacionados
[b]ControllerCidade[/b]
package br.com.estagio.controller; import java.io.PrintWriter; import java.util.ArrayList; import javax.faces.bean.ManagedBean; import javax.faces.bean.RequestScoped; import javax.faces.bean.SessionScoped; import antlr.collections.List; import br.com.estagio.beans.Cidade; import br.com.estagio.conversores.ConverterCidade; import br.com.estagio.modelo.CidadeDAO; @ManagedBean(name="controllerCidades") @RequestScoped public class ControllerCidades { private CidadeDAO dao; private Cidade objeto; private ConverterCidade converterCidade; public ControllerCidades(){ dao = new CidadeDAO(); converterCidade = new ConverterCidade(); } public CidadeDAO getDao() { return dao; } public void setDao(CidadeDAO dao) { this.dao = dao; } public Cidade getObjeto() { return objeto; } public void setObjeto(Cidade objeto) { this.objeto = objeto; } public ConverterCidade getConverterCidade() { return converterCidade; } public void setConverterCidade(ConverterCidade converterCidade) { this.converterCidade = converterCidade; } }
[b] CidadeDAO [/b]
package br.com.estagio.modelo; import java.util.List; import javax.persistence.EntityManager; import br.com.estagio.beans.Cidade; import br.com.estagio.jpa.EntityManagerUtil; public class CidadeDAO { private EntityManager em; public CidadeDAO(){ em = EntityManagerUtil.getEntityManager(); } //função para listar as cidades @SuppressWarnings("unchecked") public List<Cidade> ListarCidadePorUF(){ return em.createQuery("FROM Cidade ORDER BY nome").getResultList(); } public EntityManager getEm() { return em; } public void setEm(EntityManager em) { this.em = em; } }
[b]Cidade[/b]
package br.com.estagio.beans; import java.io.Serializable; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.ManyToOne; import javax.persistence.Table; import javax.validation.constraints.NotNull; import org.hibernate.validator.constraints.NotEmpty; @Entity @Table(name="cidade") public class Cidade implements Serializable { @Id @GeneratedValue(strategy=GenerationType.AUTO) @Column(name="id") private Integer id; @NotEmpty(message="O nome da cidade não pode ser vazio") @Column(name="nome") private String nome; @NotNull(message="O estado não deve ser vazio") @ManyToOne @JoinColumn(name="estado", referencedColumnName="id", nullable=false) private Estado id_estado; public Cidade(){} public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getNome() { return nome; } public void setNome(String nome) { this.nome = nome; } public Estado getIdEstado() { return id_estado; } public void setIdEstado(Estado id_estado) { this.id_estado = id_estado; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((id == null) ? 0 : id.hashCode()); return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; Cidade other = (Cidade) obj; if (id == null) { if (other.id != null) return false; } else if (!id.equals(other.id)) return false; return true; } public String toString(String nome) { return (String) nome; } }
[b]ConverterCidade[/b]
package br.com.estagio.conversores; import java.awt.print.Printable; import java.io.PrintWriter; import java.io.Serializable; import java.util.concurrent.ExecutionException; import javax.faces.component.UIComponent; import javax.faces.context.FacesContext; import javax.faces.convert.Converter; import br.com.estagio.beans.Cidade; import br.com.estagio.beans.Unidades; import br.com.estagio.jpa.EntityManagerUtil; @SuppressWarnings("serial") public class ConverterCidade implements Serializable,Converter { // converte da tela para o objeto @Override public Object getAsObject(FacesContext arg0, UIComponent arg1, String string) { if (string == null || string.equals("Selecione uma cidade")){ return null; } return EntityManagerUtil.getEntityManager().find(Cidade.class, Integer.parseInt(string)); } // converte do objeto para a tela @Override public String getAsString(FacesContext arg0, UIComponent arg1, Object o) { if (o == null){ return null; } try { Cidade obj = (Cidade) o; return obj.getId().toString(); } catch(Exception e){ return "erro: "+e; } } }
[b]Form[/b]
<div class="form-group col-md-3" > <label for="cidade">Cidade </label> <h:selectOneMenu value="#{controllerCidades.objeto.id}" converter="#{controllerCidades.converterCidade}" class="form-control" id="cidade" name="cidade"> <f:selectItem itemValue="0" itemLabel="Selecione uma cidade" /> <f:selectItems itemValue="#{controllerCidades.dao.ListarCidadePorUF()}" /> </h:selectOneMenu> <!-- <h:inputText value="#{controllerCidades.dao.ListarCidadePorUF()}" /> --> </div>
Também tenho a ligação de estado pra cidade porém eu não sei se isso tem alguma ligação com o erro :/ mas caso tenha aqui estar a classe estado.
[b]Estado[/b]
package br.com.estagio.beans; import java.io.Serializable; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.ManyToOne; import javax.persistence.Table; import javax.validation.constraints.NotNull; import org.hibernate.validator.constraints.NotEmpty; @Entity @Table(name="estado") public class Estado implements Serializable { @Id @GeneratedValue(strategy=GenerationType.AUTO) @Column(name="id") private Integer id; @NotEmpty(message="O nome do estado deve ser informado") @Column(name="nome") private String nome; @NotEmpty(message="A UF deve ser informada") @Column(name="uf") private String uf; @NotEmpty(message="O País deve ser informado") @ManyToOne @JoinColumn(name="pais", referencedColumnName="ID", nullable=false) private Pais id_pais; public Estado(){} public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getNome() { return nome; } public void setNome(String nome) { this.nome = nome; } public String getUf() { return uf; } public void setUf(String uf) { this.uf = uf; } public Pais getId_pais() { return id_pais; } public void setId_pais(Pais id_pais) { this.id_pais = id_pais; } @Override public String toString() { return nome; } }
[b] Pilha do erro [/b]
java.lang.ClassCastException: java.lang.String cannot be cast to br.com.estagio.beans.Cidade at br.com.estagio.conversores.ConverterCidade.getAsString(ConverterCidade.java:37) at com.sun.faces.renderkit.html_basic.HtmlBasicRenderer.getFormattedValue(HtmlBasicRenderer.java:521) at com.sun.faces.renderkit.html_basic.MenuRenderer.renderOption(MenuRenderer.java:534) at com.sun.faces.renderkit.html_basic.MenuRenderer.renderOptions(MenuRenderer.java:794) at com.sun.faces.renderkit.html_basic.MenuRenderer.renderSelect(MenuRenderer.java:847) at com.sun.faces.renderkit.html_basic.MenuRenderer.encodeEnd(MenuRenderer.java:297) at javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:919) at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1864) at javax.faces.render.Renderer.encodeChildren(Renderer.java:176) at javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:889) at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1857) at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1860) at com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:461) at com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:133) at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:120) at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101) at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:219) at javax.faces.webapp.FacesServlet.service(FacesServlet.java:647) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:501) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:170) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98) at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408) at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1040) at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:607) at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:315) at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) at java.lang.Thread.run(Unknown Source)
Bom realmente tentei algumas coisas ja e procurei no forum porém não encontrei nada relacionado =/
Agradeço desde ja a ajudaa galera.
Simeon Ação
Posts
14/07/2014
Genivaldo
Estava com um problema parecido. Consegui resolver mudando a forma de chamar o converter na página .xhtml e usando uma notação no Converter. No seu caso creio que ficaria assim:
... <h:selectOneMenu value="#{controllerCidades.cidade}" class="form-control" id="cidade" name="cidade"> <f:converter converterId="cidadeConverter" /> <f:selectItems value="#{controllerCidades.dao.ListarCidadePorUF()}" var="cidade" itemLabel="#{cidade.nome}" itemValue="#" /> </h:selectOneMenu> ...
E no converter a notação @FacesConverter
@FacesConverter("cidadeConverter") public class ConverterCidade implements Serializable,Converter { ...
Até+
15/07/2014
Genivaldo
<f:selectItem itemLabel="Selecione uma cidade" itemDisabled="true"/>
16/07/2014
Ronaldo Lanhellas
<h:selectOneMenu value="#{controllerCidades.objeto.id}" converter="#{controllerCidades.converterCidade}" class="form-control" id="cidade" name="cidade"> <f:selectItem itemValue="" itemLabel="Selecione uma cidade" /> <f:selectItems itemValue="#{controllerCidades.dao.ListarCidadePorUF()}" /> </h:selectOneMenu>
Clique aqui para fazer login e interagir na Comunidade :)