期待哈希。 myObject.id评估为freemarker.ext.beans.SimpleMethodModel

时间:2013-07-15 13:33:46

标签: freemarker

我搜索了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文档就会很好。不幸的是,在一遍又一遍地阅读文档并使用谷歌搜索后,我仍然没有接近解决方案。

如果有人能说清楚这一点,那就太棒了。

祝你好运, 迈克尔

1 个答案:

答案 0 :(得分:1)

就这样它可以被标记为已解决...问题是有一个名为“id”的继承Java方法(之前没有“get”)。由于FreeMarker不为方法和其他成员使用单独的名称空间(方法是FreeMarker中的第一类值,因此您可以在不调用它们的情况下获取它们),这将是名称冲突,并且“id”方法具有优先权在“id”JavaBean属性上。在这种情况下,您仍然可以使用getId()来读取JavaBean属性。