0

SpringWebFlowを使用してJSFアプリケーションをセットアップしようとしています。

Spring3.1を使用していますSpringfaces2.3.1 JSF(api、impl)2.1.6

私の問題は、プログラムが私のjsfビューの正しい場所を取得していないということです。

私はのようないくつかのチュートリアルを見つけました

またはhttp://dgparsons.org/jsf-and-spring-webflow.html(jsf とスプリングWebフローを統合する場合)。

これらのビューの1つでは、解決は次のように実行されます。

<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()メソッドのソースコードに飛び込みました。

JsfViewFactory.java

105行目

UIViewRoot viewRoot = viewHandler.restoreView(facesContext, viewName);

FlowViewHandlerが呼び出され、フローファイルのパスに対して間違ったパスが生成されます。

resourcePath = resolveResourcePath(RequestContextHolder.getRequestContext(), viewId);

だから私の質問は今です。UrlBasedViewResolverをflowRegistry/flowbuilderservicesに正しく関連付けて、xhtmlファイルへのパスとして/WEB-INF/views/*.xthmlを取得するにはどうすればよいですか。

または、UrlBasedViewResolverを使用するのが古風な場合(jsfの春のWebフロードキュメントでは見られなかったため)、定義したディレクトリを使用するようにWebFlowBeanを正しく構成するにはどうすればよいですか。

完全を期すために、ここに私の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>
4

1 に答える 1

1

それで、ついに私はそれへの道を自分で見つけました、そしてそれは非常に簡単でした。

SpringWebflowのドキュメントに記載されているとおり-ビュー識別子の指定 SpringWebflowドキュメント

解決策は、フロー定義で絶対ビュー識別子を使用することです。

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

したがって、URLBasedViewResolverやJSFViewFactoryCreatorの特別な構成は必要ありません。

于 2012-12-03T13:22:19.860 に答える