[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

Que tal ter acesso a um e-book gratuito que vai te ajudar muito nesse momento decisivo?

Ver ebook

Recomendado pra quem ainda não iniciou o estudos.

Eu quero
Ver ebook

Recomendado para quem está passando por dificuldades nessa etapa inicial

Eu quero

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

Aceitar