Converter Classe com JSF

Ola boa tarde,

estou com um problema que venho quebrando a cabeça faz alguns dias …
Quando quero inserir uma nova cidade no meu banco com hibernate eu preciso converter a classe estado, para que me retorne somente seu id…

Estudei sobre esse converte so que ja fiz de tudo e não consegui, ainda me retorna erro

segue os codigos

Classe Cidade

[code]
package com.sim.model;
// Generated 23/02/2013

import java.io.Serializable;
import javax.persistence.*;

@Entity
@Table(name=“cidade”)

/**

  • Cidade generated by hbm2java
    */
    public class Cidade implements Serializable{

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue
    @Column(name=“idCidade” , nullable=true)

    private Integer idCidade;

    @ManyToOne
    @JoinColumn(name=“ESTADO_idESTADO”)
    private Estado estados;

    private String nome;

    public Cidade() {
    }

    public Integer getIdCidade() {
    return idCidade;
    }

    public void setIdCidade(Integer idCidade) {
    this.idCidade = idCidade;
    }

    public Estado getEstados() {
    return estados;
    }

    public void setEstados(Estado estados) {
    this.estados = estados;
    }

    public String getNome() {
    return nome;
    }

    public void setNome(String nome) {
    this.nome = nome;
    }

    @Override
    public int hashCode() {
    int hash = 5;
    hash = 97 * hash + (this.idCidade != null ? this.idCidade.hashCode() : 0);
    hash = 97 * hash + (this.estados != null ? this.estados.hashCode() : 0);
    hash = 97 * hash + (this.nome != null ? this.nome.hashCode() : 0);
    return hash;
    }

    @Override
    public boolean equals(Object obj) {
    if (obj == null) {
    return false;
    }
    if (getClass() != obj.getClass()) {
    return false;
    }
    final Cidade other = (Cidade) obj;
    if (this.idCidade != other.idCidade && (this.idCidade == null || !this.idCidade.equals(other.idCidade))) {
    return false;
    }
    if (this.estados != other.estados && (this.estados == null || !this.estados.equals(other.estados))) {
    return false;
    }
    if ((this.nome == null) ? (other.nome != null) : !this.nome.equals(other.nome)) {
    return false;
    }
    return true;
    }[/code]

Classe Estado

[code]package com.sim.model;
// Generated 23/02/2013

import javax.persistence.*;

/**

  • Estado generated by hbm2java
    */

@Entity
@Table(name=“estado”)

public class Estado implements java.io.Serializable {

private static final long serialVersionUID = 8787014459071770166L;

@Id
@GeneratedValue
@Column(name="idEstado")
private Integer idEstado;


private String nome;
private String uf;


    public Estado() {
    }

    public Integer getIdEstado() {
        return this.idEstado;
    }

    public void setIdEstado(Integer idEstado) {
        this.idEstado = idEstado;
    }
    public String getNome() {
        return this.nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }
    public String getUf() {
        return this.uf;
    }

    public void setUf(String uf) {
        this.uf = uf;
    }

@Override
    public int hashCode() {
        int hash = 5;
        hash = 73 * hash + (this.idEstado != null ? this.idEstado.hashCode() : 0);
        hash = 73 * hash + (this.nome != null ? this.nome.hashCode() : 0);
        hash = 73 * hash + (this.uf != null ? this.uf.hashCode() : 0);
        return hash;
    }


    @Override
    public boolean equals(Object obj) {
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        final Estado other = (Estado) obj;
        if (this.idEstado != other.idEstado && (this.idEstado == null || !this.idEstado.equals(other.idEstado))) {
            return false;
        }
        if ((this.nome == null) ? (other.nome != null) : !this.nome.equals(other.nome)) {
            return false;
        }
        if ((this.uf == null) ? (other.uf != null) : !this.uf.equals(other.uf)) {
            return false;
        }
        return true;
    }        

}[/code]

Converte

[code]

@FacesConverter(value = “EstadoConverter”, forClass=Estado.class)

public class EstadoConvert implements Converter{

@Override
public Object getAsObject(FacesContext context, UIComponent component, String value) throws ConverterException{
    if(value == null){
        return null;
    }
    
    Integer id = Integer.valueOf(value);
    return new EstadoDaoImpl().buscaEstadoid(id);
    
}

@Override
public String getAsString(FacesContext context, UIComponent component, Object object)throws ConverterException {
    if(object == null) {
        return null;
    }
    return null;      

            
}

}[/code]

View

[code]<h:form id=“frmNovaCidade”>

        <p:dialog header="CADASTRO DE CIDADE" widgetVar="CadCidade"  resizable="false" id="cadDlg" showEffect="fade" modal="true">
            <p:growl id="growl" showDetail="true" sticky="true" />
            <p:panelGrid id="NCidade" styleClass="semBorda" >
                <p:row>                                               
                    <p:column> 
                        <h:outputLabel class="label" value="Nome" />
                    </p:column>
                    
                    <p:column>
                        <p:inputText value="#{CidadeBean.cidade.nome}" size="50"/>
                    </p:column>
                    
                    <!-- Selecione o Estado -->
                    <p:column> 
                        <h:outputLabel class="label" value="Estado" />
                    </p:column>                        
                    <p:column>
                        <p:selectOneMenu  value="#{CidadeBean.cidade.estados}" converter="EstadoConverter" label="Estado">
                            <f:selectItem itemValue="" itemLabel="NÃO INFORMADO" />
                            <f:selectItems value="#{EstadoBean.estados}" var="estados" itemLabel="#{estados.nome}" itemValue="#{estados}" />
                      
                        </p:selectOneMenu>
                    </p:column>
                    
                </p:row>         
                
                <p:row>
                    <p:column colspan="4" style="text-align: right;">
                        <p:commandButton value="Salvar" update=":frmCidades, growl" actionListener="#{CidadeBean.salvar}" image="icon-salvar" style="width: 100px; height: 30px;" oncomplete="CadCidade.hide()"  />                       
                        <p:commandButton value="Cancelar"  update=":frmCidades, growl" image="icon-cancelar" style="width: 100px; height: 30px;" oncomplete="CadCidade.hide()" />
                    </p:column>
                </p:row>
                                            
          </p:panelGrid>
            
            
        </p:dialog>           
    </h:form>
    
    <!-- FIM formulario nova cidade-->      [/code]

O erro que me retorna e esse

Advertência: For input string: "RIO DE JANEIRO" java.lang.NumberFormatException: For input string: "RIO DE JANEIRO" at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65) at java.lang.Integer.parseInt(Integer.java:492) at java.lang.Integer.valueOf(Integer.java:582) at com.sim.convert.EstadoConvert.getAsObject(EstadoConvert.java:32) at com.sun.faces.renderkit.html_basic.HtmlBasicInputRenderer.getConvertedValue(HtmlBasicInputRenderer.java:171)

