2012-07-26 89 views
0

我对Grails仍然很陌​​生,并且正在开发一个在线调查。我决定使用网络流量,并且我遇到了很多问题。我试图将调查ID从gsp页面传递给流量控制器。这在任何其他控制器动作上都可以很好地工作,但每当我对流的启动状态执行操作时,我总会得到相同的错误。我在一本教科书中遵循了一个教程,它以相同的方式完成了这个任务,并且我的想法已经耗尽。Grails 2.0.4 webflow“类型不匹配”异常

这里是从GSP页面的链接:

<g:link controller="surveyPage" action="beginTest" id="${survey.id}"> 
${survey.surveyName} 
</g:link> 

这里是启动状态的流动

def beginTestFlow = { 

    showSurvey{ 

     def survey = Survey.get(params.id) 

     on("cancel").to "cancelSurvey" 
     on("continueSurvey").to "nextQuestion" 

    } 

    cancelSurvey { redirect(controller:"surveyPage") } 
} 

它总是抛出异常:

参数类型不匹配上符合

def survey = Survey.get(params.id) 

我也试过:

flow.survey = Survey.get(params.id) 

甚至:

flow.survey = Survey.get(session.survey.id) 

总是相同的错误。另外,我确信班级Survey实现了Serializable。我已经使用相同的控制器将相同的代码复制并粘贴到不同的操作中,并且工作完美无瑕。任何想法与网络流量有什么不同?

回答

0

你不能把类似的代码直接的状态定义中,你需要使用一个动作状态或onEntry

def beginTestFlow = { 
    showSurvey{ 
     onEntry { 
      flow.survey = Survey.get(params.id) 
     } 
     on("cancel").to "cancelSurvey" 
     on("continueSurvey").to "nextQuestion" 
    } 

    cancelSurvey { redirect(controller:"surveyPage") } 
} 

onEntry块将触发每次进入showSurvey状态的时间。相反,如果你想一些逻辑,在整个流程(例如,如果一些后来转变可能重新进入初始状态)开始只是一次运行时,可以使用流动水平onStart块来代替:

def beginTestFlow = { 
    onStart { 
     flow.survey = Survey.get(params.id) 
    } 
    showSurvey{ 
     on("cancel").to "cancelSurvey" 
     // ... 
+0

是的,这很好。我很惊讶没有提到我的参考onStart方法。感谢您的帮助! – moultonjr 2012-07-26 11:54:58

+0

它似乎没有在文档中的任何地方提及,我最初通过http://jira.grails.org/browse/GRAILS-3997和阅读Grails源代码的相关部分来了解它。 。 – 2012-07-26 12:12:19