12/11/09

JSF e ValueChangeListeners que não funcionam

Um problema que vi vários encontrarem quando usam JSF é que os listeners do ValueChangeEvent tinham suas mudanças sobrescritas/não efetuadas sem motivo aparente. Eu mesmo tive este problema esta semana: usando um bean com escopo request, o método usado para tratar o ValueChangeEvent não conseguia alterar um valor na minha classe.

Na página JSF, o componente usado era um h:selectOneRadio, da seguinte maneira:

<h:selectOneRadio 
    value="#{bean.valor}" 
    valueChangeListener="#{bean.mudaTipo}" 
    onchange="submit();" 
    onclick="submit();">
O método a seguir é como eu o tinha feito originalmente no bean:
public void mudaTipo(ValueChangeEvent event) {
    this.setValor(!valor);
}
Embora o método fosse chamado, o valor atribuído na chamada não era preservado quando o resto do form era submetido. Mudar o bean para escopo session resolve o problema, mas não era uma solução ideal no meu caso.

Após um bom tempo procurando e batendo a cabeça encontrei este post salvador, e "meus pobrema se acabaram-se"! O autor fala sobre três soluções para o problema, mas a que resolveu meu problema foi a segunda: mover o evento ValueChangeEvent para a fase UPDATE_MODEL_VALUES.

Com o código atualizado, o método ficou assim:
public void mudaTipo(ValueChangeEvent event) {
  PhaseId phaseId = event.getPhaseId();
  //pega o novo valor
  boolean newValue = (Boolean) event.getNewValue();
  if (phaseId.equals(PhaseId.ANY_PHASE))
  {
    //agenda o evento para a fase que nos interessa
    event.setPhaseId(PhaseId.UPDATE_MODEL_VALUES);
    event.queue();
  }
  else if (phaseId.equals(PhaseId.UPDATE_MODEL_VALUES))
  {
    //aqui vai o método de antes (um pouco mudado)
    this.setValor(newValue);
  }
}
Assim, o setter do bean é chamado junto com os outros setters no envio da form, e tudo funciona como esperado.
De novo, o crédito da solução é do Dave.

10/18/09

Outro sorteio de jogo: Call of Duty Modern Warfare 2

É isso aí, o pessoal da Playfire está sorteando 5 cópias do CoD: Modern Warfare 2 pra quem responder um questionário (sobre o jogo).

Clique aqui para acessar o questionário

Como não quero ser egoísta (longe disso, heheheh), essas são as respostas do questionário:

1. Infinity Ward
2. PS3, Xbox 360 and PC
3. November 10th 2009
4. fourzerotwo
5. Dual-wield handguns
6. Modern Warfare 2: Ghost
7. False - it's one iteration on
8. Square Enix
9. Task Force 141
10. Sargeant Gary "Roach" Sanderson

Fonte: A internets (e o Takeshi).

1/20/09

Links atualizados!

Pro pessoal que vem parar aqui no blog por causa dos posts (quase nada chamativos :P ) oferecendo os jogos Command & Conquer Gold e Far Cry para download grátis, atualizei os links que agora funcionam apropriadamente:

Command & Conquer Gold Grátis (palavras-chave apropriadas são fundamentais heheh)
Far Cry Grátis (este precisa duma conta no site Ubi.com, e tem propaganda dentro do jogo)

Fato Curioso: toda semana, mais ou menos 50 pessoas chegam nesse blog vindas do google, procurando estes jogos.