Freemarker的“ .vars”名称不能包含破折号吗?

问题描述

| 我们正在使用Freemarker 2.3.16版,而我刚刚在其中一个应用程序中找到了一个奇怪的错误。直到现在,我们的某些产品代码字符串中都有连字符。这些代码用于使用“ 0”从全局范围提取本地化文本的哈希。 减少问题使我举了一个任何人都可以尝试的示例: 模板中的
${.vars[\"foo-bar\"]}
输出
0
${.vars[\"foo+bar\"]}
输出
nullnull
“ 5”正确触发了InvalidReferenceException 这三个都应触发异常。而是显示正在评估“ 0”参数字符串! :-( http://freemarker.sourceforge.net/docs/app_faq.html#faq_strange_variable_name表示这应该可行。 几周前,我在Freemarker邮件列表上看到类似问题的提法,建议在参数字符串前加上\“ @ \”作为前缀。这可能适用于其他哈希,但不适用于
.vars
。我只是举了一个有效的示例(
.vars[\"resources_title\"]
),对其进行了更改,使其引发了InvalidReferenceException(
.vars[\"@resources_title\"]
)。我也在带连接符的引用上进行了尝试,它也引发了异常。 升级到2.3.18似乎没有什么不同。     

解决方法

        为我工作。就像在freemarker-user邮件列表中已经提到的那样:也许您使用了奇怪的数据模型,甚至花了10英镑。但是像这样的讨论可能更适合freemarker-user邮件列表...     ,        抱歉耽搁了。在对放置断点的位置进行了一些良好的邮件列表帮助之后,我在这里于6月10日写回了该列表: 简短的故事:这不是Freemarker问题。相反,Struts团队选择将Freemarker硬连线以将ѭ0名称视为OGNL表达式,并且似乎没有办法告诉OGNL不解析它们。因此在Struts下,\“-\”和\“ + \”(可能还有其他字符)不能出现在“ 0”名称中。 很长的故事... mark13ѭ(第192行)是Freemarker开始处理
.vars
表达式的地方
freemarker.core.Environment
(第1088行)将控制权交给\“ rootDataModel \”,Struts小组将其硬连线为
org.apache.struts2.views.freemarker.ScopesHashModel
的实例 该类的第70行(使用Struts版本2.1.8.1)调用\“ stack.findValue \”; \“ stack \”已被连线为ѭ17的实例 在第236行,该类依次询问
OgnlUtil
的实例以找到对象,在该位置假定名称为OGNL表达式并进行了解析,将\“ foo-bar \”转换为(foo-bar) 在此过程中,似乎始终没有选择不将
.vars
名称视为表达式(
FreemarkerResult
中的注释暗示了这种可能性,但代码并未通过)。从理论上讲,我可以使
FreemarkerManager
的实现创建
ScopesHashModel
的变体,但是要花费很多工作才能更改所有相关的类。 (似乎也没有一种在OGNL表达式中转义\“-\”字符的方法。似乎在5-6年前就已经进行了讨论,但是......23ѭ未能在\之后找到\“-\” “ \\\”,所以想必\“-\”不可逃脱吗?) :-( 我尚不清楚将ѭ0名称当作表达式使用的用例是什么...但是我不认为Struts现在会改变。我没有重写六个Struts类,而是更改了将ResourceBundles装入值堆栈的代码:现在,它更改名称以替换\“-\”和\“ _ \”,同样,我的
.vars
名称也被更改为模板中的方式也一样。有用。 W     ,        如果添加了转义foo \\-bar,它将起作用。 \“仅单个反斜杠\”     ,        由于freemarker版本为2.3.22,因此可以在变量名中使用点(。),减号(-)或冒号(:)(此处有详细信息)。 就我而言,如果我尝试使用freemarker 2.3.21这样的变量,它将失败:
api[\"x-link\"]
如果我将freemarker更改为2.3.22版,则可以使用。