2010-12-07 21 views
3

コンポーネントは、バッキングBeanプロパティへの値バインディングによって配線されています。私は値が変更されている事実であることを確認することができますが、レンダリングフェーズの間に新しい値が何とか古いで上書きされるデバッグ中の検証方法ではバッキングBeanの変更値がUIに反映されない

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

数値は

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); 
    } 
} 

を変更されました値。 これはJSFのライフサイクルを誤解していると私は何か関係がありますが、実際のコンポーネントにフックを持っているため、UIのコンポーネントにバインドされているプロパティの値を変更しています。コンポーネントの値とsubmittedValueを変更して(問題を見つけるために)、変更はまだUIに反映されません。

答えて

3

ジョブに間違ったツールを使用しています。 Validatorではなく、Converterを使用してください。バリデータはになりますの値ではなく、に変更(変換)に値ではありません。

  • フェーズ2:要求値適用(inputUIInputrequestある

    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; 
        } 
    
    } 
    

    は、バリでは不可能である理由として、これは基本的には何が起こっているかでありますはHttpServletRequest

    input.setSubmittedValue(request.getParameter(input.getClientId())); 
    
  • フェーズ3:検証段階。

    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) { 
        // ... 
    } 
    
  • フェーズ4:モデル値のフェーズを更新します。

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

ファクトは、最初のいくつかの検証が発生することで、最後に検証がOKであればその数は9桁の数字の代わりに10の私が余分な検証を残し大手0を含むように編集する必要があります簡潔にするために、バリデータメソッドでこの値を編集することは全くできませんか?このためにバリデータメソッドとは別にコンバータを用意する必要がありますか?私はこれがよりクリーンであると理解していますが、jsfライフサイクルでこれを行うことが技術的に可能かどうかを知りたいのですが? – nkr1pt

+0

いいえ、回答の更新を参照してください。 – BalusC

関連する問題