JSF 2 + Hibernate Converter

6 respostas
Solfier

tarde!

galera, estou desenvolvendo uma aplicação em JSF 2 com hibernate, e preciso usar um selectOneMenu que lista os valores de uma tabela do banco. Até ai tudo bem, o selectOneMenu lista tudo corretamente. O problema é quando vou salvar o registro no banco, que me aparece a mensagem: “Erro de conversão ao definir o valor ‘1’ para ‘null Converter’.”.

Pesquisando encontrei que preciso de um conversor… o problema é que não sei como usar esse conversor!!! onde crio ele? como ele funciona?

se precisar, posto o meu código.

inté!

6 Respostas

D

posta o seu código em jsf e java, e o erro que o servidor está mostrando no console. O converter é apenas opcional.

Solfier
xhtml
<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:f="http://java.sun.com/jsf/core">
    <h:head>
        <title>jpManager - Software</title>
    </h:head>
    <h:body>
        <h:form id="SoftwareForm">
            <table align="center">
                <tr>
                    <td align="center">
                        <h:outputLabel id="lblSoftwareNome" value="Software:"/>&nbsp;<h:inputText id="txtSoftwareNome" autocomplete="true" title="Nome do Software" value="#{softwareCadastroBean.softwareNome}"/>
                    </td>
                </tr>
                <tr>
                    <td align="center">
                        <h:outputLabel id="lblSoftwareVersao" value="Versão:"/>&nbsp;<h:inputText id="txtSoftwareVersao" autocomplete="true" title="Versão do Software" value="#{softwareCadastroBean.softwareVersao}"/>
                    </td>
                </tr>
                <tr>
                    <td align="center">
                        <h:outputLabel id="lblSoftwareFabricante" value="Fabricante"/>&nbsp;
                        <h:selectOneMenu id="sltSoftwareFabricante" title="Fabricante" converter="#{FabricanteConverter}" value="#{softwareCadastroBean.softwareFabricante}">
                            <f:selectItems value="#{softwareCadastroBean.fabricantes}"/>
                        </h:selectOneMenu>
                    </td>
                </tr>
                <tr>
                    <td align="center">
                        <h:outputLabel id="lblSoftwareQtdeLicenca" value="Qtde Licença:"/>&nbsp;<h:inputText id="txtSoftwareQtdeLicenca" autocomplete="true" title="Qtde Licença" value="#{softwareCadastroBean.softwareQtdeLicenca}"/><br/>
                    </td>
                </tr>
                <tr>
                    <td align="center">
                        <h:commandButton id="btnSalvar" title="Salvar" value="Salvar" action="#{softwareCadastroBean.onBtnSalvarClick}"/>
                    </td>
                </tr>
                <tr>
                    <td align="center">
                        <h:outputLabel id="lblMensagem" value="#{fabricanteCadastroBean.resposta}"/>
                    </td>
                </tr>
            </table>
        </h:form>
    </h:body>
</html>
Bean:
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package ManagedBean;

import converter.FabricanteConverter;
import dao.FabricanteDAO;
import dao.SoftwareDAO;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import javax.faces.model.SelectItem;
import vo.Fabricante;
import vo.Software;

/**
 *
 * @author alexandre.mello
 */
@ManagedBean(name = "softwareCadastroBean")
@RequestScoped
public class SoftwareCadastroBean {

    /** Creates a new instance of SoftwareCadastroBean */
    private Integer softwareId;
    private String softwareNome;
    private String softwareVersao;
    private Fabricante softwareFabricante;
    private Integer softwareQtdeLicenca;
    private String resposta;
    private ArrayList<SelectItem> fabricantes;
    public  FabricanteConverter fabricanteConverter = new FabricanteConverter();
    //private List<Fabricante> fabricantes = new ArrayList<Fabricante>();

    public ArrayList<SelectItem> getFabricantes() {
        ArrayList<SelectItem> lista = new ArrayList<SelectItem>();
        FabricanteDAO fabricanteDAO = new FabricanteDAO();
        List<Fabricante> resultado = (List<Fabricante>) fabricanteDAO.getAll();
        for (Fabricante teste : resultado) {
            SelectItem item = new SelectItem(teste.getFabricanteId(), teste.getFabricante());
            lista.add(item);
        }
        return lista;
    }

    public String getResposta() {
        return resposta;
    }

    public void setResposta(String resposta) {
        this.resposta = resposta;
    }

    public Fabricante getSoftwareFabricante() {
        return softwareFabricante;
    }

    public void setSoftwareFabricante(Fabricante softwareFabricante) {
        this.softwareFabricante = softwareFabricante;
    }

    public Integer getSoftwareId() {
        return softwareId;
    }

    public void setSoftwareId(Integer softwareId) {
        this.softwareId = softwareId;
    }

    public String getSoftwareNome() {
        return softwareNome;
    }

    public void setSoftwareNome(String softwareNome) {
        this.softwareNome = softwareNome;
    }

    public Integer getSoftwareQtdeLicenca() {
        return softwareQtdeLicenca;
    }

    public void setSoftwareQtdeLicenca(Integer softwareQtdeLicenca) {
        this.softwareQtdeLicenca = softwareQtdeLicenca;
    }

    public String getSoftwareVersao() {
        return softwareVersao;
    }

    public void setSoftwareVersao(String softwareVersao) {
        this.softwareVersao = softwareVersao;
    }

