2010-12-07 6 views
3

Le composant est câblé via une liaison de valeur à une propriété de bean de sauvegarde.La valeur de modification du bean backing n'est pas reflétée dans l'interface utilisateur

<h:inputText id="number" value="#{backingBean.number}" validator="#{backingBean.validateNumber}" /> 

Dans la méthode de validation de la valeur numérique est modifiée

public void validateNumber(FacesContext facesContext, UIComponent component, Object value) { 
    String inputValue = (String) value; 

    if (inputValue.length() == 9) { 
     inputValue = "0" + inputValue; 
     ((UIInput) component).setSubmittedValue(inputValue); 
     ((UIInput) component).setValue(inputValue); 
     setNumber(inputValue); 
    } 
} 

Lors du débogage je peux vérifier que la valeur est en fait d'être changé, mais au cours de la phase de rendu la nouvelle valeur est en quelque sorte remplacée par la vieille valeur. Cela doit avoir quelque chose à voir avec moi mal compris le cycle de vie JSF, mais la façon dont je le vois, je modifie à la fois la valeur de la propriété à laquelle le composant est lié dans l'interface utilisateur et parce que j'ai aussi changer la valeur du composant et submittedValue pour être sûr (pour trouver le problème) et encore le changement n'est pas reflété dans l'interface utilisateur?

Des idées?

Répondre

3

Vous utilisez le mauvais outil pour le travail. Vous devez utiliser un Converter pour cela, pas un . Un validateur est à valider la valeur, pas à modifier (convertir) la valeur.

public void EnterpriseNumberConverter implements Converter { 

    @Override 
    public Object getAsObject(FacesContext context, UIComponent component, String value) { 
     if (value.length() == 9) { 
      value = "0" + value; 
     } 
     return value; 
    } 

    @Override 
    public String getAsString(FacesContext context, UIComponent component, Object value) { 
     return (String) value; 
    } 

} 

Quant à savoir pourquoi il est impossible dans un validateur, voici ce qui est essentiellement passe:

  • Phase 2: appliquer les valeurs de demande (input est UIInput et request est HttpServletRequest)

    input.setSubmittedValue(request.getParameter(input.getClientId())); 
    
  • Phase 3: phase de validation.

    Object value = input.getSubmittedValue(); 
    try { 
        value = input.getConvertedValue(facesContext, value); 
    } catch (ConverterException e) { 
        // ... 
        return; 
    } 
    try { 
        for (Validator validator : input.getValidators()) 
         validator.validate(facesContext, input, value); 
        } 
        input.setSubmittedValue(null); 
        input.setValue(value); // You see? 
    } catch (ValidatorException e) { 
        // ... 
    } 
    
  • Phase 4: valeurs de modèle de mise à jour de phase.

    bean.setProperty(input.getValue()); 
    
+0

Le fait est que la première se produit une validation et à la fin si la validation est ok, mais le nombre est de 9 chiffres au lieu de 10, il doit être modifié pour contenir un 0 je suis parti à la validation supplémentaire pour des raisons de concision, mais n'est-il pas du tout possible d'éditer cette valeur dans la méthode du validateur? dois-je fournir un convertisseur en dehors de la méthode de validation pour cela? Je comprends que c'est plus propre mais j'aimerais savoir s'il est techniquement possible de le faire dans le cycle de vie jsf? – nkr1pt

+0

Non. Voir la réponse à la mise à jour. – BalusC

Questions connexes