2014-10-16 63 views
-1

我有一個引用兩個子對象的對象,並將其返回給視圖,就像我使用其他變量一樣。無法從Play框架模板訪問嵌套的對象

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綠色3066綠色3086綠色3126紅3166紅3026紅3146紅

任何人都可以解釋爲什麼出現這種情況以及如何糾正它?

+0

你能否提供編譯器錯誤!? – akkie 2014-10-17 08:33:27

+0

這沒有意義。 1)你有兩個同名的私人領域; 2)你的領域是私人的,沒有setters /參數構造函數:這些領域如何分配? – Salem 2014-10-17 10:23:46

+0

沒有編譯器錯誤,也沒有運行時錯誤。我的期望是,如果我有兩個getter,我應該能夠從視圖中調用它們並檢索它們的內容,但這不會發生。 我可以通過它的getter檢索對象。另一個對象的內容是PARENT對象本身的一部分,而不是getter。這是不正確的行爲。 我也更正了上面示例代碼中的一個錯誤。 – bitstream 2014-10-17 13:54:31

回答

0

我給出的例子並沒有顯示我如何去填充對象,但我向你保證他們已經填充。

這個問題似乎源於Object1擴展了ArrayList的事實。我所做的只是重寫add()方法,所以我可以插入一些額外的功能。刪除「擴展ArrayList」解決了這個問題,但我不明白爲什麼擴展ArrayList類造成這種情況。 Play Framework可能是一個怪癖嗎?

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的實例,並存儲在超類中的Listobj2實例。

因此,在模板(或任何其他地方)中調用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),我強烈建議您調試它,並在添加/訪問數據的方法中設置斷點,並查看列表中包含的內容,它們具有方便的視圖,可讓您看到所有字段和範圍內的對象。

+0

Myexample並沒有向你展示我在做對象實例化時所做的一切,我或多或少地回答了我自己的問題,儘管根本原因還是有點神祕。 – bitstream 2014-10-20 13:36:03