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

时间:2015-12-01 16:38:39

标签: spring-webflow-2

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

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

2 个答案:

答案 0 :(得分:0)

我认为你错误地考虑了这个问题。您可以使用Spring Expression Language(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> 

这样就可以达到你想要的“动态视图状态”的类似效果,而不需要求助于框架工作。

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

答案 1 :(得分:0)

如果动态SPEL不够,那么你将不得不诉诸框架黑客。

FlowModelFlowBuilder.class控制如何构建/初始化流。扩展FlowModelFlowBuilder.class并覆盖/添加到现有方法。

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

您可能对createFlow()方法感兴趣。通过覆盖,添加或研究其功能,为预定义流注入您自己的“动态视图状态”。

if

一旦你实现了自己的FlowBuilder,你就可以在你的webflow-registery配置中注入它:

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

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