Freemarker “自由标记”;。vars";名称可以';不包含破折号?

Freemarker “自由标记”;。vars";名称可以';不包含破折号?,freemarker,Freemarker,我们正在使用Freemarker 2.3.16版,我刚刚在我们的一个应用程序中发现了一个奇怪的bug。归根结底,现在我们的一些产品代码字符串中出现了连字符。这些代码用于使用.vars从全局范围中提取本地化文本的哈希值 减少这个问题给我带来了一个任何人都可以尝试的例子: ${.vars[“foo-bar”]}在模板中输出0 ${.vars[“foo+bar”]}输出nullnull ${.vars[“foobar”]}正确触发InvalidReferenceException 这三种情况都会引

我们正在使用Freemarker 2.3.16版,我刚刚在我们的一个应用程序中发现了一个奇怪的bug。归根结底,现在我们的一些产品代码字符串中出现了连字符。这些代码用于使用
.vars
从全局范围中提取本地化文本的哈希值

减少这个问题给我带来了一个任何人都可以尝试的例子:

  • ${.vars[“foo-bar”]}
    在模板中输出
    0

  • ${.vars[“foo+bar”]}
    输出
    nullnull

  • ${.vars[“foobar”]}
    正确触发InvalidReferenceException

这三种情况都会引发异常。相反,它显示正在计算
.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
名称中

说来话长……

  • freemarker.core.BuiltinVariable
    (第192行)是freemarker开始处理
    .vars
    表达式的地方

  • freemarker.core.Environment
    (第1088行)将控制权交给“rootDataModel”,Struts团队将其硬连接为
    org.apache.struts2.views.freemarker.ScopesHashModel

  • 该类的第70行(使用Struts的2.1.8.1版)调用“stack.findValue”;“stack”已连接为
    com.opensymphony.xwork2.ognl.OgnlValueStack的实例

  • 在第236行,该类依次请求
    OgnlUtil
    的一个实例来查找该对象,在那里,该名称被假定为一个OGNL表达式并被解析,将“foo-bar”转换为(foo-bar)

在这一过程中,似乎没有一种选择不将
.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
名称中

说来话长……

  • freemarker.core.BuiltinVariable
    (第192行)是freemarker开始处理
    .vars
    表达式的地方

  • freemarker.core.Environment
    (第1088行)将控制权交给“rootDataModel”,Struts团队将其硬连接为
    org.apache.struts2.views.freemarker.ScopesHashModel

  • 该类的第70行(使用Struts的2.1.8.1版)调用“stack.findValue”;“stack”已连接为
    com.opensymphony.xwork2.ognl.OgnlValueStack的实例

  • 在第236行,该类依次请求
    OgnlUtil
    的一个实例来查找该对象,在那里,该名称被假定为一个OGNL表达式并被解析,将“foo-bar”转换为(foo-bar)

在这一过程中,似乎没有一种选择不将
.vars
名称视为一个表达式(在
FreemarkerResult
中的一条注释暗示了这种可能性,但代码没有贯彻到底)理论上,我可以让我的
FreemarkerManager
实现创建一个
ScopesHashModel
的变体,但这需要花费很多时间
api["x-link"]