Создание объекта в шаблоне скорости
Я уже рассматривал этот вопрос, но он говорит о скорости 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 ответа:
Вы сделали это хорошо, но вы должны использовать
$localeClass.getName()
или$localeClass.name
вместо$localeClass.getName
. Смотрите правила поиска свойств в руководстве пользователя Velocity.Это:
#set($localeClass = $portal.getClass().forName("java.util.Locale")) $localeClass.getName()
Правильно выводит строку " java.утиль.Локаль " для меня.