Fórum [JSF] java.lang.ClassCastException: java.lang.String cannot be cast to br.com.estagio.beans.Cid #479391
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
Curtir tópico
+ 0Posts
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é+
Gostei + 0
15/07/2014
Genivaldo
<f:selectItem itemLabel="Selecione uma cidade" itemDisabled="true"/>
Gostei + 0
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>
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)