我已经看过这个问题了,但它谈论的是 liferay-velocity 并且似乎可以访问我无权访问的这个“$portal”对象。
Create object in velocity template
具体来说,我尝试在模板中创建一个 Locale 对象,将其传递到 $dateTool.format 调用中,以获取特定语言的输出。
我无法创建区域设置对象并将其预先传递到模板中,因为该代码可以调用各种模板,每个模板都可以采用不同的语言。
我已经尝试过
#set($localeClass = $portal.getClass().forName("java.util.Locale"))
$localeClass.getName
但这只是输出“$localeClass.getName”(我不确定 $portal 是否是某种神奇的预设变量或其他东西)。
我也尝试过
#set($localeClass = java.util.Locale.class)
$localeClass.getName
但是当我尝试处理模板时,这给了我一个运行时异常。
我看到了ClassTool Velocity 中存在,但不支持代码的反射执行。我想我可以尝试类似 $classTool.inspect("java.util.Locale").getType.getConstructor([$classTool.inspect("java.util.String"),$classTool.inspect("java .util.String")]).newInstance(["es","ES"])
。
我会尝试一下,但同时我会看看其他人是否有更好的想法。
编辑
自从发帖以来,我意识到velocity有一个ConversionTool(它没有在他们的GenericTool概述页面上列出),它有一个我可以调用的toLocale函数。所以我可以使用
$dateTool.format('dd-MMM-yyyy', $date, $conversionTool.toLocale("es_ES"))
但我仍然很好奇是否有办法通过反射来完成此任务。
最佳答案
你做得很好,但你应该使用$localeClass.getName()
或$localeClass.name
而不是$localeClass.getName
。请参阅Property Lookup Rules在 Velocity 用户指南中。
这个:
#set($localeClass = $portal.getClass().forName("java.util.Locale"))
$localeClass.getName()
为我正确输出字符串“java.util.Locale”。
关于velocity - 在速度模板中创建对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12321029/