如何在Velocity模板中打印对象列表?

时间:2013-02-21 23:07:29

标签: jira velocity

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

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

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,它只适用于某些物体?

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

Velocity不会暴露字段,只暴露方法。有办法改变这种情况:

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

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

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