Есть ли у Freemarker какая-либо интеграция с JodaTime? - PullRequest
3 голосов
/ 09 марта 2011

Есть ли способы легкого форматирования объектов Joda DateTime во Freemarker?Например, с датами Java мы могли бы использовать? String и другие директивы.

Я знаю, что мог бы вызвать toDate и получить дату Java, но я надеялся, что есть лучший способ.

Ответы [ 4 ]

9 голосов
/ 22 марта 2011

Вы должны иметь возможность вызывать метод toString(String pattern) напрямую из Freemarker:

${dateTime.toString('MM-dd-yy')}

(не проверено)

9 голосов
/ 24 июля 2012

Существует даже более простой способ сделать это, если вы не хотите разбрызгивать toString('MM-dd-yy') по всем вашим шаблонам.

Просто расширьте DefaultObjectWrapper Freemarker, чтобы он понимал Joda Time из коробки:

public class JodaAwareObjectWrapper extends DefaultObjectWrapper {

  @Override
  public TemplateModel wrap(final Object obj) throws TemplateModelException {
    if (obj == null) { return super.wrap(obj); }
    if (obj instanceof LocalDate) { return new SimpleDate(((LocalDate) obj).toDate(), TemplateDateModel.DATE); }
    // add support for all desired types here...
    return super.wrap(obj);
  }
}

и передайте эту обёртку объекта в конфигурацию FreeMarker при запуске движка FreeMarker

Configuration config = // ...
config.setObjectWrapper(new JodaAwareObjectWrapper());

Затем вы можете использовать стандартные встроенные даты FreeMarkers, такие как ${dateTime?date}, в своих шаблонах

3 голосов
/ 10 марта 2011

Я не верю, что в настоящее время существует какая-либо интеграция в Freemarker для JodaTime. Довольно просто поместить объект в вашу модель для форматирования, т.е.

Напишите класс "MyCustomJodaFormatterBean" с методом форматирования (шаблон String, DateTime dateTime). Поместите экземпляр этого в корень.

root.put ("joda", новый MyCustomJodaFormatterBean ()); * +1006 *

Тогда в freemarker,

${joda.format("MM-dd-yyy", dateTime)}
2 голосов
/ 26 мая 2016

При разборе файлов FTL freemarker строит свою внутреннюю модель объектов.Например, выражения java.util.Date заключены в freemarker.template.SimpleDate .Если значение выражения вашей модели имеет тип org.joda.time.DateTime - что неизвестно для freemarker, по умолчанию оно будет перенесено в freemarker.ext.beans.StringModel , преобразовав DateTime в строку, используяметод toString ().

Например, предположим, что мы имеем в выражении FTL, например:

med.expiryDate?date <= today?date

Где "med.expiryDate" имеет тип DateTime.«med.expiryDate» будет помещен в freemarker.ext.beans.StringModel, и после этого «med.expiryDate? date» будет проанализирован с использованием freemarker.template.Configuration dateFormat .Что может привести к исключению, если этот dateFormat отличается от формата по умолчанию DateTime.toString ().

Чтобы исправить это, вы должны заставить Freemarker понимать, что DateTime также является датой, а не строкой.Напишите свой пользовательский обёртку объекта:

/**
 * Wrapper to make freemarker identify org.joda.time.DateTime objects as date.
 * User: evvo
 * Date: 5/26/2016
 * Time: 18:21
 */
public class DateTimeAwareObjectWrapper extends DefaultObjectWrapper {

   @Override
   public TemplateModel wrap(Object obj) throws TemplateModelException {
      if (obj instanceof DateTime) {
         return new SimpleDate(((DateTime) obj).toDate(), getDefaultDateType());
      }
      return super.wrap(obj);
   }
}

и установите его в конфигурацию freemarker

configuration.setObjectWrapper(new DateTimeAwareObjectWrapper());

После такого изменения я верю, что суффикс ? String также будет работать с выражением DateTime.

...