    public void onBtnSalvarClick() throws SQLException {
        if (softwareNome != null && softwareNome.length() > 0) {
            Software software = new Software();
            software.setFabricante(softwareFabricante);
            software.setNome(softwareNome);
            software.setSoftwareId(softwareId);
            software.setVersao(softwareVersao);
            software.setQtdeLicenca(softwareQtdeLicenca);
            SoftwareDAO softwareDAO = new SoftwareDAO();
            softwareDAO.insert(software);
            this.setResposta("Software Cadastrado");
        } else {
            this.setResposta("Preencha Corretamente!");
        }
    }

    public SoftwareCadastroBean() {
    }
}
classe:
package vo;
// Generated 25/07/2011 12:04:25 by Hibernate Tools 3.2.1.GA

/**
 * Software generated by hbm2java
 */
public class Software implements java.io.Serializable {

    private Integer softwareId;
    private Fabricante fabricante;
    private String nome;
    private String versao;
    private int QtdeLicenca;

    public Software() {
    }

    public int getQtdeLicenca() {
        return QtdeLicenca;
    }

    public void setQtdeLicenca(int QtdeLicenca) {
        this.QtdeLicenca = QtdeLicenca;
    }

    public Software(int softwareId, String nome, String versao) {
        this.softwareId = softwareId;
        this.nome = nome;
        this.versao = versao;
    }

    public Software(int softwareId, Fabricante fabricante, String nome, String versao) {
        this.softwareId = softwareId;
        this.fabricante = fabricante;
        this.nome = nome;
        this.versao = versao;
    }

    public int getSoftwareId() {
        return this.softwareId;
    }

    public void setSoftwareId(int softwareId) {
        this.softwareId = softwareId;
    }

    public Fabricante getFabricante() {
        return this.fabricante;
    }

    public void setFabricante(Fabricante fabricante) {
        this.fabricante = fabricante;
    }

    public String getNome() {
        return this.nome;
    }

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

    public String getVersao() {
        return this.versao;
    }

    public void setVersao(String versao) {
        this.versao = versao;
    }
}
DAO:
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package dao;

import hibernate.HibernateUtil;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import vo.Software;

/**
 *
 * @author alexandre.mello
 */
public class SoftwareDAO {
    
    private SessionFactory factory;
    private Session session;
    
    public SoftwareDAO() {
        this.factory = HibernateUtil.getSessionFactory();
        this.session = factory.openSession();
    }
    
    public void insert(Software software) {
        Transaction transaction = session.beginTransaction();
        session.save(software);
        transaction.commit();
    }
    
    public void delete(Software software) {
        Transaction transaction = session.beginTransaction();
        session.delete(software);
        transaction.commit();
    }
    
    public void update(Software software) {
        Transaction transaction = session.beginTransaction();
        session.update(software);
        transaction.commit();
    }
    
    @Override
    protected void finalize() throws Throwable {
        super.finalize();
        session.flush();
        session.close();
    }
}
Converter:
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package converter;

import dao.FabricanteDAO;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;
import javax.faces.convert.FacesConverter;
import vo.Fabricante;

/**
 *
 * @author mello
 */
@FacesConverter(value="FabricanteConverter",forClass=FabricanteConverter.class)
public class FabricanteConverter implements Converter {

    @Override
    public Object getAsObject(FacesContext fc, UIComponent uic, String string) {

        if (string == null) {
            return null;
        }
        Integer id = new Integer(string);
        FabricanteDAO fabricanteDAO = new FabricanteDAO();
        return fabricanteDAO.select(id);
        //throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public String getAsString(FacesContext fc, UIComponent uic, Object o) {

        if (o == null) {
            return null;
        }
        if (o instanceof Fabricante) {
            Fabricante f = (Fabricante) o;
            return "" + f.getFabricanteId();
        } else {
            throw new IllegalArgumentException("object:" + o + " of type:" + o.getClass().getName() + "; expected type: Fabricante");
        }
        //throw new UnsupportedOperationException("Not supported yet.");
    }
}
D

Pelo que eu vi vc cria a SelectList passando o getFabricanteId() como “id” do selectItem e o getFabricante() como valor.

Na tela o selectOneMenu está com value{…softwareFabricante} e no seu BackingBean o softwareFabricante é do tipo Fabricante.

O seu getFabricanteId() retorna um objeto do tipo fabricante por acaso?

Percebi que vc está usando o converter no selectOneMenu, só coloque se vc realmente quiser usar um conversor e saiba usar, caso contrário não ponha ele senão o jsf irá procurar uma classe conversora contendo os métodos necessários.

Solfier

Entendi a minha falha!!! muito obrigado!

então preciso que no backingBean o softwareFabricante seja Integer, para depois fazer a busca no banco, certo?!

Agora uma dúvida, o conversor seria para que?

D

isso, fazer a pesquisa pelo integer :slight_smile:

Agora o conversor serve para vc apresentar os dados na tela da forma que vc deseja. Vc pode implementar uma classe onde vc passa um objeto e ele te retorne uma string com os dados que vc espera. Eu sinceramente nunca usei para selectOneMenu, apenas para exibição de datas que necessitassem de algo que o f:dataConverter não conseguia fazer.

[]'s

Solfier

Muito obrigado, senhor!

tudo resolvido!

Criado 26 de julho de 2011
Ultima resposta 26 de jul. de 2011
Respostas 6
Participantes 2