1

JSF 統合を使用して最初の swf アプリケーションを作成しているときに、次のエラーが表示されます。最初のリクエストでフロー定義を解析するときに、クラス「dataModel」をロードできません。

<faces:flow-builder-services/>私のWebflowアプリケーションコンテキストにはタグが含まれていますが、そのエイリアスのクラスを見つけようとしているときにFacesConversionService(「dataModel」エイリアスを理解するクラス)が呼び出されないようです。

原因を突き止めようとしてデバッグを行ったところ、次のことに気付きました。

  1. を含む xml ファイルが<faces:flow-builder-services/>コンテキストローダーリスナーによってロードされ、facesConversionService Bean が登録されます
  2. フロー ハンドラー マッピングとアダプターが正しく呼び出され、リクエストが予想されるフローに転送され、その定義がその場で作成されます。
  3. フローの内部インフラストラクチャ オブジェクトを作成するときに、swf は、リスナーによって読み込まれたアプリ コンテキストの上に Web アプリケーション コンテキストを作成します。この新しい wac には、swf スコープなどの定義が含まれており、上記のリスナーのアプリケーション コンテキストが親として含まれています。
  4. フローのフロー定義ファイルが見つかって解析され、評価要素の結果の型のクラスを見つけようとすると、変換サービスは 'dataModel' エイリアスを認識しません。

実際、最後のポイントで面白いのは、変換サービスが、上記のポイント 3. で作成されたアプリケーション コンテキストでローカル Bean として検索されるか、見つからない場合は親フロー ビルダー コンテキストで検索されることです。

顔変換サービスは、コンテキストのローカル Bean ではなく (フロー コンテキストの親コンテキストに登録されています)、フロー ビルダー コンテキストの変換サービスとして登録されていません (少なくとも、<flow:flow-registry/>要素によって作成される FlowBuilderContextImpl です)。 )。

誰が何がうまくいかなかったのか知っていますか?

アプリケーションサーバーとは関係ないと思いますが、念のため、Spring 2.5.6 と webflow 2.0.8.RELEASE を使用して websphere 6.1.0.23 で実行しています。

ここに私の設定ファイルがあります:

web.xml:

<listener>
  <listener-class>
    org.springframework.web.context.ContextLoaderListener
  </listener-class>
</listener>
<context-param>
  <param-name>contextConfigLocation</param-name>
  <param-value>/WEB-INF/applicationContext-*.xml</param-value>
</context-param>
...
<servlet>
  <servlet-name>Spring MVC Dispatcher Servlet</servlet-name>
  <servlet-class>org.springframework.web.servlet.DispatcherServlet
  <init-param>
    <param-name>contextConfigLocation</param-name>
    <param-value></param-value>
  </init-param>
  <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
  <servlet-name>Spring MVC Dispatcher Servlet</servlet-name>
  <url-pattern>/swf/*</url-pattern>
</servlet-mapping>

MVC 部分の Bean 定義 (/WEB-INF/applicationContext-webmvc.xml):

<bean class="org.springframework.webflow.mvc.servlet.FlowHandlerMapping">
  <property name="flowRegistry" ref="flowRegistry" />
  <property name="defaultHandler">
    <bean class="org.springframework.web.servlet.mvc.UrlFilenameViewController" />
  </property>
</bean>

<bean class="org.springframework.webflow.mvc.servlet.FlowHandlerAdapter">
  <property name="flowExecutor" ref="flowExecutor" />
</bean>

<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/" />
  <property name="suffix" value=".jspx" />
</bean>

<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter" />

swf 部分の Bean 定義 (/WEB-INF/applicationContext-webflow.xml):

<flow:flow-registry id="flowRegistry" base-path="/WEB-INF/flows">
  <flow:flow-location path="/navigation/navigation.xml"/>
  <flow:flow-location path="/edition/edition.xml"/>
</flow:flow-registry>

<flow:flow-executor id="flowExecutor">
  <flow:flow-execution-listeners>
      <flow:listener ref="jpaFlowExecutionListener" criteria="edition"/>
  </flow:flow-execution-listeners>
</flow:flow-executor>

<faces:flow-builder-services id="facesFlowBuilderServices" development="true"/>

<bean id="jpaFlowExecutionListener" 
        class="org.springframework...JpaFlowExecutionListener">
  <constructor-arg ref="entityManagerFactory" />
  <constructor-arg ref="transactionManager" />
</bean>

例外のスタック トレース:

[Servlet Error]-[Spring MVC Dispatcher Servlet]: java.lang.IllegalArgumentException: Unable to load class 'dataModel'                                                                
 at org.springframework.webflow.engine.builder.model.FlowModelFlowBuilder.toClass(FlowModelFlowBuilder.java:965)                                                                    
 at org.springframework.webflow.engine.builder.model.FlowModelFlowBuilder.parseEvaluationActionResultExposer(FlowModelFlowBuilder.java:867)                                         
 at org.springframework.webflow.engine.builder.model.FlowModelFlowBuilder.parseEvaluateAction(FlowModelFlowBuilder.java:858)                                                        
 at org.springframework.webflow.engine.builder.model.FlowModelFlowBuilder.parseActions(FlowModelFlowBuilder.java:834)                                                               
 at org.springframework.webflow.engine.builder.model.FlowModelFlowBuilder.parseAndAddViewState(FlowModelFlowBuilder.java:547)                                                       
 at org.springframework.webflow.engine.builder.model.FlowModelFlowBuilder.buildStates(FlowModelFlowBuilder.java:207)                                                                
 at org.springframework.webflow.engine.builder.FlowAssembler.directAssembly(FlowAssembler.java:106)                                                                                 
 at org.springframework.webflow.engine.builder.FlowAssembler.assembleFlow(FlowAssembler.java:91)                                                                                    
 at org.springframework.webflow.engine.builder.DefaultFlowHolder.assembleFlow(DefaultFlowHolder.java:109)                                                                           
 at org.springframework.webflow.engine.builder.DefaultFlowHolder.getFlowDefinition(DefaultFlowHolder.java:84)                                                                       
 at org.springframework.webflow.definition.registry.FlowDefinitionRegistryImpl.getFlowDefinition(FlowDefinitionRegistryImpl.java:61)                                                
 at org.springframework.webflow.executor.FlowExecutorImpl.launchExecution(FlowExecutorImpl.java:138)                                                                                
 at org.springframework.webflow.mvc.servlet.FlowHandlerAdapter.handle(FlowHandlerAdapter.java:193)                                                                                  
 at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:875)                                                                                        
 at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:807)                                                                                         
 at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:571)                                                                                      
 at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:501)                                                                                               
 at javax.servlet.http.HttpServlet.service(HttpServlet.java:743)
4

2 に答える 2

0

flow:flow-registry 要素に flow-builder-services 属性を指定するのを忘れていました!!! 今は完璧に動作します。

<flow:flow-registry id="flowRegistry" base-path="/WEB-INF/flows" flow-builder-services="facesFlowBuilderServices">
   <flow:flow-location path="/navigation/navigation.xml"/>
   <flow:flow-location path="/edition/edition.xml"/>
</flow:flow-registry>

<faces:flow-builder-services id="facesFlowBuilderServices" development="true"/>
于 2009-11-27T12:44:15.993 に答える