java.lang.Integer cannot be cast to

Java

04/07/2013

Bom dia,

Estou com um problema em um conversor de OneToOne.
Estou usando NetBeans + JSF 2.0 + Hibernate + MySQL

Segue a baixo o erro.
java.lang.ClassCastException: java.lang.Integer cannot be cast to teste02.entity.Folha
	at teste02.conversor.FolhaConverter.getAsString(FolhaConverter.java:39)
	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:924)
	at com.sun.faces.renderkit.html_basic.HtmlBasicRenderer.encodeRecursive(HtmlBasicRenderer.java:312)
	at com.sun.faces.renderkit.html_basic.GridRenderer.renderRow(GridRenderer.java:185)
	at com.sun.faces.renderkit.html_basic.GridRenderer.encodeChildren(GridRenderer.java:129)
	at javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:894)
	at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1856)
	at javax.faces.render.Renderer.encodeChildren(Renderer.java:176)
	at javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:894)
	at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1856)
	at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1859)
	at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1859)
	at com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:443)
	at com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:131)
	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:305)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
	at org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:393)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)
	at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:936)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
	at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1004)
	at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589)
	at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
	at java.lang.Thread.run(Thread.java:722)


Segue o faces
<h:form>
                Cadastro de Quadro <br/> <br/>
                <h:panelGrid columns="2">
                    Quadro:  <h:inputText id="cargoTxt" value="#{quadroBean.quadro.descquadro}"/>
                    Folha: <h:selectOneMenu  id="quadroNr" value="#{quadroBean.quadro.fkfolha}">  
                                <f:selectItems var="item"  value="#{quadroBean.folhaLove}" itemValue="#{item.value}" itemLabel="#{item.label}"/>
                                <f:converter converterId="QuadroConverter"/>
                           </h:selectOneMenu>
                    <h:commandButton value="Salvar" action="#{quadroBean.adicionarQuadro()}"/>                
                </h:panelGrid>
            </h:form>


Segue o conversor.

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package teste02.conversor;

import java.util.logging.Level;
import java.util.logging.Logger;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;
import javax.faces.convert.FacesConverter;
import teste02.dao.QuadroDao;
import teste02.entity.Quadro;




@FacesConverter(value="quadroConverter")
public class QuadroConverter implements Converter {
    
    private QuadroDao quadroDao = new QuadroDao();
    
    public QuadroConverter (){
        
    }

   
@Override
    public Object getAsObject(FacesContext fc, UIComponent uic, String arg2) {
        Integer cdquadro = Integer.parseInt(arg2);
      try {
            return quadroDao.getquadro(cdquadro);
        } catch (ClassCastException ex) {
            Logger.getLogger(QuadroConverter.class.getName()).log(Level.SEVERE, null, ex);
        } catch (Exception ex) {
            Logger.getLogger(QuadroConverter.class.getName()).log(Level.SEVERE, null, ex);
        }   
        return null;
}

    @Override
    public String getAsString(FacesContext fc, UIComponent uic, Object o) {
        Quadro quadro = (Quadro) o;
        return String.valueOf(quadro.getFkfolha());
    }
    
}


Segue o entity

@Entity
@Table(name = "folha")
public class Folha implements Serializable {


    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "cd_folha")  
    private Integer cdfolha;
    @Column(name = "desc_folha")
    private String descfolha;

    public Integer getCdfolha() {
        return cdfolha;
    }

    public void setCdfolha(Integer cdfolha) {
        this.cdfolha = cdfolha;
    }

    public String getDescfolha() {
        return descfolha;
    }

    public void setDescfolha(String descfolha) {
        this.descfolha = descfolha;
    }

@Entity
@Table(name="quadro")
public class Quadro implements Serializable {
    
   
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "cd_quadro")  
    private int cdquadro;
    @Column(name = "desc_quadro")  
    private String descquadro;
    
    @OneToOne
    @JoinColumn(name="cd_folha")
    private Folha fkfolha;

    public int getCdquadro() {
        return cdquadro;
    }

    public void setCdquadro(int cdquadro) {
        this.cdquadro = cdquadro;
    }

    public String getDescquadro() {
        return descquadro;
    }

    public void setDescquadro(String descquadro) {
        this.descquadro = descquadro;
    }

    public Folha getFkfolha() {
        return fkfolha;
    }

    public void setFkfolha(Folha fkfolha) {
        this.fkfolha = fkfolha;
    }




Segue o Bean

import java.util.LinkedList;  
import java.util.List;  
import javax.faces.bean.ManagedBean;  
import javax.faces.bean.RequestScoped;  
import javax.faces.model.SelectItem;  
import teste02.dao.FolhaDao;  
import teste02.dao.QuadroDao;  
import teste02.entity.Folha;  
import teste02.entity.Quadro;  
  
