spring-webflow icon indicating copy to clipboard operation
spring-webflow copied to clipboard

The view path cannot be resolved if the flow is located in the classpath. [SWF-1319]

Open spring-operator opened this issue 17 years ago • 5 comments

James ffolliott opened SWF-1319 and commented

This may be related to http://jira.springframework.org/browse/SPR-4681 however it does not appear to be fixed in swf 2.0.1 and spring 2.5.4.

The tomcat server that I deploy to has "unPackWars=false", therefore I keep my flows in the classpath. However, that means the view can't be resolved with a relative view path.

I get:

java.lang.IllegalStateException: A ContextResource is required to get relative view paths within this context
        at org.springframework.faces.webflow.JsfViewFactory.resolveViewName(JsfViewFactory.java:160)
        at org.springframework.faces.webflow.JsfViewFactory.getView(JsfViewFactory.java:84)
        at org.springframework.webflow.engine.ViewState.resume(ViewState.java:186)
        at org.springframework.webflow.engine.Flow.resume(Flow.java:535)
        at org.springframework.webflow.engine.impl.FlowExecutionImpl.resume(FlowExecutionImpl.java:261)
        at org.springframework.webflow.executor.FlowExecutorImpl.resumeExecution(FlowExecutorImpl.java:153)
        at org.springframework.webflow.mvc.servlet.FlowHandlerAdapter.handle(FlowHandlerAdapter.java:173)
        at org.springframework.webflow.mvc.servlet.FlowController.handleRequest(FlowController.java:172)
        at org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter.handle(SimpleControllerHandlerAdapter.java
:48)
        at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:875)
        at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:809)
        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:690)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:269)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:174)
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117)
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:108)
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:151)
        at org.apache.coyote.http11.Http11AprProcessor.process(Http11AprProcessor.java:834)
        at org.apache.coyote.http11.Http11AprProtocol$Http11ConnectionHandler.process(Http11AprProtocol.java:640)
        at org.apache.tomcat.util.net.AprEndpoint$Worker.run(AprEndpoint.java:1286)
        at java.lang.Thread.run(Thread.java:595)

My config files:

admin-webflow-config.xml:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:webflow="http://www.springframework.org/schema/webflow-config"
       xmlns:faces="http://www.springframework.org/schema/faces"
       xsi:schemaLocation="
           http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
           http://www.springframework.org/schema/webflow-config
           http://www.springframework.org/schema/webflow-config/spring-webflow-config-2.0.xsd
           http://www.springframework.org/schema/faces
           http://www.springframework.org/schema/faces/spring-faces-2.0.xsd">		

	<!-- Executes flows: the central entry point into the Spring Web Flow system -->	
	<webflow:flow-executor id="flowExecutor">
		<webflow:flow-execution-listeners>
			<webflow:listener ref="adminFlowExecutionListener" />
		</webflow:flow-execution-listeners>
	</webflow:flow-executor>
	
	<!-- Creates the registry of flow definitions for this application -->
	<webflow:flow-registry id="flowRegistry" flow-builder-services="facesFlowBuilderServices">
		<webflow:flow-location path="classpath:flows/admin/admin.xml"/>
	</webflow:flow-registry>

	<!-- Configures the Spring Web Flow JSF integration -->
	<faces:flow-builder-services id="facesFlowBuilderServices" />

</beans>

