2016-07-21 18 views
0

Ich habe einen Spring Webflow, der zwischen verschiedenen Schritten in einer Form linear vor und zurück navigiert. Da Benutzer gleichzeitig von verschiedenen Browsern aus zugreifen, müssen Sie zwischen den einzelnen Schritten überprüfen, ob das Formular in einer anderen Browserinstanz abgeschlossen wurde. Wenn dies der Fall ist, sollte der Benutzer direkt zur letzten Seite übergehen. Der Webflow sieht ungefähr so ​​aus:Können Sie eine Variable an einen Spring-Flow-Entscheidungsstatus übergeben, um sie als Ziel zu verwenden?

<view-state id="claimFlowStepOne" view="onlineclaims/my-claims-step1" model="submission"> 
    <transition on="claimStep1Continue" to="checkSubmitted1"> 
    </transition> 
</view-state> 

<decision-state id="checkSubmitted1"> 
    <if test="onlineClaimsAction.checkClaimAlreadySubmitted(submission.claim)" 
     then="endClaimFlow" else="claimFlowStepTwo" /> 
</decision-state> 

<view-state id="claimFlowStepTwo" view="onlineclaims/my-claims-step2" 
    model="submission"> 
    <transition on="claimStep2Back" to="checkSubmitted2to1" 
     validate="false"> 

    </transition> 
    <transition on="claimStep2Continue" to="checkSubmitted2to3"> 
     <evaluate expression="onlineClaimsAction.savePaymentDetails(submission)" /> 
    </transition> 
</view-state> 

<decision-state id="checkSubmitted2to1"> 
    <if test="onlineClaimsAction.checkClaimAlreadySubmitted(submission.claim)" 
     then="endClaimFlow" else="claimFlowStepOne" /> 
</decision-state> 

<decision-state id="checkSubmitted2to3"> 
    <if test="onlineClaimsAction.checkClaimAlreadySubmitted(submission.claim)" 
     then="endClaimFlow" else="claimFlowStepThree" /> 
</decision-state> 

Und so weiter, für jeden Schritt. Wir enden mit vielen, vielen Entscheidungszuständen (2 * (N-1)), die alle sehr ähnlich sind.

Mein Manager hat gebeten, dass ich eine allgemeine Methode erstelle, um die Entscheidungszustände zu ersetzen. Allerdings wissen wir beide nicht (oder wenn es überhaupt möglich ist), es so zu machen, dass wir eines der möglichen Ziele als Argument übergeben können. Ich habe die Spring-Dokumentation durchgesehen, konnte aber nichts darüber herausfinden, ob es möglich ist, eine Variable als Aktion/Ziel zu verwenden. Ist das möglich?

Antwort

0

Nachdenken über verschiedene Optionen ... Erstens können Sie EL in Ihrem flow.xml verwenden. Sie können das also in Ihren Statuszielen verwenden. Zum Beispiel haben wir dies in einigen unserer fließt:

<transition on="back" to="#{flowScope.previousViewStateId}" 
       validate="false" bind="false"/> 

Wo wir in flowScope eine Variable mit dem Namen „previousViewStateId“ platziert haben, die den vorherigen Zustand enthält der Benutzer besucht hatte.

Aber das weist mich auf, was wie die bessere Gesamtlösung für Sie scheint, mit einem benutzerdefinierten FlowExecutionListener. (So ​​haben wir diese "previousViewStateId" auf flowScope, um sie von EL zu verwenden.)

Mit diesem Ansatz würden Sie überprüfen, ob der Code vollständig ist. Anstatt explizit zwischen jedem Zustand in Ihrem zu überprüfen. Sie können FlowExecutionListenerAdapter erweitern und eine der Lifecycle-Methoden überschreiben, unter der gewünschten Bedingung abzufangen umzuleiten:

Zum Beispiel Sicherheitskontrollen ein benutzerdefinierter Zuhörer gelten kann am Fluss Ausführungsebene, eine Strömung aus starten oder einer Verhinderung Status von eingeben, wenn der aktuelle Benutzer nicht über die erforderlichen Berechtigungen verfügt. Ein anderer Listener kann den Flussausführungsnavigationsverlauf auf unterstützen, um Brotkrumen zu unterstützen. Ein anderer kann Auditing durchführen oder Down-Verbindungen zu einer Transaktionsressource einrichten und einreißen.