javasf@googlegroups.com
[Top] [All Lists]

Re: [javasf] Problema com um Converter em um componente SelectOne render

Subject: Re: [javasf] Problema com um Converter em um componente SelectOne renderizado no servidor
From: Rafael Ponte
Date: Sun, 28 Nov 2010 17:14:49 -0300
Olá Milreu, tudo bom?

Muitos questionamentos, mas vou tentar ser breve nas respostas, ok?

Bem, acredito que vale a pena a leitura destes dois posts, talvez eles te ajudem a enxergar melhor o problema:

Já li no passado que a lista de objetos no momento em que a lista é
montada e no momento em que o valor é validado devem ser iguais.
Iguais em que sentido? o método "equals" dos objetos deve ser igual?
Devem ser os mesmos objetos (mesmos endereços de memória)?

As listas devem ser a mesma durante todo o ciclo de vida da requisição (e até durante 2 ou mais requisições), esteja ela em memoria (session, por exemplo) ou seja consultada no banco de dados a cada avaliação da EL.

Quando ao equals e hashCode, o primeiro link que passei acima apresenta os motivos de sobreescreve-los corretamente.

2010/11/27 Milreu <pvmilreu@xxxxxxxxx>
Caros,

Estou com um problema ao utilizar um converter em um SelectOneMenu/
Radio.

A minha estrutura é basicamente a seguinte:

Classe ItemChoice, representa um item selecionável pelo usuário.

Tenho uma classe ItemChoiceConverter extends Converter que implementa
as seguintes regras:

       @Override
       public Object getAsObject(FacesContext arg0, UIComponent arg1, String
arg2) {
               return arg2 == null || arg2.equals("0") ? null :
getItemChoiceService().findById(new Integer(arg2));
       }

       @Override
       public String getAsString(FacesContext arg0, UIComponent arg1, Object
arg2)
       {
       return arg2 == null ? "0" : ((ItemChoice)
arg2).getId().toString();
       }

Isso funciona bem quando utilizado com inputs estáticos (tags em meus
xhtmls).

Porém, existem interfaces no meu sistema que devem ser dinamicamente
construídas. Neste caso, eu estou renderizando o selectOne "on demand"
e fazendo a devida inclusão de SelectItem e o registro do converter. O
código é o seguinte:

               for(QuestionItem item :
questionAnswer.getQuestion().getItems())
               {
                       SelectItem radio = new SelectItem(item, item.getText(),
item.getText());
                       radio.setEscape(false);

                       UISelectItem uiItem = new UISelectItem();
                       uiItem.setValue(radio);
                       radios.getChildren().add(uiItem);
               }

Até aqui tudo bem. O select com suas opções é corretamente apresentado
ao usuário. Mas na próxima requisição ao servidor ocorre um erro na
validação: "Validation error: valid is not valid".

Como exemplo, uma questão apresentada é "sexo" que tem dois
questionItem: "masculino" e "feminino".

Depurando vi que o converter do QuestionItem é chamado 3 vezes, uma
primeira com arg2 igual a string nula (dai a necessidade de fazer o
teste de nulo, o que eu já achei bizarro) e as outras duas com o
objeto questionItem corretamente definido. Nos dois casos, o id
correto do objeto é retornado.

Ao escolher "masculino", o método getAsObject é chamado e devolve
corretamente o objeto referente a "masculino".

Já li no passado que a lista de objetos no momento em que a lista é
montada e no momento em que o valor é validado devem ser iguais.
Iguais em que sentido? o método "equals" dos objetos deve ser igual?
Devem ser os mesmos objetos (mesmos endereços de memória)?

Qualquer sugestão será bem vinda. ;-)

--
Você recebeu esta mensagem por que é membro do  Javasf
http://groups.google.com/group/javasf

Conheça também o Java Brazil: http://groups.google.com/group/thejavabrazil



--
Rafael Ponte
http://www.rponte.com.br

--
Você recebeu esta mensagem por que é membro do Javasf
http://groups.google.com/group/javasf
 
Conheça também o Java Brazil: http://groups.google.com/group/thejavabrazil
<Prev in Thread] Current Thread [Next in Thread>