Java UI中未反映支持bean中的更改值

Java UI中未反映支持bean中的更改值,java,jsf,Java,Jsf,该组件通过值绑定连接到支持bean属性 <h:inputText id="number" value="#{backingBean.number}" validator="#{backingBean.validateNumber}" /> 在调试期间,我可以验证该值是否确实被更改,但在渲染阶段,新值以某种方式被旧值覆盖。 这一定与我误解JSF生命周期有关,但在我看来,我正在更改UI中组件绑定到的属性的值,并且因为我有一个到实际组件的钩子,所以我也更改组件的值和submittedVa

该组件通过值绑定连接到支持bean属性

<h:inputText id="number" value="#{backingBean.number}" validator="#{backingBean.validateNumber}" />
在调试期间,我可以验证该值是否确实被更改,但在渲染阶段,新值以某种方式被旧值覆盖。 这一定与我误解JSF生命周期有关,但在我看来,我正在更改UI中组件绑定到的属性的值,并且因为我有一个到实际组件的钩子,所以我也更改组件的值和submittedValue以确保(找到问题)但这种变化仍然没有反映在用户界面中


有什么想法吗???

你在工作中使用了错误的工具。你应该用a来做这个,而不是a。验证器是验证值,而不是更改(转换)值

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:应用请求值(
    input
    is和
    request
    is)

  • 阶段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());
    

事实是,首先进行一些验证,最后如果验证正常,但数字是9位而不是10位,则必须对其进行编辑,以包含前导0。为了简洁起见,我省略了额外的验证,但是根本不可能在validator方法中编辑这个值吗??我需要提供一个转换器以外的验证方法只是为了这个?我知道这样做更干净,但我想知道在jsf生命周期中这样做在技术上是否可行?
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) {
    // ...
}
bean.setProperty(input.getValue());