我搜索了Google,阅读了文档等,但我仍然无法弄清楚出了什么问题。
当我尝试访问嵌套属性时,说出对象的${myObject.id.str}
,我收到以下错误:Expected hash. myObject.id evaluated instead to freemarker.ext.beans.SimpleMethodModel
。当我删除.str
并尝试输出${myObject.id}
时,我得到Expecting a string, date or number here, Expression myObject.id is instead a freemarker.ext.beans.SimpleMethodModel
。 Id实际上是一个对象 - 它是java.lang.Number
的包装器。我只是添加了str()
方法作为获取数字值的便捷方法,因为我认为返回一个字符串可能有所帮助。这似乎不是问题,因为问题似乎是Id对象本身。我开始怀疑我是否有命名问题,因为调用myobject.myId
似乎有效,但不是myobject.id
。 Coud这是真的,因为类名Id
与原始名称id
相同?我不应该这么认为,但是myId
为什么会有相同的Id
对象。
对象看起来像这样:
public class MyObject
{
private Id id = null;
@Override
public Id getId()
{
return id;
}
@Override
public void setId(Id id)
{
this.id = id;
}
}
id类如下所示:
public class Id extends Number
{
private Number id = null;
public String getStr()
{
return String.valueOf(id);
}
}
以下内容在模板中不起作用:
${myObject.id}
只要您没有遇到任何问题,Freemarker文档就会很好。不幸的是,在一遍又一遍地阅读文档并使用谷歌搜索后,我仍然没有接近解决方案。
如果有人能说清楚这一点,那就太棒了。
祝你好运, 迈克尔
答案 0 :(得分:1)
就这样它可以被标记为已解决...问题是有一个名为“id”的继承Java方法(之前没有“get”)。由于FreeMarker不为方法和其他成员使用单独的名称空间(方法是FreeMarker中的第一类值,因此您可以在不调用它们的情况下获取它们),这将是名称冲突,并且“id”方法具有优先权在“id”JavaBean属性上。在这种情况下,您仍然可以使用getId()
来读取JavaBean属性。