Agradeço se alguem pode me ajudar…

O problema está no seu arquivo jsf, posta ele ai pra gente ver.

Você por acaso não está tentando transformar RIO DE JANEIRO em número, está ?

Porque na sua view em itemValue você não põe o id do estado ?

[code]<?xml version='1.0' encoding='UTF-8' ?>

<ui:composition xmlns:ui=“http://java.sun.com/jsf/facelets"
template=”./…/…/Templates/Principal.xhtml"
xmlns:p="http://primefaces.org/ui"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f=“http://java.sun.com/jsf/core”>

<ui:define name="corpo">
   
        <p:panel header="CIDADE" footer="Cidade"><!-- Topo do painel (Cidade) com primefaces -->
            <p:commandButton  type="button" value="Nova" image="icon-novo" style="width: 100px;" title="Cadastrar Nova Cidade" onclick="CadCidade.show();" actionListener="#{CidadeBean.prepararSalvar}"/>
            <f:verbatim> <br> </br> </f:verbatim> <!-- Pular linha -->
            
            <h:form id="frmCidades">                    
                <p:dataTable id="tableCidade" var="cidades" value="#{CidadeBean.cidades}" >
                  
                    <p:column headerText="Nome">  
                        <h:outputText value="#{cidades.nome}" />
                     </p:column>
                    
                    <p:column headerText="Estado">  
                        <h:outputText value="#{cidades.estados.nome}"/>
                      
                     </p:column>
                    
              
                     <p:column style="width:8%;text-align: center" headerText="Controle">
                        <p:commandButton update=":frmCidades" oncomplete="dlg.show()" image="icon-editar" title="Editar" />
                        <p:commandButton update=":frmCidades" oncomplete="dlg.show()" image="icon-excluir" title="Excluir" />                               
                    </p:column>

                </p:dataTable>                    
            </h:form>
            
            <h:messages />
            
                         
        </p:panel><!-- Fim do painel do primefaces -->            
 
    
    <!-- INICIO formulario nova cidade-->
    
    <h:form id="frmNovaCidade">
        
        
        <p:dialog header="CADASTRO DE CIDADE" widgetVar="CadCidade"  resizable="false" id="cadDlg" showEffect="fade" modal="true">
            <p:growl id="growl" showDetail="true" sticky="true" />
            <p:panelGrid id="NCidade" styleClass="semBorda" >
                <p:row>                                               
                    <p:column> 
                        <h:outputLabel class="label" value="Nome" />
                    </p:column>
                    
                    <p:column>
                        <p:inputText value="#{CidadeBean.cidade.nome}" size="50"/>
                    </p:column>
                    
                    <!-- Selecione o Estado -->
                    <p:column> 
                        <h:outputLabel class="label" value="Estado" />
                    </p:column>                        
                    <p:column>
                        <p:selectOneMenu  value="#{CidadeBean.cidade.estados}" converter="EstadoConverter" label="Estado">
                            <f:selectItem itemValue="" itemLabel="NÃO INFORMADO" />
                            <f:selectItems value="#{EstadoBean.estados}" var="estados" itemLabel="#{estados.nome}" itemValue="#{estados}" />
                      
                        </p:selectOneMenu>
                    </p:column>
                    
                </p:row>         
                
                <p:row>
                    <p:column colspan="4" style="text-align: right;">
                        <p:commandButton value="Salvar" update=":frmCidades, growl" actionListener="#{CidadeBean.salvar}" image="icon-salvar" style="width: 100px; height: 30px;" oncomplete="CadCidade.hide()"  />                       
                        <p:commandButton value="Cancelar"  update=":frmCidades, growl" image="icon-cancelar" style="width: 100px; height: 30px;" oncomplete="CadCidade.hide()" />
                    </p:column>
                </p:row>
                                            
          </p:panelGrid>
            
            
        </p:dialog>           
    </h:form>
    
    <!-- FIM formulario nova cidade-->        
    