/** 
 * 
 * @author Alex 
 */  
@ManagedBean  
@RequestScoped  
public class QuadroBean {  
      
    private List<Quadro> cachedQuadro = null;  
    private QuadroDao quadroDao = new QuadroDao();  
    private Quadro quadro = new Quadro();  
    private FolhaDao folhaDao = new FolhaDao();  
  
    /** 
     * Creates a new instance of QuadroBean 
     */  
    public QuadroBean() {  
    }  
      
    public String adicionarQuadro() {  
        quadroDao.addQuadro(quadro);  
        /* quadro.setId(null); */  
        return "index";  
          
    }  
      
    public String removerQuadro(Quadro u) {  
        this.quadro = u;  
        quadroDao.removeQuadro(this.quadro);   
        return "index";         
    }  
      
    public List listarQuadro() {  
        cachedQuadro = quadroDao.getQuadro();  
        return this.cachedQuadro;      
    }  
      
    public String carregarQuadro(Quadro u){  
        quadro = u;  
        return "editar";     
    }  
        
    public String atualizarQuadro(){  
        quadroDao.updateQuadro(quadro);  
        return "index";  
    }  
      
     public String atualizarSenha(){  
        quadroDao.updateQuadro(quadro);  
        return "index";  
    }  
      
    public List<Quadro> getcachedQuadros() {  
        if (cachedQuadro == null) {  
            cachedQuadro = quadroDao.getQuadro();  
        }  
        return cachedQuadro;  
    }  
      
    public List<SelectItem> getFolhaLove() {  
        List<SelectItem> toReturn = new LinkedList<SelectItem>();  
        for (Folha fl : folhaDao.getFolha()) {  
            toReturn.add(new SelectItem(fl.getCdfolha(),fl.getDescfolha()));  
        }  
        return toReturn;  
    }  
  
    public Quadro getQuadro() {  
        return quadro;  
    }  
  
    public void setQuadro(Quadro quadro) {  
        this.quadro = quadro;  
    }  
  
    @Override  
    public int hashCode() {  
        int hash = 7;  
        hash = 97 * hash + (this.quadro != null ? this.quadro.hashCode() : 0);  
        return hash;  
    }  
  
    @Override  
    public boolean equals(Object obj) {  
        if (obj == null) {  
            return false;  
        }  
        if (getClass() != obj.getClass()) {  
            return false;  
        }  
        final QuadroBean other = (QuadroBean) obj;  
        if (this.quadro != other.quadro && (this.quadro == null || !this.quadro.equals(other.quadro))) {  
            return false;  
        }  
        return true;  
    }  
      
}  


Espero ter colocado todas as informações necessárias para a solução do problema.

E desde já agradeço a atenção de todos.
Alex Santos

Alex Santos

Curtidas 0

Respostas

Marcelo Senaga

Marcelo Senaga

04/07/2013

O seu converter:

@FacesConverter(value="quadroConverter")
public class QuadroConverter implements Converter {
     
    private QuadroDao quadroDao = new QuadroDao();
     
    public QuadroConverter (){
         
    }
 
    
@Override
    public Object getAsObject(FacesContext fc, UIComponent uic, String arg2) {
        Integer cdquadro = Integer.parseInt(arg2);
      try {
            return quadroDao.getquadro(cdquadro);
        } catch (ClassCastException ex) {
            Logger.getLogger(QuadroConverter.class.getName()).log(Level.SEVERE, null, ex);
        } catch (Exception ex) {
            Logger.getLogger(QuadroConverter.class.getName()).log(Level.SEVERE, null, ex);
        }  
        return null;
}
 
    @Override
    public String getAsString(FacesContext fc, UIComponent uic, Object o) {
        Quadro quadro = (Quadro) o;
        return String.valueOf(quadro.getFkfolha());
    }
     
}


Deveria tratar a folha, e não o Quadrado, pois "item" é uma folha.
GOSTEI 0
Alex Santos

Alex Santos

04/07/2013

Eu fiz a troca do conversor, mas o erro continua o mesmo.

Segue o meu conversor para folha

package teste02.conversor;

import java.util.logging.Level;
import java.util.logging.Logger;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;
import teste02.dao.FolhaDao;
import teste02.entity.Folha;

/**
 *
 * @author Alex
 */
public class FolhaConverter implements Converter {
    
     private FolhaDao folhaDao = new FolhaDao();

    
    @Override
    public Object getAsObject(FacesContext fc, UIComponent uic, String arg2) {
        Integer cdfolha = Integer.parseInt(arg2);
        try {
            return folhaDao.getfolha(cdfolha);
        } catch (Exception ex) {
            Logger.getLogger(CargoConverter.class.getName()).log(Level.SEVERE, null, ex);
        }
        return null;
    }

