2016-07-21 1 views
0

폼의 다양한 단계 사이를 앞뒤로 선형 방식으로 탐색하는 스프링 웹 플로우가 있습니다. 사용자가 다른 브라우저에서 동시에 액세스하기 때문에 양식이 다른 브라우저 인스턴스에서 완료되었는지 여부를 각 단계에서 확인해야합니다. 그렇다면 사용자는 마지막 페이지로 바로 건너 뛰어야합니다. 웹 흐름은 대략 다음과 같습니다.변수를 Spring Flow Decision State로 전달하여 대상으로 사용할 수 있습니까?

<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> 

등 모든 단계에 대해. 우리는 매우 많은 많은 결정 상태 (2 * (N-1))와 매우 비슷합니다.

관리자가 결정 상태를 바꿀 수있는 일반적인 방법을 요청했습니다. 그러나 어느 누구도 가능한 목적지 중 하나를 인수로 전달할 수 없도록 만드는 방법 (또는 가능한 경우)을 알지 못합니다. 스프링 문서를 살펴 보았지만 변수를 액션/목적지로 사용할 수 있는지 여부는 알 수 없었다. 이것이 가능한가?

답변

0

다른 옵션에 대해 생각하고 ... 우선 flow.xml에서 EL을 사용할 수 있습니다. 그래서 당신은 당신의 주 목적지에서 그것을 사용할 수 있습니다. 예를 들어, 우리는 우리의 흐름의 일부이있다 : 우리가 flowScope에 사용자가 방문했던 이전의 상태를 포함 "previousViewStateId"라는 이름의 변수를 배치 한

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

.

그러나 이것은 사용자에게 더 나은 전체 솔루션과 같은 것으로 나타납니다. FlowExecutionListener. (이 방법으로 EL에서 사용하려면 flowScope에있는 "previousViewStateId"를 얻었습니다.)

이 방법을 사용하면 교차 절단 코드로 완료를 확인할 수 있습니다. flow.xml에서 각 주마다 명시 적으로 확인하는 것이 아닙니다. 넌 FlowExecutionListenerAdapter를 확장하고 가로 원하는 조건으로 다시 라우팅주기 메소드를 재정의 할 수있다 : 예를 들어

, 시작하거나로부터 유동을 방지하는 유동 실행 수준에서 보안 검사를 적용 할 수있는 하나 맞춤 리스너 현재 사용자에게 필요한 권한이없는 경우 에서 상태를 입력하십시오. 다른 수신기는 흐름 실행 탐색 기록을 추적하여 빵 부스러기를 지원할 수 있습니다. 다른 사람은 감사를 수행하거나 트랜잭션 리소스에 대한 연결을 설정하고 뜯어 낼 수도 있습니다.