Exception Grails2.0.4WebFlow“;“类型不匹配”;例外

Exception Grails2.0.4WebFlow“;“类型不匹配”;例外,exception,grails,parameters,spring-webflow,type-mismatch,Exception,Grails,Parameters,Spring Webflow,Type Mismatch,我还是Grails的新手,我正在开发一个在线调查。我决定使用WebFlow,我遇到了很多问题。我正在尝试将调查id从gsp页面传递到流量控制器。这在任何其他控制器操作上都可以很好地工作,但每当我对流的开始状态的操作执行此操作时,我总是会得到相同的错误。我在一本教科书中学习了一个教程,这个教程也是这样做的,我已经没有什么想法了 以下是gsp页面的链接: <g:link controller="surveyPage" action="beginTest" id="${survey.id}"&g

我还是Grails的新手,我正在开发一个在线调查。我决定使用WebFlow,我遇到了很多问题。我正在尝试将调查id从gsp页面传递到流量控制器。这在任何其他控制器操作上都可以很好地工作,但每当我对流的开始状态的操作执行此操作时,我总是会得到相同的错误。我在一本教科书中学习了一个教程,这个教程也是这样做的,我已经没有什么想法了

以下是gsp页面的链接:

<g:link controller="surveyPage" action="beginTest" id="${survey.id}">
${survey.surveyName}
</g:link>
它总是抛出异常:

行上的参数类型不匹配

def survey = Survey.get(params.id)
我也试过:

flow.survey = Survey.get(params.id)
甚至:

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

总是同样的错误。此外,我还确保类调查实现可序列化。我用同一个控制器将相同的代码复制并粘贴到不同的操作中,它工作得非常完美。有什么不同于web流的想法吗?

您不能将这样的代码直接放在状态定义中,您需要使用动作状态或
onEntry

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

    cancelSurvey { redirect(controller:"surveyPage") }
}
每次进入
showSurvey
状态时,
onEntry
块都会触发。相反,如果您希望某些逻辑在整个流程开始时只运行一次(例如,如果稍后的某个转换可能重新进入初始状态),则可以使用流程级别
onStart
块:

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

IvoHoubrechts写了一篇关于Grails2.0WebFlow的优秀教程。你可以在这里阅读:


是的,效果很好。我很惊讶我的参考文献中没有提到onStart方法。谢谢你的帮助!文档中似乎没有提到它,我最初是通过结合和阅读Grails源代码的相关部分发现的。。。
def beginTestFlow = {
    onStart {
        flow.survey = Survey.get(params.id)
    }
    showSurvey{
        on("cancel").to "cancelSurvey"
        // ...