Richfaces Datatable在验证失败时丢失提交的输入值

时间:2014-11-07 18:01:59

标签: validation jsf datatable richfaces

我有两个输入 - 一个在“普通”h:dataTable内,一个在rich:dataTable内部当我提交错误的值,即验证失败时,“正常”保持我提交的值第二个失去它。请参阅以下代码段(输入任意值并按下按钮):

ManagedBean

@ManagedBean
@ViewScoped
public class TestController implements Serializable {

    private static final long serialVersionUID = -484022507596298941L;

    private String[] stringArray1 = {"Element 1", "Element 2"}; // + Getter
    private String[] stringArray2 = {"Element A", "Element B"}; // + Getter
    private Map<String, String> inputValues = new HashMap<String, String>(4); // + Getter

    public TestController() {
        inputValues.put(stringArray1[0], "");
        inputValues.put(stringArray1[1], "");
        inputValues.put(stringArray2[0], "");
        inputValues.put(stringArray2[1], "");
    }

    public void doSomething() {
        System.out.println("Did something");
    }

    public void validate(FacesContext facesContext, UIComponent uiComponent, Object value) {
        throw new ValidatorException(new FacesMessage("This can never be valid."));
    }
}

视图

<h:form>
    <h1>h:dataTable</h1>
    <h:dataTable id="table1" value="#{testController.stringArray1}" var="string" columnClasses="inactive">
        <h:column>
            <h:outputText value="#{string}:"/>
            <h:inputText id="someInput" value="#{testController.inputValues[string]}" validator="#{testController.validate}"/>
            <h:message for="someInput" id="msg" style="color: red;"/>
        </h:column>
    </h:dataTable>

    <h1>rich:dataTable</h1>
    <rich:dataTable id="table2" value="#{testController.stringArray2}" var="string">
        <rich:column>
            <h:outputText value="#{string}:"/>
            <h:inputText id="someInput" value="#{testController.inputValues[string]}" validator="#{testController.validate}"/>
            <h:message for="someInput" id="msg" style="color: red;"/>
        </rich:column>
    </rich:dataTable>

    <h:commandButton id="button" action="#{testController.doSomething}" value="do something"/>
</h:form>

这是已知的Richfaces行为还是某种错误?有没有办法让它的行为与普通的JSF-DataTable相同?使用h:dataTable并不总是一个选项,失去你的“我只是即将纠正它”的输入是相当烦人的。

此外: 我只是检查了ui:repeat和a4j的行为:重复并且它是一样的:ui:repeat保持提交的值而a4j:repeat则没有。

更新:重新编写示例代码以排除注释中提到的一些可能的问题(输入字段现在指向不同的值;只有一个表单元素)。

在Mojarra 2.1.21上使用RichFaces 4.3.7和JBoss AS 7以及使用RichFaces 4.5.0 Alpha3和JBoss Wildlfy的Mojarra 2.2.7进行测试 - 结果相同。

1 个答案:

答案 0 :(得分:2)

我刚刚使用Richefaces 4.3.7和Mojarra 2.2.6分别尝试了您网页的每个form,并且它完美无缺!我没有注意到任何异常行为,当验证失败时我没有丢失任何值。这意味着Richfaces组件没有验证问题。

然而,当在单个页面中使用这两个表单时,我可以注意到,当我提交第一个表单时,第二个表单的inputText会丢失它的值,而如果我们提交{{ 1}}第一种形式的form2并没有丢失它的价值,我认为这是因为JSF在inputText中存储了它的HTML组件的状态并且对Richfaces组件不做同样的事情,使用javax.faces.ViewState您可以轻松验证这两个POST请求之间唯一的公共Firebugrequest parameter