我正在构建一个简单的POC来试验Faces Flow。
- 第 1 页:显示公司列表。用户选择公司 A,然后转到第 2 页。
-
第 2 页:在所选公司页面上,用户单击命令链接以启动向导以创建要添加到公司 A 的新员工。
看场景我有@FlowScoped("addNewUsertoCompanyFlow")
豆MyFlowBean
.
在其@PostConstruct
方法中,MyFlowBean
需要从服务(@Inject
)获取与公司A对应的对象。
让MyFlowBean知道公司A的正确方法是什么,以便它可以从服务中获取它?
谢谢。
好的,我想出了一个解决方案。关键是不要使用流支持 bean @PostConstruct而是使用流初始值设定项,我可以在其中获取请求参数。
所以我在将启动我的流程的表单中使用了一些额外的输入:
<h:form id="myForm" prependId="false">
<h:commandLink value="Enter myFlow" action="my-flow"/>
<h:inputHidden id="parameter" name="parameter" value="8"/>
</h:form>
在我的流定义中,我为流定义了一个初始值设定项,在流支持 bean 中调用了一些方法
@Produces @FlowDefinition
public Flow defineFlow(@FlowBuilderParameter FlowBuilder flowBuilder) {
String flowId = "my-flow";
flowBuilder.id("", flowId);
flowBuilder.initializer("#{myFlowBean.startFlow()}");
...
}
然后,我抓住了支持豆子中的参数。
@Named
@FlowScoped("my-flow")
public class MyFlowBean implements Serializable {
public void startFlow() {
String parameter = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("parameter");
//now do sthg with the parameter, such as fetching data from an injected service
....
}
}
当然,也可以在流定义级别执行此操作
flowBuilder.initializer("#{trainingFlowBean.startFlow(param['parameter'])}");
并且只需在startFlow方法中有一个参数
public void startFlow(String parameter) {
...
}