【问题标题】:After OmniFaces o:validateMultiple validation, PrimeFaces p:inputText values are lost with INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL在 OmniFaces o:validateMultiple 验证后,PrimeFaces p:inputText 值会丢失,并带有 INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL
【发布时间】:2015-03-30 15:57:59
【问题描述】:

在 OmniFaces <o:validateMultiple> 验证后,<p:inputText> 值会丢失。

我可以重现问题然后 web.xml 包含参数javax.faces.INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL:

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

如果我删除此参数 - 一切正常。

我有 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;
        }
    }
}

如果&lt;o:validateMultiple&gt; 验证失败(&lt;p:inputText&gt; 组件中的文本不相同)&lt;p:inputText id="bar1"&gt;&lt;p:inputText id="bar2"&gt; 变为空,但&lt;h:inputText id="bar3"&gt;&lt;h:inputText id="bar4"&gt; 保留值。

我认为&lt;p:inputText&gt; 不应该失去价值还是我做错了什么?


我正在使用,

  • PrimeFaces 5.1.14(或 5.2.RC2)
  • OmniFaces 1.8.1
  • Mojarra 2.2.10
  • 雄猫 8
  • Java 8

【问题讨论】:

  • 无法在 PF 5.1 + OF 1.8.1 + Mojarra 2.2.10 上重现它。我手头没有 PrimeFaces Elite 版本,但我也无法在 PF 5.2 RC2 上重现它。您可以使用 PF 5.1 或 5.2 RC2 重现它吗?如果是这样,您使用的是哪个 JSF impl/version?顺便说一句,OmniFaces 有一个&lt;o:validateEqual&gt;,其目的就是验证多个组件是否相等。
  • 是的,我可以使用 PF RC2、Mojarra 2.2.10 重现此问题。如果我从 web.xml 中删除: javax.faces.INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL 参数 - 那么一切正常。 - 有同样的问题

标签: jsf primefaces omnifaces


【解决方案1】:

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

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

如果组件已经设置了本地值,则该部分不考虑。可以通过UIInput#isLocalValueSet()查看。

如果您将其重写如下,那么它应该可以按预期工作:

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 社区问题跟踪器中创建问题 code.google.com/p/primefaces/issues/…(只有专业用户(非精英)可以创建问题)
  • 缺陷PF issue 已在 PF 5.2.RC3 中修复(我已验证)。以及 5.15(尚未发布)
猜你喜欢
  • 2020-06-08
  • 2015-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多