Jsf 在OmniFaces o:validateMultiple验证之后,PrimeFaces p:inputText值将丢失,解释值为空,字符串为提交值为空

Jsf 在OmniFaces o:validateMultiple验证之后,PrimeFaces p:inputText值将丢失,解释值为空,字符串为提交值为空,jsf,primefaces,omnifaces,Jsf,Primefaces,Omnifaces,在OmniFaces验证之后,值将丢失 我可以报告问题,然后web.xml包含参数javax.faces。将\u空\u字符串\u提交的\u值\u解释为\u空: <context-param> <param-name>javax.faces.INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL</param-name> <param-value>true</param-value>

在OmniFaces
验证之后,
值将丢失

我可以报告问题,然后web.xml包含参数javax.faces。将\u空\u字符串\u提交的\u值\u解释为\u空:

<context-param>
    <param-name>javax.faces.INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL</param-name>
    <param-value>true</param-value>
</context-param>

javax.faces.explait_EMPTY_STRING_SUBMITTED_VALUES_为_NULL
真的
如果删除此参数,一切正常

我有JSF视图:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://xmlns.jcp.org/jsf/html"
      xmlns:p="http://primefaces.org/ui"
      xmlns:o="http://omnifaces.org/ui">

    <h:form id="someForm">
        <div>
            <o:outputLabel for="bar1" value="Bar1" />
            <p:inputText id="bar1" />
            <p:message for="bar1"/>
        </div>
        <div>
            <o:outputLabel for="bar2" value="Bar2" />
            <p:inputText id="bar2" />
            <p:message for="bar2"/>
        </div>
        <div>
            <o:outputLabel for="bar3" value="Bar3" />
            <h:inputText id="bar3" />
            <h:message for="bar3"/>
        </div>
        <div>
            <o:outputLabel for="bar4" value="Bar4" />
            <h:inputText id="bar4" />
            <h:message for="bar4"/>
        </div>
        <o:validateMultiple components="bar1 bar2 bar3 bar4"
                            validator="#{sameValueValidator}"
                            message="All values shold be the same"
                            showMessageFor="bar2 bar4"/>

        <p:commandButton value="submit" process="@form" update="@form" />
    </h:form>
</html>

和验证程序:

public class SameValueValidator implements MultiFieldValidator {

    @Override
    public boolean validateValues(FacesContext context,
                                  List<UIInput> components, List<Object> values) {
        if (!values.isEmpty()) {
            Object firstValue = values.get(0);
            for (Object value : values) {
                if (!Objects.equal(firstValue, value)) {
                    return false;
                }
            }
            return true;
        } else {
            return false;
        }
    }
}
公共类SameValueValidator实现多字段验证器{
@凌驾
公共布尔ValidateValue(FacesContext上下文,
列出组件,列出值){
如果(!values.isEmpty()){
Object firstValue=values.get(0);
用于(对象值:值){
如果(!Objects.equal(firstValue,value)){
返回false;
}
}
返回true;
}否则{
返回false;
}
}
}
如果
验证失败(组件中的文本不相同)
变为空,但
保留值

我认为
不应该失去价值,还是我做错了什么


我在用

  • 底漆面5.1.14(或5.2.RC2)
  • OmniFaces 1.8.1
  • 莫哈拉2.2.10
  • 雄猫8
  • 爪哇8

在启用“将空字符串解释为null”时,当提交的值为null且输入无效时,PrimeFaces呈现器似乎有一种快捷路径,这可能是为了避免一些模糊的错误。您可以在下面的第一个
if
语句中看到它(行号与PF 5.1匹配):

如果组件已经设置了本地值,则不考虑该部分。它可以通过计算机进行检查

如果您按照以下方式重写它,那么它应该可以正常工作:

68  if(config.isInterpretEmptyStringAsNull() && submittedValue == null && !input.isLocalValueSet() && context.isValidationFailed() && !input.isValid()) {
69      return null;
70  }
71  else if(submittedValue != null) {
72      return submittedValue.toString();
73  }

我可以向PF的家伙们报告,但由于您似乎拥有Pro/Elite访问权限,您最好这样做。

无法在PF 5.1+或1.8.1+Mojarra 2.2.10上复制它。我手头没有PrimeFaces精英版,但我也无法在PF 5.2 RC2上复制它。你能用PF 5.1或5.2 RC2复制它吗?如果是,您使用的是哪个JSF impl/版本?顺便说一句,OmniFaces有一个
用于验证多个组件是否相等。是的,我可以使用PF RC2,Mojarra 2.2.10重现这个问题。如果我从web.xml中删除:javax.faces.exploration_EMPTY_STRING_SUBMITTED_VALUES_为_NULL参数-那么一切正常。-在PF社区问题跟踪器中存在相同的问题创建问题(只有专业用户(非精英)可以创建问题)在PF 5.2.RC3(我已验证)中修复了缺陷。以及在5.15中(尚未发布)
68  if(config.isInterpretEmptyStringAsNull() && submittedValue == null && !input.isLocalValueSet() && context.isValidationFailed() && !input.isValid()) {
69      return null;
70  }
71  else if(submittedValue != null) {
72      return submittedValue.toString();
73  }