Ну, Freemarker не должен знать о Необязательном, или лучше сказать, что его динамически типизировано, поэтому он работает для любого объекта.
Поскольку вы вызываете $ {data.id}, это просто вызовы toString
на Optional
, что вполне ожидаемое поведение.
Если вы хотите обработать нулевые значения в шаблоне и что вы хотите использовать Optional
, вы можете установить значение по умолчанию, если нуль, так что не будет необходимости Optional
использования:
Synopsis: unsafe_expr!default_expr or unsafe_expr! or (unsafe_expr)!default_expr or (unsafe_expr)!
Example: ${data.id!"No id."}
Или проверить, если это существует:
<#if data?? && data.id??>
Id found
<#else>
Id not found
</#if>
Для получения дополнительной информации ознакомьтесь с Freemarker docs. В частности, части: обработка отсутствующих значений и оператор проверки отсутствующих значений.
Если вы просто хотите, чтобы получить значение из Optional
в шаблоне:
${data.id.orElse('')}
или
${data.id.get()!''}