</ui:define>

</ui:composition>[/code]

ivandasilva ja coloquei e da o mesmo erro…

:frowning:

Posso estar enganado mas lendo a documentação do primefaces ach oque se resolve assim:

&lt;p:selectOneMenu  value="#{CidadeBean.cidade.estados}" converter="EstadoConverter" label="Estado"&gt;  
                                &lt;f:selectItem itemValue="" itemLabel="NÃO INFORMADO" /&gt;  
                                &lt;f:selectItems value="#{EstadoBean.estados}" var="estados" itemLabel="#{estados.nome}" itemValue="#{estados.id}" /&gt;  
                            
                            &lt;/p:selectOneMenu&gt;  

Não tenho muito conhecimento em primefaces, sempre usei richfaces.

Murilo_Ferreira ja havia tentando dessa forma…

=/

na verdade ja tentei de varias formas…
socorrooooo

OK, mas executando da forma que eu te falei, qual erro aconceteu na classe converter ?

sim ocorre o mesmo erro que esta citado no inicio do post

O resto do codigo…

[code] public Estado buscaEstadoid(Integer id){
sessao = null;
transacao = null;

  try{
      sessao = HibernateUtil.getSessionFactory().getCurrentSession();
      transacao = sessao.beginTransaction();
      
      return (Estado) sessao.load(Estado.class, id);        
    
  }catch(HibernateException e){
      System.out.println("Não foi possivel buscar Estado. Erro: " + e.getMessage());
      
  }finally{
      try{
          sessao.close();
      }catch(Throwable e){
          System.out.println("Erro ao fechar operação de buscar. Mensagem: " + e.getMessage());
      }
  }
    return null;

} [/code]

