JSF/ValueChangeListener

Les value change listeners sont invoqués en fin de phase PROCESS VALIDATION, si la local value du composant à l'origine de l'évènement a été modifiée depuis la dernière requête HTTP. Ces listeners sont souvent difficiles à exploiter, car les champs d'instance des backing beans sont mis à jour plus tard, pendant la phase UPDATE MODEL VALUES (invocation des setters dans les backing beans) : si le but de notre value change listener était de mettre à jour un champ du backing bean, ce dernier est alors écrasé. L'astuce suivante permet de relancer l'évènement value change event après l'invocation des setters des backing beans :

public void myValueChangeListener(ValueChangeEvent event) {
  PhaseId phaseId = event.getPhaseId();
  if (phaseId.equals(PhaseId.ANY_PHASE)) {
     event.setPhaseId(PhaseId.UPDATE_MODEL_VALUES);
     event.queue();
  } else if (phaseId.equals(PhaseId.UPDATE_MODEL_VALUES)) {
     // le champ d'instance myValue est mis à jour par
     // le listener et ne sera pas écrasé plus tard par
     // invocation du setter
     this.myValue = event.getNewValue();
  }
}