我正在尝试使用 Spring Web Flow 设置 JSF 应用程序。
我正在使用 Spring 3.1 Spring faces 2.3.1 JSF (api,impl) 2.1.6
我的问题是程序没有采用我的 jsf 视图的正确位置。
我找到了一些教程,例如
或http://dgparsons.org/jsf-and-spring-webflow.html 用于集成 jsf 和 spring web flow。
在这些视图之一中,解决方法是:
<bean id="faceletsViewResolver" class="org.springframework.web.servlet.view.UrlBasedViewResolver">
<property name="viewClass" value="org.springframework.faces.mvc.JsfView"/>
<property name="prefix" value="/WEB-INF/views" />
<property name="suffix" value=".xhtml" />
</bean>
所以我把我的 xhtml 文件放在文件夹 /WEB-INF/views/
我的流程位于目录 /WEB-INF/config/flow/start.flow
当我尝试时,程序总是想从文件夹 /WEB-INF/config/flow/start.xhtml 打开 start.xhtml
所以它似乎完全忽略了 UrlBasedViewResolver。
我的 FlowBuilderServices 配置如下:
<beans:bean id="flowBuilderServices"
class="org.springframework.webflow.engine.builder.support.FlowBuilderServices">
...
<beans:property name="viewFactoryCreator">
<beans:bean
class="org.springframework.faces.webflow.JsfViewFactoryCreator" />
</beans:property>
...
</beans:bean>
在教程中没有 JsfViewFactoryCreator,我找不到关于它的教程。
从 javadoc JsfViewFactoryCreator/JsfViewFactory 负责 RESTORE_VIEW 阶段。所以我深入研究了 JsfViewFactory 的 getView() 方法的源代码。
在第 105 行
UIViewRoot viewRoot = viewHandler.restoreView(facesContext, viewName);
调用 FlowViewHandler,它会生成相对于我的流文件路径的错误路径。
resourcePath = resolveResourcePath(RequestContextHolder.getRequestContext(), viewId);
所以我的问题是现在。如何将 UrlBasedViewResolver 与 flowRegistry/flowbuilderservices 正确关联,以便将 /WEB-INF/views/*.xthml 作为 xhtml 文件的路径。
或者,如果使用 UrlBasedViewResolver 可能是老式的(因为我在 jsf 的 spring web flow 文档中没有看到它)如何正确配置 webflow bean 以使用我定义的目录。
为了完整起见,这是我的 webflow-config.xml 文件
<!-- Executes flows: the central entry point into the Spring Web Flow system -->
<flow-executor id="flowExecutor">
<flow-execution-listeners>
<listener ref="facesContextListener" />
<listener ref="securityListener" />
</flow-execution-listeners>
</flow-executor>
<!-- The registry of executable flow definitions -->
<flow-registry id="flowRegistry" flow-builder-services="flowBuilderServices"
base-path="/WEB-INF/config/flow">
<flow-location-pattern value="/*.xml" />
</flow-registry>
<beans:bean id="flowBuilderServices"
class="org.springframework.webflow.engine.builder.support.FlowBuilderServices">
<beans:property name="expressionParser">
<beans:bean
class="org.springframework.webflow.expression.el.WebFlowELExpressionParser">
<beans:constructor-arg>
<beans:bean class="com.sun.el.ExpressionFactoryImpl" />
</beans:constructor-arg>
</beans:bean>
</beans:property>
<beans:property name="viewFactoryCreator">
<beans:bean
class="org.springframework.faces.webflow.JsfViewFactoryCreator" />
</beans:property>
<beans:property name="conversionService">
<beans:bean
class="org.springframework.binding.convert.service.DefaultConversionService">
</beans:bean>
</beans:property>
</beans:bean>