如何以编程方式添加新的 ViewState?

How to add new ViewState programatically?

我正在尝试寻找一种在应用程序中执行某些操作时添加新 ViewState 的方法。 用例: 我有一个 spring webflow,在流文件中定义了 2 个静态 ViewState。在第一个视图中有一个 UI 操作将添加一个新的 ViewState。我知道,我可以在流程中添加上述 ViewState,但这只是一个示例。这样的案例我太多了。在 Spring webflow 的早期版本中是可能的。但是现在 ViewState 对象需要一个 ViewFactory 实例。

如何以编程方式在流中添加新的 ViewState?

我认为您对这个问题的思考有误。您可以使用 Spring 表达式语言 (SPEL) 将变量传递到视图状态标记的 'view' 属性中,例如

<action-state id="determineWhichViewStateToRender">

    <set name="flowScope.dynamicViewState" value="myService.determineWhichViewState()"/>

    <set name="flowScope.modelObj" value="myService.getModelTypeForThisViewState(flowScope.dynamicViewState)"/>
    <transition to="myDynamicViewState"/>
</action-state>


<view-state id="myDynamicViewState" view="#{flowScope.dynamicViewState}/edit" model="modelObj">

..... 

</view-state> 

这将实现您想要的与 "dynamic view-state" 类似的效果,而无需诉诸框架工作黑客。

此外,在示例中,可以将 modelObj 设置为在进入视图状态之前初始化为任何对象类型。

如果动态 SPEL 不够用,那么您将不得不求助于框架黑客。

FlowModelFlowBuilder.class 控制流量 built/initialized。将 FlowModelFlowBuilder.class 和 override/add 扩展到现有方法。

http://docs.spring.io/spring-webflow/docs/current-SNAPSHOT/api/org/springframework/webflow/engine/builder/model/FlowModelFlowBuilder.html

您可能会对 createFlow() 方法感兴趣。通过覆盖、添加或研究其功能来为预定义流注入您自己的 "dynamic view-states"。

createFlow()
Factory method that initially creates the flow implementation during flow builder initialization.

一旦您实现了自己的 FlowBuilder,您就可以像这样将它注入到您的 webflow-registery 配置中:

<webflow:flow-registery id="flowRegistry" flow-builder-services="someFlowBuilderService">
      <webflow:flow-location-pattern value="/**/*-flow.xml"/>
      <webflow:flow-builder class="com.my.package.MyCustomFlowModelFlowBuilder"/>

</webflow:flow-registery>

免责声明:我个人从未这样做过,但该框架确实允许您注入自己的自定义 FlowBuilder 实现。