LocalDate (только) с календарем простых лиц

Я хочу отобразить элемент primefaces calendar со связанным LocalDate в компоненте Bean.

Я использовал Как использовать java.time.ZonedDateTime/LocalDateTime в p :календарь в качестве примера. Пример как есть работает нормально, НО мне не нужна временная часть и, что более важно, я не хочу, чтобы временная часть календаря отображалась.

Проблема в том, что когда я меняю pattern и удаляю часть времени:

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

преобразователь больше не вызывается/не используется вообще. Что меня немного удивляет.

Удаление pattern тоже не работает.

Есть ли альтернативный способ использовать пример без временной части? И почему конвертер больше не вызывается, когда я "упрощаю" выкройку?

JSF 2.2/Java8/Primefaces 6


person morecore    schedule 24.04.2018    source источник


Ответы (2)


Обновление ajax не запускается, потому что вы не указали какое-либо событие, при котором должно запускаться обновление.

Если вы не укажете какое-либо событие, будет использоваться тип события по умолчанию «изменение».

  • p:calendar запускает событие «изменения», когда вы вводите дату в inputText и размываете
  • p:calendar запускает событие «dateSelect», когда вы выбираете дату во всплывающем окне календаря

В вашем случае вы должны вставить несколько прослушивателей событий:

<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, как вы можете прочитать здесь https://stackoverflow.com/a/38319944/1643015)

person Alexander Bering    schedule 25.04.2018

Если вы использовали ZonedDateTimeConverter, он вообще не мог работать, потому что LocalDate не является экземпляром ZonedDateTime. Вот почему конвертер выдаст ConverterException (поскольку проверка instanceof не удалась). Вы увидите это, если вставите сообщение p:message для своего календаря p:. Используемый шаблон "дд-МММ-гггг" также не работает для ZonedDateTimeConverter, поскольку этот шаблон не предоставляет ни время, ни часовой пояс. Вот почему преобразование вызывает исключение DateTimeParseException, а преобразователь также создает исключение ConverterException. Поэтому, если вы хотите работать с LocalDate, вам нужно реализовать свой собственный конвертер, который может работать с этим классом, что очень просто. Просто возьмите ZonedDateTimeConverter и замените ZonedDateTime на LocalDate.

person Alex Fire    schedule 25.04.2018
comment
Спасибо за ответ. Любопытно, что преобразователь не запускается вообще, нет вызова getAsObject (/getAsString). Мой преобразователь работал бы - если бы его вызывали. - person morecore; 25.04.2018