[JSF] java.lang.ClassCastException: java.lang.String cannot be cast to br.com.estagio.beans.Cid

18/05/2014

0

Boa noite Pessoal, desculpas qualquer coisa, ainda sou novo, e por ser novo é o meu primeiro post \o. ^^ enfim.

[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

Simeon Ação

Responder

Posts

14/07/2014

Genivaldo

Olá Simeon,

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é+
Responder

15/07/2014

Genivaldo

O primeiro item com a mensagem, usei o atributo itemDisabled:


  <f:selectItem itemLabel="Selecione uma cidade" itemDisabled="true"/>

Responder

16/07/2014

Ronaldo Lanhellas

Tente retirar o "0" do item "Selecione uma Cidade" , creio que ele está tentando converter o valor "0" (como String) para o Bean, fica assim:

   <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>
Responder

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar