从全局菜单转换到参数化 webflow 视图状态

Transition to parameterized webflow view state from global menu

背景

带有应显示特定报告参数页面的链接的简单菜单系统。它是这样工作的:

  1. 用户单击 "Search" 菜单,切换到系统搜索网络流程。
  2. 用户单击 "Reports" 子菜单(例如 "Errors Encountered...")。
  3. 用户被带到“遇到错误”报告。

reports-flow.xml 包含:

<view-state id="list" view="flow/reports/list">
    <transition on="parameters" to="parameters">
        <set name="flowScope.reportKey" value="requestParameters.key" />
        <evaluate expression="reportService.createReport()" result="flowScope.report" />
    </transition>
</view-state>

<view-state id="parameters" model="report" view="flow/reports/parameters">
    <on-render>
        <set name="viewScope.pageId" value="'osre02'" />
        <evaluate expression="siteService.find()" result="viewScope.siteList" />
        <evaluate expression="agencyService.findActiveMunicipalities()" result="viewScope.municipalityList" />
    </on-render>

    <transition on="run" to="redirect" />
</view-state>

flow/reports/list 页面包含:

<li><a href="${flowExecutionUrl}&amp;_eventId=parameters&amp;key=report_name">Report Name</a></li>

问题

None以下工作退出系统搜索网页流程并在传递报表参数键时进入报表网页流程。

<a href="reports?_flowId=reports&_eventId=parameters&key=report_name">Report Name</a>
<a href="reports?_eventId=parameters&key=report_name">Report Name</a>
<a href="reports?execution=${flowExecutionKey}&amp;_eventId=parameters&key=report_name">Report Name</a>
<a href="${flowExecutionUrl}&amp;_eventId=parameters&key=report_name">Report Name</a>

错误

在系统搜索网络流程中,出现以下错误:

Request processing failed; nested exception is org.springframework.webflow.engine.NoMatchingTransitionException: No transition found on occurence of event 'parameters' in state 'criteria' of flow 'flow/sessionSearch' -- valid transitional criteria are array[search, today] ...etc.

在报表流中单击其中一个菜单链接时,此错误消失。这是有道理的,因为系统搜索不知道报告流程或菜单(理想情况下,它不应该知道)。

想法

要使报告流解析为全局菜单,可以按如下方式设置全局转换:

<global-transitions>
    <transition on="parameters" to="parameters">
        <set name="flowScope.reportKey" value="requestParameters.key" />
        <evaluate expression="reportService.createReport()" result="flowScope.report" />
    </transition>
</global-transitions>

并且文件配置自动装配使用:

@Configuration
public class SharedWebFlowConfig extends AbstractFlowConfiguration {
    @Bean
    public FlowDefinitionRegistry sharedFlowRegistry() {
        return getFlowDefinitionRegistryBuilder().addFlowLocation("/WEB-INF/flow/common/global-transitions.xml", "global-transitions").build();
    }
}

问题

想法部分中描述的设置导致以下错误:

java.lang.IllegalArgumentException: Cannot find state with id 'parameters' in flow 'flow/sessionSearch' -- Known state ids ...

如何从 reports-flow.xml 全局创建 parameters 视图状态?

什么是更好的方法?

使用<on-start>和一个<decision-state>将请求参数带入流程范围并获取模型:

<on-start>
    <set name="flowScope.reportKey" value="requestParameters.key" type="string" />
    <evaluate expression="reportService.createReport()" result="flowScope.report" />
</on-start>

<decision-state id="direct">
    <if test="flowScope.reportKey == null" then="list" else="parameters" />
</decision-state>

从应用程序中的任何位置(和任何流)使用超链接来更改流:

<a href="reports?key=report_name">Report Name</a>

如果flowScope.reportKey为空,则流向列表页。如果 flowScope.reportKey 不为空,则流程将转到参数页面。

不需要全局转换。