Estou carregando uma lista de objetos do tipo TgrupoVerbas num p:selectOneMenu
No xhtml:
<p:selectOneMenu id="tipoVerba"
value="#{tverbaBean.tverbas.tipoVerba}">
<f:selectItem itemLabel="Selecione" />
<f:selectItems value="#{tverbaBean.listSelect}" />
</p:selectOneMenu>
no MB:
//CARREGA SELECTONEMENU
public List<SelectItem> getListSelect() {
if(this.listSelect == null){
listSelect = new ArrayList<SelectItem>();
TgrupoVerbasRN tgrupoVerbasRN = new TgrupoVerbasRN();
List<TgrupoVerbas> tgruposLista = tgrupoVerbasRN.listar();
if(tgruposLista != null && !tgruposLista.isEmpty()){
SelectItem item;
for(TgrupoVerbas itemLista : tgruposLista){
item = new SelectItem(itemLista, itemLista.getiGrupoVerba());
listSelect.add(item);
}
}
}
return listSelect;
}
Converter:
@FacesConverter(forClass = TgrupoVerbas.class)
public class TgrupoVerbasConverter implements Converter{
@Override
public Object getAsObject(FacesContext context, UIComponent component, String value) {
if (value != null && value.trim().length() > 0){
Integer codigo = Integer.valueOf(value);
try {
TgrupoVerbasRN tgrupoVerbasRN = new TgrupoVerbasRN();
return tgrupoVerbasRN.buscarPorCodigo(codigo);
} catch (Exception e) {
throw new ConverterException("Não foi possível encontrar o registro pelo código: " + value + "Erro: " + e.getMessage());
}
}
return null;
}
@Override
public String getAsString(FacesContext context, UIComponent component, Object value) {
if(value != null) {
TgrupoVerbas tgrupoVerbas = (TgrupoVerbas) value;
return tgrupoVerbas.getiGrupoVerba().toString();
}
return "";
}
}
Quando eu aciono o “salvar” na tela, o Converter é chamado no método getAsObject(FacesContext context, UIComponet component, String value)
Mas esse “value” está vindo o descritivo[“Salário”] e não o código[1], o que ocasiona uma exceção na conversão Integer codigo = Integer.valueOf(value);
Já verifiquei em vários tópicos e vídeos tutoriais, mas não identifiquei nenhum erro no código. Como posso setar o id ao invés do descritivo?
Você pode definir o itemValue e itemLabel para o componente f:selectItems, quando não o faz, o mecanismo do JSF define a descrição para ambos.
Luiz Augusto, obrigado pela resposta.
Acabei esquecendo de mencionar na pergunta, mas eu estava usando itemValue e itemLabem logo antes de postar a pergunta, mesmo assim não havia diferença nenhuma, o converter continuava a receber o descritivo.
<p:selectOneMenu id="tipoVerba"
value="#{tverbaBean.tverbas.tipoVerba}">
<f:selectItem itemLabel="Selecione" />
<f:selectItems value="#{tverbaBean.listSelect}" var="grupo"
itemValue="#{grupo.codGrupoVerba}"
itemLabel="#{grupo.codGrupoVerba}" />
</p:selectOneMenu>
itemLabel e itemValue estão iguais? Está certo isso?
E qual o html gerado?
Realmente, estava errado. O correto seria:
<p:selectOneMenu id="tipoVerba"
value="#{tverbaBean.tverbas.tipoVerba}">
<f:selectItem itemLabel="Selecione" />
<f:selectItems value="#{tverbaBean.listSelect}" var="grupo"
itemValue="#{grupo.codGrupoVerba}"
itemLabel="#{grupo.iGrupoVerba}" />
</p:selectOneMenu>
Estranhamente carrega corretamente em ambos os casos:

Ele parece estar ignorando essa definição no xhtml, e setando no combo a partir do Bean:
Creio que foi por isso que eu tinha retirado o itemValue e o itemLabel do xhtml.
Ainda assim, qual é o html gerado? Botão direito do mouse sobre o combo criado > inspecionar ou exibir código fonte
<div class="form-group input-group">
<span class="input-group-addon"> </span><div id="tverbaCadastro:tipoVerba" class="ui-selectonemenu ui-widget ui-state-default ui-corner-all"><div class="ui-helper-hidden-accessible"><input id="tverbaCadastro:tipoVerba_focus" name="tverbaCadastro:tipoVerba_focus" type="text" autocomplete="off" role="combobox" aria-haspopup="true" aria-expanded="false" aria-labelledby="tverbaCadastro:j_idt47" /></div><div class="ui-helper-hidden-accessible"><select id="tverbaCadastro:tipoVerba_input" name="tverbaCadastro:tipoVerba_input" tabindex="-1"><option value="" selected="selected">Selecione</option><option value="Benefícios Obrigatórios">Benefícios Obrigatórios</option><option value="Benefícios Facultativos">Benefícios Facultativos</option><option value="Salário">Salário</option></select></div><label id="tverbaCadastro:tipoVerba_label" class="ui-selectonemenu-label ui-inputfield ui-corner-all"> </label><div class="ui-selectonemenu-trigger ui-state-default ui-corner-right"><span class="ui-icon ui-icon-triangle-1-s ui-c"></span></div><div id="tverbaCadastro:tipoVerba_panel" class="ui-selectonemenu-panel ui-widget ui-widget-content ui-corner-all ui-helper-hidden ui-shadow"><div class="ui-selectonemenu-items-wrapper" style="height:auto"><ul id="tverbaCadastro:tipoVerba_items" class="ui-selectonemenu-items ui-selectonemenu-list ui-widget-content ui-widget ui-corner-all ui-helper-reset" role="listbox"><li class="ui-selectonemenu-item ui-selectonemenu-list-item ui-corner-all" data-label="Selecione" tabindex="-1" role="option">Selecione</li><li class="ui-selectonemenu-item ui-selectonemenu-list-item ui-corner-all" data-label="Benefícios Obrigatórios" tabindex="-1" role="option">Benefícios Obrigatórios</li><li class="ui-selectonemenu-item ui-selectonemenu-list-item ui-corner-all" data-label="Benefícios Facultativos" tabindex="-1" role="option">Benefícios Facultativos</li><li class="ui-selectonemenu-item ui-selectonemenu-list-item ui-corner-all" data-label="Salário" tabindex="-1" role="option">Salário</li></ul></div></div></div><script id="tverbaCadastro:tipoVerba_s" type="text/javascript">$(function(){PrimeFaces.cw("SelectOneMenu","widget_tverbaCadastro_tipoVerba",{id:"tverbaCadastro:tipoVerba"});});</script>
</div>
Entendi errado. Segue>
Ele ainda tá pegando o valor incorreto
<option value="Benefícios Obrigatórios">Benefícios Obrigatórios</option>
Analisando o código com o pessoal aqui do trabalho, conseguimos identificar o erro. O converter estava retornando o descritivo e não o código. Falta de atenção da minha parte.
Segue como ficou o converter {a linha comentada é onde estava o return errado}
public class TgrupoVerbasConverter implements Converter{
@Override
public Object getAsObject(FacesContext context, UIComponent component, String value) {
if (value != null && value.trim().length() > 0){
Integer codigo = Integer.valueOf(value);
try {
TgrupoVerbasRN tgrupoVerbasRN = new TgrupoVerbasRN();
return tgrupoVerbasRN.buscarPorCodigo(codigo);
} catch (Exception e) {
throw new ConverterException("Não foi possível encontrar o registro pelo código: " + value + "Erro: " + e.getMessage());
}
}
return null;
}
@Override
public String getAsString(FacesContext context, UIComponent component, Object value) {
if(value != null) {
TgrupoVerbas tgrupoVerbas = (TgrupoVerbas) value;
//return tgrupoVerbas.getiGrupoVerba().toString();
return String.valueOf(tgrupoVerbas.getCodGrupoVerba());
}
return "";
}
}
Mais uma vez obrigado aos que tentaram ajudar.
O converter estava retornando o campo errado, postei a resposta completa. Muito obrigado cara.