    @Override
    public String getAsString(FacesContext fc, UIComponent uic, Object o) {
        Folha folha = (Folha)o;
        return String.valueOf(folha.getCdfolha());
    }
    
}


Segue o faces

<h:panelGrid columns="2">
        Quadro:  <h:inputText id="cargoTxt" value="#{quadroBean.quadro.descquadro}"/>
        Folha:   <h:selectOneMenu  id="quadroNr" value="#{quadroBean.quadro.fkfolha}" required="true" requiredMessage="Selecione a Folha">  
                      <f:selectItems var="item"  value="#{folhaBean.folhaLov}" itemValue="#{item.value}" itemLabel="#{item.label}"/>
                      <f:converter converterId="FolhaConverter"/>
                 </h:selectOneMenu>
                    <h:commandButton value="Salvar" action="#{quadroBean.adicionarQuadro()}"/>                
                </h:panelGrid>


Obrigado desde já.
GOSTEI 0
Marcelo Senaga

Marcelo Senaga

04/07/2013

Ao invés de retornar um List de SelectItem, retorne um List com os objetos folha.
É essa mescla de Folha com SelectItem que está matando o converter.
GOSTEI 0
Alex Santos

Alex Santos

04/07/2013

Ao invés de retornar um List de SelectItem, retorne um List com os objetos folha.
É essa mescla de Folha com SelectItem que está matando o converter.


Eu já tinha tentado isto, mas o erro era um pouco diferente. Agora vi que faltava o () na chamada do método no faces.

Mas agora fiz as alterações e o erro continua.

faces

Folha: <h:selectOneMenu  id="quadroNr" value="#{quadroBean.quadro.fkfolha}" required="true" requiredMessage="Selecione a Folha">  
                                <f:selectItems var="item"  value="#{folhaBean.getcachedFolhas()}" itemValue="#{item.cdfolha}" itemLabel="#{item.descfolha}"/>
                                <f:converter converterId="FolhaConverter"/>
                           </h:selectOneMenu>


Bean

public List<Folha> getcachedFolhas() {
        if (cachedFolha == null) {
            cachedFolha = folhaDao.getListFolha();
        }
        return cachedFolha;
    }



Dao

public List<Folha> getListFolha() {
        return getPureList(Folha.class,"from Folha fl");
    }


Dao Generico

protected <T extends Serializable> List<T> getPureList(Class<T> classToCast,String query,Object... params) {
        Session ses = getSession();

        Query qr = ses.createQuery(query);
        for (int i = 1; i <= params.length; i++) {
            qr.setParameter(i, params[i-1]);
        }
        @SuppressWarnings("unchecked")
        List<T> toReturn = qr.list();

        ses.beginTransaction().commit();
        ses.close();
        return toReturn;
    }


O Erro

java.lang.ClassCastException: java.lang.Integer cannot be cast to teste02.entity.Folha
	at teste02.conversor.FolhaConverter.getAsString(FolhaConverter.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:924)
	at com.sun.faces.renderkit.html_basic.HtmlBasicRenderer.encodeRecursive(HtmlBasicRenderer.java:312)
	at com.sun.faces.renderkit.html_basic.GridRenderer.renderRow(GridRenderer.java:185)
	at com.sun.faces.renderkit.html_basic.GridRenderer.encodeChildren(GridRenderer.java:129)
	at javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:894)
	at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1856)
	at javax.faces.render.Renderer.encodeChildren(Renderer.java:176)
	at javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:894)
	at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1856)
	at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1859)
	at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1859)
	at com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:443)
	at com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:131)
	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:305)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
	at org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:393)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)
	at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:936)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
	at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1004)
	at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589)
	at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
	at java.lang.Thread.run(Thread.java:722)


Agradeço qualquer ajuda.

Obrigado.
GOSTEI 0
Marcelo Senaga

Marcelo Senaga

04/07/2013

Quando você faz:

itemValue="#{item.cdfolha}"


estará passando um int para o converter. Faça:

itemValue="#"


Ai vc passará o objeto folha.
GOSTEI 0
Alex Santos

Alex Santos

04/07/2013

Funcionou assim como você falou e em primeiro lugar eu quero agradecer ao ms27817 que me ajudou muito.

Mas aproveito para perguntar, se da maneira inicial ele me passa o ID que é a FK com a outra tabela, por que ele dá a mensagem que não é possível converter em numero com converter null? e mesmo eu colocando
converter="number"
ou
converter="integer"
não convertia.

Abraços e obrigado desde já.
GOSTEI 0
Marcelo Senaga

Marcelo Senaga

04/07/2013

Por receber um int, você poderia fazer:

    @Override
    public String getAsString(FacesContext fc, UIComponent uic, Object o) {
        Integer codFolha = (Integer)o;
        return String.valueOf(codFolha);
    }


Não dá para converter um int num objeto.
GOSTEI 0
POSTAR