【问题标题】:Unable to access a nested object from Play Framework template无法从 Play Framework 模板访问嵌套对象
【发布时间】:2014-10-16 23:27:14
【问题描述】:

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

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

谁能解释为什么会发生这种情况以及如何纠正它?

【问题讨论】:

  • 能否提供编译错误!?
  • 这没有意义。 1)您有两个同名的私有字段; 2)您的字段是私有的,并且没有设置器/参数构造函数:这些字段是如何分配的?
  • 没有编译器错误,也没有运行时错误。我的期望是,如果我有两个 getter,我应该能够从视图中调用它们并检索它们的内容,但事实并非如此。我只能通过它的 getter 检索对象。另一个对象的内容是 PARENT 对象本身的一部分,而不是 getter。这不是正确的行为。我还纠正了上面示例代码中的一个错误。
  • “它什么也不返回”是什么意思,obj1.getObject2() 是否返回 null,a 是否为 null,空字段,什么?但是问题似乎不在您发布的代码中,我们不知道您的其余代码在做什么,但我怀疑您在没有向我们展示的地方犯了错误,您能否发布一个 sscce。
  • 我修改了上面的代码以更接近真实世界的代码。这个问题似乎源于 Object1 扩展了 ArrayList 的事实。我所做的只是重写 add() 方法,这样我就可以插入一些额外的功能。删除“扩展 ArrayList”解决了这个问题,虽然我不明白为什么扩展 ArrayList 类会导致这个问题。

标签: java playframework


【解决方案1】:

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

当您删除 extends ArrayList&lt;Object2&gt; 然后在 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&lt;Object2&gt;

对我来说,您可以通过以下方式获得添加的数据

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

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

你这样做有什么问题?

或者去掉extends ArrayList&lt;Object2&gt;,用你写的方法访问数据。

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

【讨论】:

  • Myexample 并没有向您展示我在对象实例化等方面所做的一切。我在上面或多或少地回答了我自己的问题,尽管根本原因仍然有点神秘。跨度>
【解决方案2】:

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

问题似乎源于 Object1 扩展了 ArrayList 的事实。我所做的只是重写 add() 方法,这样我就可以插入一些额外的功能。删除“扩展 ArrayList”解决了这个问题,但我不明白为什么扩展 ArrayList 类会导致这个问题。也许是 Play Framework 中的一个怪癖?

【讨论】:

    猜你喜欢
    • 2017-12-09
    • 2017-12-26
    • 1970-01-01
    • 2013-04-07
    • 1970-01-01
    • 2016-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多