1

这是一个非常基本的问题,我很确定我做错了什么或做出了一些假设。开始。

我正在编写一个使用 Velocity 模板系统的 Jira 插件。我有一个 ResultRow 对象列表,其中 ResultRow 是一个具有单个成员变量的类:字符串键:

public class ResultRow {
  public String key;
}

我有这些 ResultRows 的列表:

List<ResultRow> rows = new ArrayList<ResultRow>();

ResultRow row = new ResultRow();
row.key = "foo";

rows.add(foo);

Map<String, Object> velocityParams = new HashMap<String, Object>();
velocityParams.put("rows", rows);

return descriptor.getHtml("view", velocityParams);

我正在尝试使用以下内容在模板中列出这些行:

#foreach ($row in $rows)
  <tr><td>$row.key</td></tr>
#end

我希望输出为: foo. 令人发指的是,模板系统只是打印文字字符串“$row.key”而不是 key 的内容。为了验证“$row”确实是一个对象,我使用了模板:

#foreach ($row in $rows)
  <tr><td>$row</td></tr>
#end

结果如预期:com.domain.jira.ResultRow@7933f2c6。

我想也许我错过了课程的一些要求。是否需要以某种特殊方式定义以向 Velocity 建议某些成员可在模板中使用?Jira 是否使用了一些仅适用于某些对象的特殊版本的 Velocity?

4

2 回答 2

1

我想答案是你不能做我想做的事。您可以调用成员方法,但不能访问成员变量,这意味着您需要将 getter 添加到您的类中。(我可以发誓我试过了。嗯。)

于 2013-02-22T00:00:43.553 回答
0

Velocity 不公开字段,只公开方法。有一些方法可以改变它:

  • 您可以创建自己的 Uberspect 类,该类允许访问公共字段。

  • 您可以使用 Velocity 的 FieldMethodizer 的修改版本来包装实例,该版本可以访问非静态字段。

  • 您可以在上下文中添加和使用“工具”类的实例,例如 VelocityTool 的 ClassTool 的子类。

于 2013-02-22T16:50:56.800 回答