无法从Play Framework模板访问嵌套对象

时间:2014-10-16 23:27:15

标签: java playframework

我有一个引用两个子对象的对象,我将它返回到视图,就像我对其他任何变量一样。

public class Object1 extends ArrayList<Object2> {
    private List<Object2> obj2 = new ArrayList<Object2>;
    private Object3 obj3;

    public List<Object2> getObject2() {
        return this.obj2;
    }

    public Object3 getObject3() {
        return this.obj3;
    }

    @Override
    public boolean add(Object2 o2) {
        //some other code goes here
        return super.add(o2);
    }
}

public class Object2  {
   int applianceId;
   String status;
}

public class Object3 {
   int member3;
   String member4;
}

在我的模板中将Object1分配给变量obj1。问题是如果我打电话给getObject2(),我什么也得不到,虽然我可以正常访问getObject3()。真正奇怪的是,如果我在没有getter的情况下访问obj1,它将包含getObject2()应该返回的所有内容。

所以,我希望这会起作用,但事实并非如此:

@for(a <-obj1.getObject2()){
    @a.member1
    @a.member2
}

它什么都不返回。

但是,这确实会从对象2返回数据:

@for(a <-obj1){
    @a.applianceId
    @a.status
}

结果为:3046 GREEN 3066 GREEN 3086 GREEN 3126 RED 3166 RED 3026 RED 3146 RED

任何人都可以解释为什么会发生这种情况以及如何纠正它?

2 个答案:

答案 0 :(得分:0)

您永远不会向obj2添加任何内容。

当您移除extends ArrayList<Object2>然后使用add()方法时,您必须将super.add(o2)更改为obj2.add(o2),然后添加到 obj2实例,因此您可以获得您所看到的数据。

我认为您不需要以下代码,因为它让您感到困惑:

private List<Object2> obj2 = new ArrayList<Object2>;

public List<Object2> getObject2() {
    return obj2;
}

当您致电Object1.add(Object2)时,它只会被添加到Object1的实例中,并存储在超级类List中而不是obj2实例中。

因此,在模板中(或其他任何地方)调用obj1.getObject2()将始终返回空ArrayList<Object2>

通过这样做,您可以获得添加的数据:

for(Object2 obj: obj1) {
    // do something with the data
}

@for(a <-obj1){
    @a.applianceId
    @a.status
}

这样做有什么问题?

或删除extends ArrayList<Object2>并使用您编写的方法访问数据。

基本上,您必须注意将数据存储在预期的位置。如果您正在使用Eclipse(或其他IDE),我强烈建议您调试它并在添加/访问数据的方法中设置断点并查看列表包含的内容,它们具有方便的视图,可以让您查看所有字段和范围内的对象。

答案 1 :(得分:0)

我给出的例子没有显示我如何填充对象,但我向你保证它们已被填充。

问题似乎源于Object1扩展ArrayList的事实。我所做的只是重写add()方法,所以我可以插入一些额外的功能。删除&#34;扩展ArrayList&#34;解决了这个问题,虽然我不明白为什么扩展ArrayList类造成了这个问题。也许是Play Framework中的怪癖?