2010-12-07 65 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

相关问题