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?
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"><htmlxmlns="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:formid="SoftwareForm"><tablealign="center"><tr><tdalign="center"><h:outputLabelid="lblSoftwareNome"value="Software:"/> <h:inputTextid="txtSoftwareNome"autocomplete="true"title="Nome do Software"value="#{softwareCadastroBean.softwareNome}"/></td></tr><tr><tdalign="center"><h:outputLabelid="lblSoftwareVersao"value="Versão:"/> <h:inputTextid="txtSoftwareVersao"autocomplete="true"title="Versão do Software"value="#{softwareCadastroBean.softwareVersao}"/></td></tr><tr><tdalign="center"><h:outputLabelid="lblSoftwareFabricante"value="Fabricante"/> <h:selectOneMenuid="sltSoftwareFabricante"title="Fabricante"converter="#{FabricanteConverter}"value="#{softwareCadastroBean.softwareFabricante}"><f:selectItemsvalue="#{softwareCadastroBean.fabricantes}"/></h:selectOneMenu></td></tr><tr><tdalign="center"><h:outputLabelid="lblSoftwareQtdeLicenca"value="Qtde Licença:"/> <h:inputTextid="txtSoftwareQtdeLicenca"autocomplete="true"title="Qtde Licença"value="#{softwareCadastroBean.softwareQtdeLicenca}"/><br/></td></tr><tr><tdalign="center"><h:commandButtonid="btnSalvar"title="Salvar"value="Salvar"action="#{softwareCadastroBean.onBtnSalvarClick}"/></td></tr><tr><tdalign="center"><h:outputLabelid="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. */packageManagedBean;importconverter.FabricanteConverter;importdao.FabricanteDAO;importdao.SoftwareDAO;importjava.sql.SQLException;importjava.util.ArrayList;importjava.util.List;importjavax.faces.bean.ManagedBean;importjavax.faces.bean.RequestScoped;importjavax.faces.model.SelectItem;importvo.Fabricante;importvo.Software;/** * * @author alexandre.mello */@ManagedBean(name="softwareCadastroBean")@RequestScopedpublicclassSoftwareCadastroBean{/** Creates a new instance of SoftwareCadastroBean */privateIntegersoftwareId;privateStringsoftwareNome;privateStringsoftwareVersao;privateFabricantesoftwareFabricante;privateIntegersoftwareQtdeLicenca;privateStringresposta;privateArrayList<SelectItem>fabricantes;publicFabricanteConverterfabricanteConverter=newFabricanteConverter();//private List<Fabricante> fabricantes = new ArrayList<Fabricante>();publicArrayList<SelectItem>getFabricantes(){ArrayList<SelectItem>lista=newArrayList<SelectItem>();FabricanteDAOfabricanteDAO=newFabricanteDAO();List<Fabricante>resultado=(List<Fabricante>)fabricanteDAO.getAll();for(Fabricanteteste:resultado){SelectItemitem=newSelectItem(teste.getFabricanteId(),teste.getFabricante());lista.add(item);}returnlista;}publicStringgetResposta(){returnresposta;}publicvoidsetResposta(Stringresposta){this.resposta=resposta;}publicFabricantegetSoftwareFabricante(){returnsoftwareFabricante;}publicvoidsetSoftwareFabricante(FabricantesoftwareFabricante){this.softwareFabricante=softwareFabricante;}publicIntegergetSoftwareId(){returnsoftwareId;}publicvoidsetSoftwareId(IntegersoftwareId){this.softwareId=softwareId;}publicStringgetSoftwareNome(){returnsoftwareNome;}publicvoidsetSoftwareNome(StringsoftwareNome){this.softwareNome=softwareNome;}publicIntegergetSoftwareQtdeLicenca(){returnsoftwareQtdeLicenca;}publicvoidsetSoftwareQtdeLicenca(IntegersoftwareQtdeLicenca){this.softwareQtdeLicenca=softwareQtdeLicenca;}publicStringgetSoftwareVersao(){returnsoftwareVersao;}publicvoidsetSoftwareVersao(StringsoftwareVersao){this.softwareVersao=softwareVersao;}publicvoidonBtnSalvarClick()throwsSQLException{if(softwareNome!=null&&softwareNome.length()>0){Softwaresoftware=newSoftware();software.setFabricante(softwareFabricante);software.setNome(softwareNome);software.setSoftwareId(softwareId);software.setVersao(softwareVersao);software.setQtdeLicenca(softwareQtdeLicenca);SoftwareDAOsoftwareDAO=newSoftwareDAO();softwareDAO.insert(software);this.setResposta("Software Cadastrado");}else{this.setResposta("Preencha Corretamente!");}}publicSoftwareCadastroBean(){}}
classe:
packagevo;// Generated 25/07/2011 12:04:25 by Hibernate Tools 3.2.1.GA/** * Software generated by hbm2java */publicclassSoftwareimplementsjava.io.Serializable{privateIntegersoftwareId;privateFabricantefabricante;privateStringnome;privateStringversao;privateintQtdeLicenca;publicSoftware(){}publicintgetQtdeLicenca(){returnQtdeLicenca;}publicvoidsetQtdeLicenca(intQtdeLicenca){this.QtdeLicenca=QtdeLicenca;}publicSoftware(intsoftwareId,Stringnome,Stringversao){this.softwareId=softwareId;this.nome=nome;this.versao=versao;}publicSoftware(intsoftwareId,Fabricantefabricante,Stringnome,Stringversao){this.softwareId=softwareId;this.fabricante=fabricante;this.nome=nome;this.versao=versao;}publicintgetSoftwareId(){returnthis.softwareId;}publicvoidsetSoftwareId(intsoftwareId){this.softwareId=softwareId;}publicFabricantegetFabricante(){returnthis.fabricante;}publicvoidsetFabricante(Fabricantefabricante){this.fabricante=fabricante;}publicStringgetNome(){returnthis.nome;}publicvoidsetNome(Stringnome){this.nome=nome;}publicStringgetVersao(){returnthis.versao;}publicvoidsetVersao(Stringversao){this.versao=versao;}}
/* * To change this template, choose Tools | Templates * and open the template in the editor. */packageconverter;importdao.FabricanteDAO;importjavax.faces.component.UIComponent;importjavax.faces.context.FacesContext;importjavax.faces.convert.Converter;importjavax.faces.convert.FacesConverter;importvo.Fabricante;/** * * @author mello */@FacesConverter(value="FabricanteConverter",forClass=FabricanteConverter.class)publicclassFabricanteConverterimplementsConverter{@OverridepublicObjectgetAsObject(FacesContextfc,UIComponentuic,Stringstring){if(string==null){returnnull;}Integerid=newInteger(string);FabricanteDAOfabricanteDAO=newFabricanteDAO();returnfabricanteDAO.select(id);//throw new UnsupportedOperationException("Not supported yet.");}@OverridepublicStringgetAsString(FacesContextfc,UIComponentuic,Objecto){if(o==null){returnnull;}if(oinstanceofFabricante){Fabricantef=(Fabricante)o;return""+f.getFabricanteId();}else{thrownewIllegalArgumentException("object:"+o+" of type:"+o.getClass().getName()+"; expected type: Fabricante");}//throw new UnsupportedOperationException("Not supported yet.");}}
D
duducordeiro_
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
duducordeiro_
isso, fazer a pesquisa pelo integer
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.