2010-04-23 89 views
0

這是我第一次在Grails中使用webflow,我似乎無法解決這個問題。關聯和Grails webflow

我有一個看起來像這樣3個域類有關聯:

class A { 
    ... 
    static hasMany = [ b : B ] 
    ... 
} 

class B { 
    ... 
    static belongsTo = [ a : A ] 
    static hasMany = [ c : C ] 
    ... 
} 

class C { 
    ... 
    static belongsTo = [ b : B ] 
    ... 
} 

現在,GSP通過JavaScript中的控制器通信(由於我使用Dojo的)。當我嘗試remoteFunction正常的動作,我可以做這樣的事情:

def action1 = { 
    def anId = params.id 
    def currA = A.get(anId) 
    def sample = currA.b?.c // I can get all the way to 'c' without any problems 
    ... 
} 

不過,我有一個Webflow和行動的內容是在一個Webflow ......它看起來是這樣的:

def someFlow = { 
    ... 
    someState { 
     on("next") { 
     def anId = params.id // this does NOT return a null value 
     def currA = A.get(anId) // this does NOT return a null value 
     def sample = currA.b // error already occurs here and I need to get 'c'! 
     }.to("somePage") 
     ... 
    } 
    ... 
} 

在這種情況下,它告訴我,b不存在...所以我甚至不能'c'。有什麼建議怎麼辦? 謝謝...越來越真正的絕望...

回答

0

嗯,不太清楚問題是什麼,但我確實發現了一些好奇。在您的第一個塊中,使用以下內容:

def sample = currA.b?.c 

根據您創建的類,currA.b是Bs的集合,而不是單個集合。因此,currA.b?.c將是C類實例的集合集合,它是currA.b中每個Bs的集合。

我不確定如果currA.b爲空,會發生什麼情況...考慮到安全運營,相當於空的,空(通過GroovyTruth),我會說樣品將是空的。

儘管如此,這有助於確定爲什麼您指定的行生成錯誤。也許你可以告訴我們的錯誤是什麼?它是NPE還是其他?

望着這更多,它也像你錯過了「到」功能調用:

on("event") { intraEvent code }.**to** "eventHandlerAction" 

也許你看到的錯誤是這樣的結果?

好像不行。好吧,我能想到的其他事情就是前一段時間(我認爲是v1.1),他們做到了,所以你必須使用「this」。更多的內部流動行爲。從本質上講,爲了存取控制器類級別的對象和方法,你需要把「這一點。」在訪問它們前面。假設你希望把你已經有了intraEvent代碼放到一個方法:

def goGetC() {  
    def anId = params.id 
    def currA = A.get(anId) 
    def sample = currA.b 
} 

爲了調用從事件代碼的方法,你就必須使用:

someState { 
     on("next") { 
     this.goGetC() 
     }.to ("wherever") 
    } 

如果您試着撥打goGetC()沒有「這個」,你會改爲結束你與事件「goGetC」事件處理程序。我不知道,如果你的你的實際代碼的簡化隱藏着一個類似的案件或沒有,我仍然不知道到底你得到了什麼錯誤,但是這東西咬了我一段時間了,它的流程中有具體。希望這可以幫助。

+0

糟糕,對不起,這是當我嘗試從我的代碼中推廣我的代碼時發生的情況:D感謝您指出了這一點。 嗯,現在(只是爲了簡化),我們只是說只有1 B(我會擔心後來收集B的......),但定義仍然存在。 大多數時候,錯誤是由流(關於空映射)產生的,所以我認爲這是一個單獨的問題。然而,我認爲更合適的說法是,在該行,B返回爲null INSIDE webflow ...如果我把這個函數放在webflow之外(就像示例'action1',它不是null – callie16 2010-04-26 00:49:36

+0

我有注意到hasMany關係在流中(由於某種原因)的實現有點不同......具體來說,當在請求之間的流程範圍內進行對象的打開和關閉時,我會注意到一個hasMany集合,我確信在將它放到範圍之前完全加載(而不是懶惰)將恢復到特殊的實現列表,而不僅僅是當我將它從範圍中拉出時的ArrayList。查看實際實現類型currA.b是什麼,並嘗試將其轉換爲在嘗試達到c之前的實際B? – billjamesdev 2010-04-26 03:00:51

+0

我在上面的回答中添加了一些更多...你是否缺少事件描述符的「to」部分? – billjamesdev 2010-04-26 03:04:45