两个日期字段 - 一个失去价值,另一个有效

two date fields - one loses its value, the other works

我有一个包含两个日期输入字段的表单。第一个名为 dateFrom 的字段总是在页面重新加载时丢失其值,而第二个名为 dateTo 的字段工作得很好。当我填写这两个字段时,两个值都传递给 UI Bean,并且都成功地用于过滤视图(项目列表)。 UI Bean 将这两个值存储在具有会话范围的 statusObject 中。

但是页面更新后,只有dateTo还在,dateFrom一个是空的。我已经向值的 getter 和 sette 添加了一些 System.out.println() 以查看会发生什么,并且两个 setter 都被调用了一个值,然后两个 getter return 一个值。 dateFrom 字段只是忽略它从 UI Bean 获得的值。

我正在使用浏览器提供的日期字段,因此 a:type="date"。

页面如下所示:

<?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:a="http://xmlns.jcp.org/jsf/passthrough"
      xmlns:ui="http://java.sun.com/jsf/facelets"
      xmlns:f="http://java.sun.com/jsf/core"
      xmlns:h="http://java.sun.com/jsf/html">
<h:head/>

<h:body>
  <ui:composition>

    <f:loadBundle basename="de.myapp.Resources" var="bundle"/>

<!-- Some stuff removed for readability -->

    <h:form enctype="multipart/form-data" id="filterForm">
      <div class="filterBar">
        <div class="filterElement">
          <h:inputText a:type="date" id="dateFrom" size="8" maxlength="10"
                       value="#{myBean.dateFrom}"
                       converter="dateConverter"/>
        </div>
        <div class="filterElement">
          <h:inputText a:type="date" id="dateTo" size="8" maxlength="10"
                       value="#{myBean.dateTo}"
                       converter="dateConverter"/>
        </div>
      </div>
      <div class="filterElement">
        <h:commandButton id="refreshButton"
                         action="#{myBean.refreshList}"
                         value=" #{bundle.refresh}"/>
      </div>

    </h:form>

<!-- Some more stuff removed for readability -->

  </ui:composition>
</body>
</html>

我已经检查 dateFromdateTo not 出现在我删除了页面的部分内容。

UI Bean 中的 getter 和 setter

public Date getDateFrom() {
  System.out.println("getDateFrom() -> " + statusObjet.getDateFrom());
  return statusObjet.getDateFrom();
}

public void setDateFrom(final Date dateFrom) {
  if (dateFrom != null) {
    System.out.println("setDateFrom( " + dateFrom + " )");
  } else  {
    System.err.println("setDateFrom( NULL )"); // my IDE shows this colored red in the console
  }
  statusObjet.setDateFrom(dateFrom);
}

public Date getDateTo() {
  System.out.println("getDateTo() -> " + statusObjet.getDateTo());
  return statusObjet.getDateTo();
}

public void setDateTo(final Date dateTo) {
  if (dateTo != null) {
    System.out.println("setDateTo( " + dateTo + " )");
  } else {
    System.err.println("setDateTo( NULL )"); // my IDE shows this colored red in the console
  }
  statusObjet.setDateTo(dateTo);
}

除了 ID 和值 EL,这两个字段是相同的。 getter 和 setter 也是相同的(我已经仔细检查过了)。事实上,dateTo的所有代码都是dateFrom的副本,复制后在编辑器中更改(替换所有选择)。

为什么 dateTo 有效而 dateFrom 无效?

原来问题不是日期字段,而是输入的日期(以及 dateConverter 的缺陷):

我一直使用同年的 1 月 1 日12 月 31 日 测试表格。

知道浏览器提供的日期输入使用的日期格式取决于浏览器语言而不是网站语言,我编写了一个 dateConverter 来理解最重要的格式,所有格式都带有和不带前导零-数字值。
缺陷在于它是 getAsString() return 没有前导零的日期格式,并且浏览器无法理解,例如2019-1-1.

解决方案:使用单独的 DateFormat,强制 getAsString() 和 return 前导零 2019-01-01.