Freemarker “自由标记”;。vars";名称可以';不包含破折号?
我们正在使用Freemarker 2.3.16版,我刚刚在我们的一个应用程序中发现了一个奇怪的bug。归根结底,现在我们的一些产品代码字符串中出现了连字符。这些代码用于使用Freemarker “自由标记”;。vars";名称可以';不包含破折号?,freemarker,Freemarker,我们正在使用Freemarker 2.3.16版,我刚刚在我们的一个应用程序中发现了一个奇怪的bug。归根结底,现在我们的一些产品代码字符串中出现了连字符。这些代码用于使用.vars从全局范围中提取本地化文本的哈希值 减少这个问题给我带来了一个任何人都可以尝试的例子: ${.vars[“foo-bar”]}在模板中输出0 ${.vars[“foo+bar”]}输出nullnull ${.vars[“foobar”]}正确触发InvalidReferenceException 这三种情况都会引
.vars
从全局范围中提取本地化文本的哈希值
减少这个问题给我带来了一个任何人都可以尝试的例子:
在模板中输出${.vars[“foo-bar”]}
0
输出${.vars[“foo+bar”]}
nullnull
正确触发InvalidReferenceException${.vars[“foobar”]}
.vars
参数字符串!:-(
这意味着这应该有效
几周前,我在Freemarker邮件列表中看到一个类似的问题,有人建议在参数字符串前面加“@”。这可能适用于其他哈希,但不适用于.vars
。我只是举了一个工作示例(.vars[“resources\u title”]
)更改它会引发InvalidReferenceException(.vars[“@resources\u title”]
)。我也在连字符引用上尝试了它,它也引发了异常
升级到2.3.18似乎没有什么不同。对我来说很有效。就像已经发生的那样:也许你使用了一个奇怪的数据模型,或者甚至是一个奇特的
ObjectWrapper
。但是像这样的讨论可能更适合freemarker用户邮件列表…对我有效。就像已经发生的那样:也许你使用了一个奇怪的数据模型,或者即使是一个花哨的ObjectWrapper
。但是像这样的讨论可能更适合freemarker用户邮件列表…很抱歉延迟。在一些关于放置断点位置的好邮件列表帮助之后,我在6月10日回信给列表:
短篇故事:这不是Freemarker的问题。相反,Struts团队选择硬连接Freemarker,将
.vars
名称视为OGNL表达式,似乎没有办法告诉OGNL不要解析它们。因此在Struts下,“-”和“+”(可能还有其他字符)不能出现在.vars
名称中
说来话长……
(第192行)是freemarker开始处理freemarker.core.BuiltinVariable
表达式的地方.vars
(第1088行)将控制权交给“rootDataModel”,Struts团队将其硬连接为freemarker.core.Environment
org.apache.struts2.views.freemarker.ScopesHashModel
- 该类的第70行(使用Struts的2.1.8.1版)调用“stack.findValue”;“stack”已连接为
com.opensymphony.xwork2.ognl.OgnlValueStack的实例
- 在第236行,该类依次请求
的一个实例来查找该对象,在那里,该名称被假定为一个OGNL表达式并被解析,将“foo-bar”转换为(foo-bar)OgnlUtil
.vars
名称视为一个表达式(在FreemarkerResult
中的一条注释暗示了这种可能性,但代码没有贯彻到底)理论上,我可以让我的FreemarkerManager
实现创建一个ScopesHashModel
的变体,但要更改与之相关的所有类需要大量的工作
(OGNL表达式中似乎也没有转义“-”字符的方法。似乎在5-6年前就有过这样的讨论,但是…..vars(“foo\\-bar”)
在“\”之后找不到“-”,所以推测“-”不可转义吗?)
:-(
我不清楚将.vars
名称视为表达式的用例是什么……但我认为Struts现在不会改变。我没有重写六个Struts类,而是更改了将ResourceBundle加载到值堆栈中的代码:它现在更改名称以替换“-”和“\u1”,同样地,我的.vars
名称在模板和…tada中以相同的方式更改。它可以工作。Woo.很抱歉延迟。在一些关于放置断点的位置的良好邮件列表帮助后,我在6月10日回信给列表:
短篇故事:这不是Freemarker的问题。相反,Struts团队选择硬连接Freemarker,将
.vars
名称视为OGNL表达式,似乎没有办法告诉OGNL不要解析它们。因此在Struts下,“-”和“+”(可能还有其他字符)不能出现在.vars
名称中
说来话长……
(第192行)是freemarker开始处理freemarker.core.BuiltinVariable
表达式的地方.vars
(第1088行)将控制权交给“rootDataModel”,Struts团队将其硬连接为freemarker.core.Environment
org.apache.struts2.views.freemarker.ScopesHashModel
- 该类的第70行(使用Struts的2.1.8.1版)调用“stack.findValue”;“stack”已连接为
com.opensymphony.xwork2.ognl.OgnlValueStack的实例
- 在第236行,该类依次请求
的一个实例来查找该对象,在那里,该名称被假定为一个OGNL表达式并被解析,将“foo-bar”转换为(foo-bar)OgnlUtil
.vars
名称视为一个表达式(在FreemarkerResult
中的一条注释暗示了这种可能性,但代码没有贯彻到底)理论上,我可以让我的FreemarkerManager
实现创建一个ScopesHashModel
的变体,但这需要花费很多时间
api["x-link"]