我已经看过这个问题了,但它正在讨论liferay-velocity,似乎可以访问我无法访问的'$ portal'对象.
具体来说,我正在尝试在模板中创建一个Locale对象,将其传递给$ dateTool.format调用以获取特定语言的输出.
我无法预先创建语言环境对象并将其传递给模板,因为该代码可以调用各种模板,每个模板可以使用不同的语言.
我试过了
#set($localeClass = $portal.getClass().forName("java.util.Locale"))
$localeClass.getName
Run Code Online (Sandbox Code Playgroud)
但是只输出'$ localeClass.getName'(我不确定$ portal是否是一些神奇的预设变量或其他东西).
我也试过了
#set($localeClass = java.util.Locale.class)
$localeClass.getName
Run Code Online (Sandbox Code Playgroud)
但是当我尝试处理模板时,这给了我一个运行时异常.
我在Velocity中看到了ClassTool,但是它不支持自动执行代码.我想我可以尝试类似的东西$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"))
Run Code Online (Sandbox Code Playgroud)
但我仍然很好奇是否有办法通过反思来实现这一目标.
你做得很好,但你应该使用$localeClass.getName()or$localeClass.name代替$localeClass.getName。请参阅Velocity 用户指南中的属性查找规则。
这:
#set($localeClass = $portal.getClass().forName("java.util.Locale"))
$localeClass.getName()
Run Code Online (Sandbox Code Playgroud)
为我正确输出字符串“java.util.Locale”。
| 归档时间: |
|
| 查看次数: |
6368 次 |
| 最近记录: |