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

Validation Richfaces Datatable在验证失败时丢失输入的提交值,validation,jsf,datatable,richfaces,Validation,Jsf,Datatable,Richfaces,我有两个输入-一个在“正常”的h:dataTable中,一个在rich:dataTable中。当我提交错误的值时,即验证失败,“正常”一个保留我提交的值,而第二个丢失它。请参阅以下代码段(输入任意值并按下按钮): ManagedBean @ManagedBean @视域 公共类TestController实现可序列化{ 私有静态最终长serialVersionUID=-484022507596298941L; 私有字符串[]stringArray1={“元素1”,“元素2”};//+Getter

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

ManagedBean
@ManagedBean
@视域
公共类TestController实现可序列化{
私有静态最终长serialVersionUID=-484022507596298941L;
私有字符串[]stringArray1={“元素1”,“元素2”};//+Getter
私有字符串[]stringArray2={“元素A”,“元素B”};//+Getter
私有映射inputValues=newhashmap(4);//+Getter
公共测试控制器(){
inputValues.put(stringArray1[0],“”);
inputValues.put(stringArray1[1],“”);
inputValues.put(stringArray2[0],“”);
inputValues.put(stringArray2[1],“”);
}
公共无效剂量测定法(){
System.out.println(“做了某事”);
}
公共无效验证(FacesContext FacesContext、UIComponent UIComponent、对象值){
抛出新的ValidatorException(新的FacesMessage(“这永远不会有效”);
}
}
看法

h:数据表
rich:dataTable
这是已知的Richfaces行为还是某种错误?有没有办法让它的行为与普通JSF数据表的行为相同?相反,使用
h:dataTable
并不总是一个选项,而丢失“I-was-just-to-correct-it”输入是相当烦人的

补充: 我刚刚检查了ui:repeat和a4j:repeat的行为,结果完全一样:ui:repeat保留提交的值,而a4j:repeat不保留提交的值

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


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

我刚刚使用RichFaces 4.3.7和Mojarra 2.2.6分别尝试了页面的每个
表单,效果非常好!我没有注意到任何异常行为,当验证失败时,我没有丢失任何值。这意味着Richfaces组件没有验证问题


但是,当在一个页面中使用这两个表单时,我可以注意到,当我提交第一个表单时,第二个表单的
inputText
失去了它的值,而如果我们提交
form2
第一个表单的
inputText
没有失去它的值,在我看来,这是因为JSF将其HTML组件的状态存储在
javax.faces.ViewState
中,而对Richfaces组件则没有这样做,使用
Firebug
您可以轻松验证这两个POST请求之间唯一常见的
请求参数是
javax.faces.ViewState

您是这样使用它的吗?在同一页中有两个表单?是的,一个用于一般导航,一个用于用户提供的输入。当阅读本文时,我得到的印象是,两个表单并行应该是可以的。可能问题是两种形式的操作都是在同一个值上。@cheffe是的,关于BalusC的回答,使用并行形式没有问题。但是,问题不在于使用相同的值,因为我用两个不同的值测试了它,但是我得到了相同的行为,我一次用一种形式局部测试了它,同样的问题。我没有你的Mojarra版本,我会在下一步检查。@Louise你有哪个版本?从我能告诉你的2.1.21。附带JBoss AS 7
@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>