Murilo_Ferreira sera que o erro e no convert ?

Advertência: For input string: "ACRE" java.lang.NumberFormatException: For input string: "ACRE" at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65) at java.lang.Integer.parseInt(Integer.java:492) at java.lang.Integer.valueOf(Integer.java:582) ->>>>at com.sim.convert.EstadoConvert.getAsObject(EstadoConvert.java:29)<<<<<<<<-

que seria:

Integer id = Integer.valueOf(value); ?

Continuo mexendo e continuo achando coisas estranhas…

no meu selecttOneMenu

[code]<p:selectOneMenu value="#{CidadeBean.cidade.estados}" converter=“EstadoConverter” label=“Estado”>
<f:selectItem itemValue="" itemLabel=“NÃO INFORMADO” />
<f:selectItems value="#{EstadoBean.estados}" var=“estados” itemLabel="#{estados.nome}" itemValue="#{estados.idEstado}" />

</p:selectOneMenu> [/code]

não importa se ele esta itemValue="#{estados.idEstado}" ou não la no meu convert o String value esta sempre pegando o nome do estado…

2rogerio porque você não faz uma busca no banco de dados pelo nome, são valores que nunca podem se repetir.

ivandasilva achu que vai se dessa forma mesmo que vou ter que fazer…

por que o selectOneMenu teria que pegar o valor do Id no itemValue mas ele pega e o valor o itemLabel

to ferrado …

:frowning:

Em vez de setar o objeto em si eu seto o id, então faço uma consulta no banco que retorna o objeto, consegui assim e deu certo. Porém o exemplo eu tenho em casa, meio dia eu posto pra você.

tente assim:

<p:selectOneMenu value="#{CidadeBean.cidade.estados.idEstado}" label="Estado">                         
   <f:selectItem itemLabel="NÃO INFORMADO" itemValue="" />  
   <f:selectItems value="#{EstadoBean.estados}" var="estados" itemLabel="#{estados.nome}" itemValue="#{estados.idEstado}" />  
</p:selectOneMenu> 

Valeio Bezerra

da erro dessa forma

Esta resolvido.

Estava tentando seta o Id no ItemValue e não consegui, Pois so retornava a String nome do Estado.

Então resolvi setar o objeto e implementar no converter agora deu certo.

     <p:column>
                      <p:selectOneMenu  value="#{CidadeBean.cidade.estados}" converter="EstadoConverter" >
                                <f:selectItem itemValue="" itemLabel="NÃO INFORMADO" />
                                <f:selectItems value="#{EstadoBean.estados}" var="estados" itemLabel="#{estados.nome}" />                          
                       </p:selectOneMenu>
     </p:column>

Converter

[code] @Override
public String getAsString(FacesContext context, UIComponent component, Object object)throws ConverterException {
if (object instanceof Estado) {

        Estado estado = (Estado) object;  
        return estado.getIdEstado().toString();  
    }  

    return "";  
    

            
}[/code]

Agradeço a atenção de cada um