admin-webmvc-config.xml:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="
           http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">

	<!-- Maps request URIs to controllers -->			
	<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
		<property name="mappings">
			<props>
                <prop key="*/admin">flowController</prop>
            </props>
		</property>
		<property name="defaultHandler">
			<!-- Selects view names to render based on the request URI: e.g. /main selects "main" -->	
			<bean class="org.springframework.web.servlet.mvc.UrlFilenameViewController" />
		</property>
	</bean>

	<!-- Handles requests mapped to the Spring Web Flow system -->
	<bean id="flowController" class="org.springframework.webflow.mvc.servlet.FlowController">
		<property name="flowExecutor" ref="flowExecutor"/>
	</bean>

	<!-- Maps logical view names to Facelet templates (e.g. 'login' to '/WEB-INF/layouts/login.xhtml' -->
	<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/layouts/" />
		<property name="suffix" value=".xhtml" />
	</bean>

</beans>

admin-application-config.xml:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:context="http://www.springframework.org/schema/context"
	xsi:schemaLocation="
		http://www.springframework.org/schema/beans
		http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
		http://www.springframework.org/schema/context
		http://www.springframework.org/schema/context/spring-context-2.5.xsd">
	
	<bean id="admin" class="com.phantom.client.web.application.AdminApplication" />
	
	<!-- Imports the configurations of the different infrastructure systems of the application -->
	<import resource="admin-webmvc-config.xml" />
	<import resource="admin-webflow-config.xml" />

</beans>

web.xml:

<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
    version="2.4">
	
	<context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>
			/WEB-INF/config/admin-application-config.xml
		</param-value>
	</context-param>
	
	<listener>
		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
	</listener>

	<!-- The front controller of this Spring Web application, responsible for handling all application requests -->
	<servlet>
		<servlet-name>Spring MVC Dispatcher Servlet</servlet-name>
		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
		<init-param>
			<param-name>contextConfigLocation</param-name>
			<param-value></param-value>
		</init-param>
		<load-on-startup>2</load-on-startup>
	</servlet>
	
	<servlet-mapping>
		<servlet-name>Spring MVC Dispatcher Servlet</servlet-name>
		<url-pattern>/spring/*</url-pattern>
	</servlet-mapping>

...

</web-app>

Issue Links:

  • #613 Cannot load flows and views from classpath correctly in SWF 2.2.1 and JSF 2 ("is duplicated by")
  • #746 Modular bundling of Flows and XHTML ("is duplicated by")
  • #1562 JSF ViewFactory hard codes view id to resource mapping behavior which limits flexibilty of ViewHandler viewId->resource mapping logic

10 votes, 8 watchers

spring-operator avatar Jun 03 '08 09:06 spring-operator

Keith Donald commented

Can you try this with the latest nightly build against Spring 2.5.5 and report if this is still an issue? We've improved logging as well in this area.

spring-operator avatar Jul 12 '08 15:07 spring-operator

Keith Donald commented

We have researched this and it is currently a known limitation.

Currently, only flows located in a servlet or portlet context-relative path can load relative resources. Relative classpath flow resources are not possible at present, since the code for the JSF integration and the default MVC view->resource mapping logic is assuming the environment requires context-relative path Strings.

We will improve this in 2.0.4 for the JSF integration by allowing a custom ViewHandler to be used to map logical view ids to resources, with no such hard coded assumptions about a ContextResource. You can already do this with MVC views by plugging in a custom FlowResourceViewResolver. See #1562 for this.

As a workaround, I recommend for the time being you pack your flows and their resources inside the WAR you deploy within a WEB-INF directory there. There's still a WEB-INF even with WAR still packed.

spring-operator avatar Jul 30 '08 08:07 spring-operator

Keith Donald commented

see http://forum.springframework.org/showthread.php?t=64252

spring-operator avatar Dec 16 '08 09:12 spring-operator

Stephane Toussaint commented

Does branches 2.2.x or 3.0.x improve in any way this issue ? I'm not able to modularized (put flows and views in jars) the booking-faces sample for 2.2.0-RELEASE based on the workarounds found on the thread pointed by Keith. Must I try to work on those solutions or will another new feature leads to this point ?

spring-operator avatar Oct 26 '10 00:10 spring-operator

Donny A. Wijaya commented

JSF2ResourceResolver doesn't work. I experienced the same error when I tried to experiment with primefaces sample.

spring-operator avatar Nov 14 '10 16:11 spring-operator