簡體   English   中英

在OmniFaces o:validateMultiple驗證之后,使用INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL丟失PrimeFaces p:inputText值

[英]After OmniFaces o:validateMultiple validation, PrimeFaces p:inputText values are lost with INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL

在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;
        }
    }
}

如果<o:validateMultiple>驗證失敗( <p:inputText>組件中的<p:inputText>不相同) <p:inputText id="bar1"><p:inputText id="bar2">變為空,但<h:inputText id="bar3"><h:inputText id="bar4">保持值。

我認為<p:inputText>不應該丟失值或我做錯了什么?


我在用,

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

當提交的值為null並且輸入無效而啟用“將空字符串解釋為空”時,PrimeFaces渲染器似乎有一種快捷方式,可能是為了規避一些模糊的錯誤。 您可以在第一個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訪問時,你可能會更好。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM