При разборе файлов 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.