Создание объекта в шаблоне скорости


Я уже рассматривал этот вопрос, но он говорит о скорости liferay и, похоже, имеет доступ к этому объекту "$portal", к которому у меня нет доступа.

Создать объект в шаблоне скорости

В частности, я пытаюсь создать объект Locale в шаблоне, чтобы передать его в $dateTool.вызов формата для получения выходных данных на определенном языке.

Я не могу создать объект locale и передать его в шаблон заранее, потому что этот код может вызвать множество шаблонов, каждый из которых может быть написан на разных языках.

Я пробовал

#set($localeClass = $portal.getClass().forName("java.util.Locale"))
$localeClass.getName

Но это просто выводит '$localeClass.getName' (я не был уверен, что $portal-это какая-то волшебная предустановленная переменная или что-то в этом роде).

Я тоже пытался

#set($localeClass = java.util.Locale.class)
$localeClass.getName

Но это дало мне исключение во время выполнения, когда я попытался обработать шаблон.

Я видел Classstool, присутствующий в Velocity, но это не поддерживает рефлексивное выполнение кода. Я думаю, я мог бы попробовать что-то вроде $classTool.inspect("java.util.Locale").getType.getConstructor([$classTool.inspect("java.util.String"),$classTool.inspect("java.util.String")]).newInstance(["es","ES"]).

Я попробую это сделать, а пока посмотрю, есть ли у кого-нибудь идея получше.

EDIT

После публикации я понял, что у velocity есть ConversionTool (который не был указан на странице обзора GenericTool), который имеет функцию toLocale, которую я могу вызвать. Так что я могу использовать
$dateTool.format('dd-MMM-yyyy', $date, $conversionTool.toLocale("es_ES"))
Но мне все еще любопытно, был ли способ достичь этого с помощью рефлексии.
2 5

2 ответа:

Вы сделали это хорошо, но вы должны использовать $localeClass.getName() или $localeClass.name вместо $localeClass.getName. Смотрите правила поиска свойств в руководстве пользователя Velocity.

Это:

#set($localeClass = $portal.getClass().forName("java.util.Locale"))
$localeClass.getName()

Правильно выводит строку " java.утиль.Локаль " для меня.

Насколько я понимаю, вы также можете использовать

$localeUtil.fromLanguageId("es_ES")

Для получения локали в шаблоне скорости.

Что касается меня, я также пытался использовать отражение для получения локали в последнее время, но не преуспел. Поэтому мне интересно, возможно ли это вообще.