2012-07-26 50 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

相關問題