【问题标题】:Spring Webflow JSF View LocationSpring Webflow JSF 查看位置
【发布时间】:2012-11-18 17:55:33
【问题描述】:

我正在尝试使用 Spring Web Flow 设置 JSF 应用程序。

我正在使用 Spring 3.1 弹簧面 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/

我的 Flow 在目录 /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 flow 文档中没有看到它)如何正确配置 webflow beans 以使用我定义的目录。

为了完整起见,这里是我的 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>

【问题讨论】:

  • 你可以试试,前缀属性&lt;property name="prefix" value="/WEB-INF/views/" /&gt;而不是&lt;property name="prefix" value="/WEB-INF/views" /&gt;
  • 我试过了,但没有任何作用。问题是 ViewResolver 无法附加到 JsfViewFactoryCreator。如果我要使用 MvcViewFactoryCreator,我可以添加一个 viewresolver。但是在 JsfViewFactoryCreator 中没有设置器。在我看来,没有其他选择可以直接将 xhtml 文件放置在 flow.xml 文件所在的位置。这对我来说没有任何意义。

标签: jsf jsf-2 spring-webflow


【解决方案1】:

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-17
    • 2014-10-09
    • 2012-10-14
    • 1970-01-01
    • 1970-01-01
    • 2018-09-24
    • 2013-03-04
    • 2012-09-25
    相关资源
    最近更新 更多