2010-12-07 62 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中綁定的屬性的值,並且因爲我有一個掛鉤到實際組件更改組件的值和提交值以確保(找到問題),並且仍然不會在UI中反映更改?

任何想法??

回答

3

您使用的工具是錯誤的工具。您應該爲此使用Converter,而不是Validator。一個驗證器是驗證的值,而不是更改(轉換)的值。

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

} 

至於爲什麼它是不可能的驗證,這是什麼,是基本上發生:

  • 第2階段:應用請求值(inputUIInputrequestHttpServletRequest

    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

情況是,第一一些驗證發生並在最後如果驗證是確定,但該數目是9位,而不是10必須被編輯爲包含領先0我離開了額外的驗證爲了簡潔起見,但是根本不可能在驗證方法中編輯這個值嗎?需要我爲驗證器方法提供一個轉換器嗎?我知道這是更清潔的,但我想知道在jsf生命週期中是否可以在技術上做到這一點? – nkr1pt 2010-12-07 14:25:27

相關問題