LocalDate(仅限)与 primefaces 日历

LocalDate (only) with primefaces calendar

我想在 Bean 中显示具有关联 LocalDateprimefaces calendar 元素。

我以为例。这个例子工作正常,但我不需要时间部分,更重要的是我不希望显示日历的时间部分。

问题是当我更改 pattern 并删除时间部分时:

<p:calendar id="localDate"
        pattern="dd-MMM-yyyy"
        value="#{bean.periodFrom}">
    <f:converter converterId="localDateConverter" />
    <p:ajax update="display" />
</p:calendar>

根本不再调用/使用转换器。这让我有点吃惊。

删除 pattern 也不起作用。

是否有其他方法可以使用没有时间部分的示例?为什么当我 "simplify" 模式时不再调用转换器?

JSF 2.2/Java8/Primefaces 6

如果您使用 ZonedDateTimeConverter 它根本无法工作,因为 LocalDate 不是 分区日期时间。这就是转换器将抛出 ConverterException 的原因(因为 instanceof 检查失败)。如果您为 p:calendar 插入 p:message,您会看到这一点。 使用的模式 "dd-MMM-yyyy" 也不适用于 ZonedDateTimeConverter 因为这种模式既不 提供时间或时区。这就是为什么转换抛出 DateTimeParseException 而转换器抛出 ConverterException 也是。 因此,如果您想使用 LocalDate,您必须实现自己的转换器才能处理 class,这非常容易。只需使用 ZonedDateTimeConverter 并将 ZonedDateTime 替换为 LocalDate。

未触发 ajax 更新,因为您没有指定应触发更新的任何事件。

如果您不指定任何事件,将使用默认事件类型"change"。

  • p:calendar 触发一个 "change" 事件,当你在 inputText 和 blur
  • p:calendar 触发一个 "dateSelect" 事件,当你 select 一个日期 日历弹出窗口

在您的情况下,您应该插入多个事件侦听器:

<p:ajax update="display" />
<p:ajax event="dateSelect" update="display" />

因此您的代码将导致:

<p:calendar id="localDate"
        pattern="dd-MMM-yyyy"
        value="#{bean.periodFrom}">
    <f:converter converterId="localDateConverter" />
    <p:ajax update="display" />
    <p:ajax event="dateSelect" update="display" />
</p:calendar>

(顺便说一下:无法在同一个 p:ajax 组件中组合多个事件,您可以在此处阅读 )