使用struts 2.3.16在ftl中迭代列表(由静态方法返回)时表达式未定义

时间:2014-02-01 13:24:35

标签: struts2 static migration freemarker

我们在struts 2.0.11上部署了以下工作ftl

FTL ::

[#list allPaymentMethods?sort as item]
     options = options + "<option  name='${item?string}' value='${item?string}' [#if paymentMethods.contains(item)]selected='selected'[/#if]>${item?string}</option>";
[/#list]

相应的操作类具有以下方法,该方法返回非null 列表。

public static List<String> getAllPaymentMethods()

此实现与struts 2.0.11和freemarker 2.3.10一起使用。

在我们升级到struts 2.3.16和freemarker 2.3.19之后解析ftl时开始提供Expression undefined error

如果我们将静态方法用于实例方法,则错误消失。

public List<String> getAllPaymentMethods()

我们期待struts / freemarker向后兼容。

似乎struts-2.3.16 / freemarker-2.3.19不支持动作类的静态getter方法。有人观察过类似的问题吗?或者我们不推荐使用静态吸气剂的方式?

迁移时,很难通过所有ftls / Java代码来识别和转换此类静态getter方法到实例方法。

我们可以使用其他替代方法来迁移此类代码/ ftl吗?

1 个答案:

答案 0 :(得分:1)

默认情况下,静态方法访问已被禁用,因为自2008-2009左右开始使用Struts 2.1 +。

https://cwiki.apache.org/confluence/display/S2WIKI/Troubleshooting+guide+migrating+from+Struts+2.0.x+to+2.1.x#TroubleshootingguidemigratingfromStruts2.0.xto2.1.x-RefactorusageofstaticmethodsviaOGNL

Nutshell:您必须明确启用静态方法访问。

此更改在发行说明和迁移指南中都有详细说明。