Hey I'm trying something similar with the swf-booking-faces sample bundled in the swf 2.0.5 dist
I've added the controller
Code:
package org.springframework.webflow.samples.jasper;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.multiaction.MultiActionController;
import org.springframework.webflow.samples.booking.Hotel;
import org.springframework.stereotype.Service;
import java.io.Serializable;
//I made my controller and modelAndView serializable to use it in the flow...
@Service
public class ReportController extends MultiActionController implements Serializable {
private static final long serialVersionUID = 1L;
public ModelAndView handleSimpleReport(List<Hotel> hotels) throws Exception {
System.out.println("handleSimpleReport()");
//Map mpHotels = (Map)hotels;
return new SwfModelAndView("simpleReport", getModel(hotels));
}
private Map getModel(List<Hotel> hotels) {
System.out.println("getModel");
Map model = new HashMap();
model.put("ReportTitle", "Dear Lord!");
model.put("datasource", hotels);
return model;
}
}
and extended the ModelAndView (probably didn't need to,however..)
Code:
package org.springframework.webflow.samples.jasper;
import java.io.Serializable;
import java.util.Map;
import org.springframework.web.servlet.ModelAndView;
public class SwfModelAndView extends ModelAndView implements Serializable {
private static final long serialVersionUID = 1L;
public SwfModelAndView(String viewName,Map model){}
}
in views.properties..
Code:
simpleReport.class=org.springframework.web.servlet.view.jasperreports.JasperReportsPdfView
simpleReport.url=/WEB-INF/reports/report2.jasper
simpleReport.reportDataKey=datasource
but I have concluded that my problem resides in reolving my views..
in webmvc-config.xml I need the views to go to ResourceBundleViewResolver for jasper and otherwise toUrlBasedViewResolver...
but how to do this?
it will always resolve to /WEB-INF/simpleReport.xhtml when I want it to go to the views.properties file to lookup the file
see the configs below..
Code:
<!-- Maps request paths to flows in the flowRegistry; e.g. a path of /hotels/booking looks for a flow with id "hotels/booking" -->
<bean class="org.springframework.webflow.mvc.servlet.FlowHandlerMapping">
<property name="flowRegistry" ref="flowRegistry" />
<property name="defaultHandler">
<!-- If no flow match, map path to a view to render; e.g. the "/intro" path would map to the view named "intro" -->
<bean class="org.springframework.web.servlet.mvc.UrlFilenameViewController" />
</property>
</bean>
<!-- Maps logical view names to Facelet templates in /WEB-INF (e.g. 'search' to '/WEB-INF/search.xhtml' -->
<bean id="faceletsViewResolver" class="org.springframework.web.servlet.view.c">
<property name="viewClass" value="org.springframework.faces.mvc.JsfView"/>
<property name="prefix" value="/WEB-INF/" />
<property name="suffix" value=".xhtml" />
<property name="order"><value>1</value></property>
</bean>
<!-- <bean id="pdfViewResolver" class="org.springframework.web.servlet.view.UrlBasedViewResolver">
<property name="viewClass" value="org.springframework.webflow.samples.util.PdfPage"/>
<property name="prefix" value="/WEB-INF/" />
<property name="suffix" value=".pdf" />
</bean> -->
<!-- the ResourceBundleViewResolver -->
<bean id="viewResolver" class="org.springframework.web.servlet.view.ResourceBundleViewResolver">
<property name="basename" value="views"/>
<property name="order"><value>0</value></property>
</bean>
<!-- Dispatches requests mapped to org.springframework.web.servlet.mvc.Controller implementations -->
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter" />
<!-- Dispatches requests mapped to flows to FlowHandler implementations -->
<bean class="org.springframework.webflow.mvc.servlet.FlowHandlerAdapter">
<property name="flowExecutor" ref="flowExecutor" />
</bean>
(see subflow below...)
Code:
<var name="reportController" class="org.springframework.webflow.samples.jasper.ReportController" />
<var name="modelAndView" class="org.springframework.web.servlet.ModelAndView" />
<input name="hotels" required="true" type="dataModel" />
<input name="searchCriteria" required="true" />
<on-start>
<evaluate expression="bookingService.addMsg('now in subflow...')" />
<evaluate expression="reportController.handleSimpleReport(bookingService.findHotels(searchCriteria,externalContext.locale))" result="flowScope.modelAndView" />
</on-start>
<view-state id="simpleReport" popup="true">
<on-entry>
<evaluate expression="bookingService.addMsg('entered view-state displayPdfState')" />
</on-entry>
</view-state>
So I do get the following output msgs from my flow that calls the controller..
handleSimpleReport() and getModel so i know the modelAndView is returned
yet...
Code:
2009-09-20 22:47:21,568 DEBUG [org.springframework.webflow.engine.Flow] - <Restoring [FlowVariable@1ea01711 name = 'reportController', valueFactory = [BeanFactoryVariableValueFactory@204a6ccc type = ReportController]]>
2009-09-20 22:47:21,568 DEBUG [org.springframework.webflow.engine.Flow] - <Restoring [FlowVariable@2ff1bf46 name = 'modelAndView', valueFactory = [BeanFactoryVariableValueFactory@2844a541 type = ModelAndView]]>
2009-09-20 22:47:21,677 DEBUG [org.springframework.faces.webflow.FlowViewStateManager] - <No matching view in view scope>
2009-09-20 22:47:21,677 DEBUG [org.springframework.faces.webflow.JsfViewFactory] - <Creating UIViewRoot from 'simpleReport.xhtml'>
2009-09-20 22:47:21,677 DEBUG [org.springframework.webflow.engine.ViewState] - <Rendering + [JSFView = '/WEB-INF/flows/pdfHotels/simpleReport.xhtml']>
2009-09-20 22:47:21,677 DEBUG [org.springframework.webflow.engine.ViewState] - < Flash scope = map['flowRenderResponse' -> true]>
2009-09-20 22:47:21,786 DEBUG [org.springframework.webflow.engine.ViewState] - < Messages = [DefaultMessageContext@708a605c sourceMessages = map[[null] -> list[[empty]]]]>
2009-09-20 22:47:21,786 DEBUG [org.springframework.faces.support.RequestLoggingPhaseListener] - <Entering JSF Phase: RENDER_RESPONSE 6>
2009-09-20 22:47:21,786 DEBUG [org.springframework.faces.webflow.JsfView] - <Asking view handler to render view>
20-Sep-2009 10:47:21 PM com.sun.facelets.FaceletViewHandler handleRenderException
SEVERE: Error Rendering View[/WEB-INF/flows/pdfHotels/simpleReport.xhtml]
In short how do I target the correct viewResolver for the right case, must be a solution out there !
Any suggestions as to what changes to make?
Has anyone succeeded in adding jasperreports to the swf-booking-faces example?
my best regards to all!
Kevin u out there?