Spring Webflow JSF视图位置



我正在尝试使用SpringWebFlow设置JSF应用程序。

我使用的是Spring 3.1弹簧面2.3.1JSF(api,impl)2.1.6

我的问题是程序没有采取正确的我的jsf视图的位置。

我发现了一些教程,比如

或http://dgparsons.org/jsf-and-spring-webflow.html用于集成jsf和springwebflow。

在其中一个视图中,解决方法是:

<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 中

当我尝试时,程序总是想打开start.xhtml从文件夹/WEB-INF/config/flow/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()方法的源代码。

JsfViewFactory.java

线路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流文档中没有看到),如何正确配置web流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>

所以我终于自己找到了方法,而且很简单。

正如spring-webflow文档中所写的-指定视图标识符Spring Webflow文档

解决方案是在流定义中使用一个绝对视图标识符:

<view-state id="enterBookingDetails" view="/WEB-INF/hotels/booking/bookingDetails.xhtml">

因此,不需要URLBasedViewResolver或JSFViewFactoryCreator的特殊配置。

最新更新