JSF 2 + selectOneMenu + Converter

284 views
Skip to first unread message

Ythalo Rossy

unread,
Dec 1, 2013, 7:24:13 PM12/1/13
to ce...@googlegroups.com, javace
Caros,

Passei algumas horas tentando identificar uma melhor solução para utilizar um selectOneMenu sem a necessidade de um Converter. Explico:

VIEW

Desejo associar o itemValue="#{marca}" do selectItems ao #{automovelBean.automovel.marca}

<h:selectOneMenu id="comboMarcas" value="#{automovelBean.automovel.marca}" converter="br.com.ythalorossy.view.converters.MarcaConverter">
<f:selectItem itemLabel="-- Selecione --" noSelectionOption="true"/>
<f:selectItems value="#{marcaBean.marcas}" var="marca" itemValue="#{marca}" itemLabel="#{marca.nome}"/>
<f:ajax event="change" execute="@this" render="comboModelos"/>
</h:selectOneMenu>


MANAGED BEAN

@ManagedBean
@ViewScoped
public class AutomovelBean implements Serializable{

@Inject private AutomovelDAO automovelDAO;
private Automovel automovel = new Automovel();
...
}

@ManagedBean
@ViewScoped
public class MarcaBean implements Serializable{

        @Inject private MarcaDAO marcaDAO;

public List<Marca> getMarcas() {
return marcaDAO.listarTodasComModelos();
}
...
}

MODEL (exemplo)

public class Automovel {
private Marca marca;
}


Problemas:

A associação natural não funciona, o itemValue guarda como valor uma representação "br.com.ythalorossy.model.Marca@a016b29" do objeto não o valor, identificador, por exemplo. Obtendo como resultado um valor null.

Solução paliativa associando o valor do selectOneMenu a uma variável de instância dentro do MB.

Conversão automática do itemValue do selectItens para a variável dentro do MB

Soluções encontradas

Conversores, ainda não consegui ter um bom resultado

Ou criando workaround como esse:

Alguém tem alguma solução menos complexa, estou enferrujado no JSF.

Att.

--
--
Ythalo Rossy Saldanha Lira
Analista de Sistemas 4
Sefaz Ce - Cesinf - NFe

Sun Certified Programmer for Java
http://yross.wordpress.com
http://about.me/ythalorossy

Marcus Mazzo Laprano

unread,
Dec 1, 2013, 7:27:17 PM12/1/13
to ce...@googlegroups.com

Ja pensou em apontar o itemValue para {marca.id}?

--
Você está recebendo esta mensagem porque se inscreveu no grupo "CEJUG" dos Grupos do Google.
Para cancelar a inscrição neste grupo e parar de receber seus e-mails, envie um e-mail para cejug+un...@googlegroups.com.
Para postar neste grupo, envie um e-mail para ce...@googlegroups.com.
Visite este grupo em http://groups.google.com/group/cejug.
Para obter mais opções, acesse https://groups.google.com/groups/opt_out.

Hildeberto Mendonça Filho

unread,
Dec 2, 2013, 3:44:42 AM12/2/13
to ce...@googlegroups.com
Oi Ythalo,

Eu particularmente prefiro usar uma variável no MB do que criar um Converter. Minha motivação é escrever menos código, mesmo que isso desfavoreça a elegância.  Só criaria um converter se o h:selectOneMenu com o mesmo tipo de dado se repetisse muito dentro do projeto. Ai eu acredito que ficaria mais enxuto.

Chris Allen Barroso

unread,
Dec 2, 2013, 3:49:58 AM12/2/13
to Cejug
Bom dia Ythalo,
Já que vc quer uma simplicidade vai ai a forma que eu costumo fazer. 

<p:selectOneMenu value="#{usuarioBean.usuUsuario.perPerfil.perId}" required="true">  
      <f:selectItem itemLabel="Selecionar" itemValue="" />  
       <f:selectItems value="#{perfilBean.selectItems}" />  
</p:selectOneMenu>  

Repare que o valor é o perId (reforçando o que o marcus falou).
E o metodo selectItems: 

  public List<SelectItem> getSelectItems() {
        this.selectItems = new ArrayList<SelectItem>();
        PerfilDao perDao = new PerfilDaoImp();
        List<PerPerfil> perfils = perDao.selectItems();
        for (PerPerfil perPerfil : perfils) {
            SelectItem selectItem = new SelectItem(perPerfil.getPerId(), perPerfil.getPerDescricao());
            this.selectItems.add(selectItem);
        }
        return selectItems;
    }

Se for essa a sua duvida, creio que com isso revolves seu problema. 



--
Chris Allen Barroso
Analista de Sistemas | Desenvolvedor Java  
Ministério de Planos e Finanças 
@Chravent




Date: Sun, 1 Dec 2013 22:27:17 -0200
Subject: Re: [CEJUG] JSF 2 + selectOneMenu + Converter
From: marcus...@gmail.com
To: ce...@googlegroups.com

Evandir Rodrigo

unread,
Dec 2, 2013, 7:44:35 AM12/2/13
to ce...@googlegroups.com
Olá,

     Segue uma sugestão de implementação para um conversor genérico.
         
   
       @FacesConverter("xptoConverter")
public class XptoConverter implements Converter {
 
public Object getAsObject(FacesContext ctx, UIComponent component, String value) {
return component.getAttributes().get(value);
}
 
public String getAsString(FacesContext ctx, UIComponent component, Object value) {
 
String objAsString = null;
if ( value != null ) {
objAsString = Integer.toString(System.identityHashCode(value));
component.getAttributes().put(objAsString, value);
}
 
return objAsString;
}
}

<h:selectOneMenu id="marcasItems" converter="xptoConverter" value="#{xptoBean.entidade.marca}"> <f:selectItem itemLabel="Selecione uma Marca" noSelectionOption="true" /> <f:selectItems value="#{xptoBean.marcas}" var="marca" itemValue="#{marca}" itemLabel="#{marca.nome}" /> </h:selectOneMenu>
       
     
      O que vcs acham?
    


2013/12/2 Chris Allen Barroso <barros...@hotmail.com>

Jocélio Otávio

unread,
Dec 2, 2013, 3:35:49 PM12/2/13
to ce...@googlegroups.com
Porque que você utilizou System.identityHashCode(value) ao invés de value.hashCode()? 

Há um risco em se utilizar hashcode porque objetos diferentes podem gerar o mesmo código, a probabilidade é muito pequena, mas o risco existe.
Atenciosamente,

Jocélio Otávio
UECE - Ciências da Computação
Analista Java - SCJP / SCWCD
BRQ

Evandir Rodrigo

unread,
Dec 2, 2013, 5:04:43 PM12/2/13
to ce...@googlegroups.com
Oi Jocélio,

    O método System.identityHashCode retorna o código hash gerado pela implementação padrão do método hashCode(), mesmo a classe sobrescrevendo tal método. Com isso, supostamente, evito que dois objetos distintos retornem o mesmo hash. 

    Espero ter respondido sua questão.

Att,




2013/12/2 Jocélio Otávio <jocelio...@gmail.com>

Jocélio Otávio

unread,
Dec 4, 2013, 9:50:37 AM12/4/13
to ce...@googlegroups.com
Humm entendi, interessante essa abordagem, não conhecia. Valew Evandir.
Reply all
Reply to author
Forward
0 new messages