Grails 2.0.4 Webflow-Ausnahme „Typkonflikt“.
-
11-12-2019 - |
Frage
Ich bin noch ziemlich neu bei Grails und entwickle eine Online-Umfrage.Ich habe mich für Web Flow entschieden und bin auf viele Probleme gestoßen.Ich versuche, die Umfrage-ID von der GSP-Seite an den Flow Controller zu übergeben.Dies funktioniert bei jeder anderen Controller-Aktion einwandfrei, aber wenn ich es mit der Aktion für den Startstatus des Flows mache, erhalte ich immer die gleiche Fehlermeldung.Ich habe einem Tutorial in einem Lehrbuch gefolgt, das dies GENAU auf die gleiche Weise macht, und mir gehen die Ideen aus.
Hier ist der Link von der GSP-Seite:
<g:link controller="surveyPage" action="beginTest" id="${survey.id}">
${survey.surveyName}
</g:link>
und hier ist der Ablauf mit dem Startzustand
def beginTestFlow = {
showSurvey{
def survey = Survey.get(params.id)
on("cancel").to "cancelSurvey"
on("continueSurvey").to "nextQuestion"
}
cancelSurvey { redirect(controller:"surveyPage") }
}
es löst immer die Ausnahme aus:
Nichtübereinstimmung des Argumenttyps in der Zeile mit
def survey = Survey.get(params.id)
Ich habe auch versucht:
flow.survey = Survey.get(params.id)
oder auch:
flow.survey = Survey.get(session.survey.id)
immer der gleiche Fehler.Außerdem habe ich dafür gesorgt, dass die Klasse Survey Serializable implementiert.Ich habe denselben Code kopiert und in eine andere Aktion mit demselben Controller eingefügt, und er funktioniert einwandfrei.Irgendwelche Ideen, was beim Web-Flow anders ist?
Lösung
Sie können solchen Code nicht direkt in eine Statusdefinition einfügen, sondern müssen einen Aktionsstatus oder einen verwenden onEntry
Block
def beginTestFlow = {
showSurvey{
onEntry {
flow.survey = Survey.get(params.id)
}
on("cancel").to "cancelSurvey"
on("continueSurvey").to "nextQuestion"
}
cancelSurvey { redirect(controller:"surveyPage") }
}
Der onEntry
Der Block wird jedes Mal ausgelöst showSurvey
Zustand eingegeben wird.Wenn Sie stattdessen möchten, dass eine Logik nur einmal zu Beginn des gesamten Flusses ausgeführt wird (z. B. wenn ein späterer Übergang möglicherweise wieder in den Ausgangszustand übergeht), können Sie eine Flussebene verwenden onStart
stattdessen blockieren:
def beginTestFlow = {
onStart {
flow.survey = Survey.get(params.id)
}
showSurvey{
on("cancel").to "cancelSurvey"
// ...
Andere Tipps
ivo houbrechts schrieb ein exzellentes Tutorial über Gralt 2.0 Webflow.Sie können es hier lesen: