这是一个非常基本的问题,我很确定我做错了什么或做出一些假设。到此为止。
我正在编写一个使用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,它只适用于某些物体?
答案 0 :(得分:1)
我想答案是你不能做我想做的事情。您可以调用成员方法,但无法访问成员变量,这意味着您需要向类中添加getter。 (可以发誓我试过了。好啊。)
答案 1 :(得分:0)
Velocity不会暴露字段,只暴露方法。有办法改变这种情况:
您可以创建自己的Uberspect类,允许访问公共字段。
您可以使用Velocity的FieldMethodizer的修改版本来包装实例,该版本可以访问非静态字段。
您可以在上下文中添加和使用“工具”类的实例,例如VelocityTool的ClassTool的子类。