2010-04-23 68 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