11. 调用子流程

一个流程可以调用另一个流程作为子流程。 该流程会等待,直到子流程返回并响应子流程的结果。spring-doc.cadn.net.cn

11.1. subflow-state元素

subflow-state 元素作为子流程调用另一个流程,如下所示:spring-doc.cadn.net.cn

<subflow-state id="addGuest" subflow="createGuest">
    <transition on="guestCreated" to="reviewBooking">
        <evaluate expression="booking.guests.add(currentEvent.attributes.guest)" />
    </transition>
    <transition on="creationCancelled" to="reviewBooking" />
</subflow-state>

前面的例子调用了createGuest流程并等待它返回。 当该流程以guestCreated结果返回时,新客人将被添加到预订的客人列表中。spring-doc.cadn.net.cn

11.1.1. 传递子流程输入

input 元素将输入传递给子流程,如下所示:spring-doc.cadn.net.cn

<subflow-state id="addGuest" subflow="createGuest">
    <input name="booking" />
    <transition to="reviewBooking" />
</subflow-state>

11.1.2. 映射子流程输出

当子流程完成时,其结束状态 ID 将作为事件返回给调用流程,用于继续导航。spring-doc.cadn.net.cn

子流程还可以创建输出属性,调用流程可以在结果转换中引用这些属性,如下所示:spring-doc.cadn.net.cn

<transition on="guestCreated" to="reviewBooking">
    <evaluate expression="booking.guests.add(currentEvent.attributes.guest)" />
</transition>

在前面的示例中,guest 是由 guestCreated 结果返回的输出属性的名称。spring-doc.cadn.net.cn

11.2. 检查点:调用子流程

你应该检查一下调用子流程的示例预订流程:spring-doc.cadn.net.cn

<flow xmlns="http://www.springframework.org/schema/webflow"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://www.springframework.org/schema/webflow
                          https://www.springframework.org/schema/webflow/spring-webflow.xsd">

    <input name="hotelId" />

    <on-start>
        <evaluate expression="bookingService.createBooking(hotelId, currentUser.name)"
                  result="flowScope.booking" />
    </on-start>

    <view-state id="enterBookingDetails">
        <transition on="submit" to="reviewBooking" />
    </view-state>

    <view-state id="reviewBooking">
        <transition on="addGuest" to="addGuest" />
        <transition on="confirm" to="bookingConfirmed" />
        <transition on="revise" to="enterBookingDetails" />
        <transition on="cancel" to="bookingCancelled" />
    </view-state>

    <subflow-state id="addGuest" subflow="createGuest">
        <transition on="guestCreated" to="reviewBooking">
            <evaluate expression="booking.guests.add(currentEvent.attributes.guest)" />
        </transition>
        <transition on="creationCancelled" to="reviewBooking" />
    </subflow-state>

    <end-state id="bookingConfirmed" >
        <output name="bookingId" value="booking.id" />
    </end-state>

    <end-state id="bookingCancelled" />

</flow>

流程现在调用一个 createGuest 子流程,以将新客人添加到客人列表中。spring-doc.cadn.net.cn