Bonjour,

Je travaille avec Spring Webflow 2.0.8 et j'ai un problème. L'application web doit générer un fichier excel et le proposer en téléchargement à l'utilisateur. Donc, j'ai suivi ce qui est donné dans la doc de référence spring http://static.springsource.org/sprin...l/ch05s07.html paragraphe streaming actions.

Dans le flow (qui s'appelle consultation), on a :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
    <view-state id="syntheseView" model="syntheseModel" view="syntheseJsp">
        <transition on="retour" to="rechercheView" />
        <transition on="exporter">
            <evaluate expression="excelService"/>   
        </transition>
    </view-state>
Le service de génération du fichier excel est le suivant :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class ExcelService extends AbstractAction {
 
    @Override
    protected Event doExecute(RequestContext context) throws Exception {
        HttpServletResponse response = (HttpServletResponse)context.getExternalContext().getNativeResponse();
        XlsFileManager xlsFileManager = new XlsFileManager();
        ModeleMetier modeleMetier = (ModeleMetier)context.getFlowScope().get("modeleMetier ");
        HSSFWorkbook wb = xlsFileManager.createXlsStream(modeleMetier );
        response.setContentType("application/vnd.ms-excel");
        response.setHeader("Content-Disposition","attachment; filename=fichiertoutbeantoutpropre.xls; charset=cp1252");
        ServletOutputStream sos = response.getOutputStream();
        wb.write(sos);
        sos.close();
        context.getExternalContext().recordResponseComplete();
        return success();
    }
}

Le comportement observé est le suivant :
dans la page synthèse, on clique sur le bouton "exporter", la génération du fichier excel se fait et on récupère son document. La page synthèse elle, n'a pas bougé. Jusqu'ici, tout va bien.
Ensuite, on clique sur un bouton de la page (exemple : le bouton "retour" qui appelle la transaction "retour").
Et là, c'est le drame. L'application plante avec la magnifique trace d'erreur suivante :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
2010/06/03-18:44:58 [ACTIVE] ExecuteThread: '0' for queue: 'weblogic.kernel.Default (self-tuning)' org.springframework.web.servlet.DispatcherServlet DEBUG Could not complete request
org.springframework.webflow.execution.FlowExecutionException: Exception thrown in state 'syntheseView' of flow 'consultation'
    at org.springframework.webflow.engine.impl.FlowExecutionImpl.wrap(FlowExecutionImpl.java:569)
    at org.springframework.webflow.engine.impl.FlowExecutionImpl.resume(FlowExecutionImpl.java:263)
    at org.springframework.webflow.executor.FlowExecutorImpl.resumeExecution(FlowExecutorImpl.java:163)
    at org.springframework.webflow.mvc.servlet.FlowHandlerAdapter.handle(FlowHandlerAdapter.java:183)
    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.doPost(FrameworkServlet.java:511)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:820)
    at weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:226)
    at weblogic.servlet.internal.StubSecurityHelper.invokeServlet(StubSecurityHelper.java:124)
    at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:283)
    at weblogic.servlet.internal.TailFilter.doFilter(TailFilter.java:26)
    at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:42)
    at org.springframework.security.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:378)
    at org.springframework.security.ui.ExceptionTranslationFilter.doFilterHttp(ExceptionTranslationFilter.java:101)
    at org.springframework.security.ui.SpringSecurityFilter.doFilter(SpringSecurityFilter.java:53)
    at org.springframework.security.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:390)
    at org.springframework.security.ui.logout.LogoutFilter.doFilterHttp(LogoutFilter.java:89)
    at org.springframework.security.ui.SpringSecurityFilter.doFilter(SpringSecurityFilter.java:53)
    at org.springframework.security.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:390)
    at org.springframework.security.ui.preauth.AbstractPreAuthenticatedProcessingFilter.doFilterHttp(AbstractPreAuthenticatedProcessingFilter.java:69)
    at org.springframework.security.ui.SpringSecurityFilter.doFilter(SpringSecurityFilter.java:53)
    at org.springframework.security.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:390)
    at org.springframework.security.context.HttpSessionContextIntegrationFilter.doFilterHttp(HttpSessionContextIntegrationFilter.java:235)
    at org.springframework.security.ui.SpringSecurityFilter.doFilter(SpringSecurityFilter.java:53)
    at org.springframework.security.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:390)
    at org.springframework.security.util.FilterChainProxy.doFilter(FilterChainProxy.java:175)
    at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:236)
    at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:167)
    at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:42)
    at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.run(WebAppServletContext.java:3393)
    at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:321)
    at weblogic.security.service.SecurityManager.runAs(Unknown Source)
    at weblogic.servlet.internal.WebAppServletContext.securedExecute(WebAppServletContext.java:2140)
    at weblogic.servlet.internal.WebAppServletContext.execute(WebAppServletContext.java:2046)
    at weblogic.servlet.internal.ServletRequestImpl.run(ServletRequestImpl.java:1366)
    at weblogic.work.ExecuteThread.execute(ExecuteThread.java:200)
    at weblogic.work.ExecuteThread.run(ExecuteThread.java:172)
Caused by: java.lang.ClassCastException: [Ljava.lang.String;
    at org.springframework.web.util.WebUtils.findParameterValue(WebUtils.java:565)
    at org.springframework.webflow.mvc.view.AbstractMvcView.determineEventId(AbstractMvcView.java:317)
    at org.springframework.webflow.mvc.view.AbstractMvcView.getEventId(AbstractMvcView.java:282)
    at org.springframework.webflow.mvc.view.AbstractMvcView.userEventQueued(AbstractMvcView.java:191)
    at org.springframework.webflow.engine.ViewState.resume(ViewState.java:195)
    at org.springframework.webflow.engine.Flow.resume(Flow.java:545)
    at org.springframework.webflow.engine.impl.FlowExecutionImpl.resume(FlowExecutionImpl.java:259)
    ... 38 more
2010/06/03-18:44:58 [ACTIVE] ExecuteThread: '0' for queue: 'weblogic.kernel.Default (self-tuning)' org.springframework.security.context.HttpSessionContextIntegrationFilter DEBUG SecurityContextHolder now cleared, as request processing completed
<3 juin 2010 18 h 44 CEST> <Error> <HTTP> <BEA-101017> <[weblogic.servlet.internal.WebAppServletContext@52d188 - appName: '_appsdir_monAppli_dir', name: 'monAppli', context-path: '/monAppli'] Root cause of ServletException.
org.springframework.webflow.execution.FlowExecutionException: Exception thrown in state 'syntheseView' of flow 'consultation'
    at org.springframework.webflow.engine.impl.FlowExecutionImpl.wrap(FlowExecutionImpl.java:569)
    at org.springframework.webflow.engine.impl.FlowExecutionImpl.resume(FlowExecutionImpl.java:263)
    at org.springframework.webflow.executor.FlowExecutorImpl.resumeExecution(FlowExecutorImpl.java:163)
    at org.springframework.webflow.mvc.servlet.FlowHandlerAdapter.handle(FlowHandlerAdapter.java:183)
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:875)
    Truncated. see log file for complete stacktrace
java.lang.ClassCastException: [Ljava.lang.String;
    at org.springframework.web.util.WebUtils.findParameterValue(WebUtils.java:565)
    at org.springframework.webflow.mvc.view.AbstractMvcView.determineEventId(AbstractMvcView.java:317)
    at org.springframework.webflow.mvc.view.AbstractMvcView.getEventId(AbstractMvcView.java:282)
    at org.springframework.webflow.mvc.view.AbstractMvcView.userEventQueued(AbstractMvcView.java:191)
    at org.springframework.webflow.engine.ViewState.resume(ViewState.java:195)
    Truncated. see log file for complete stacktrace
En fait, après avoir envoyé le fichier, il semblerait que le flow soit corrompu. et malgré plusieurs recherches, je ne sais pas quoi faire.
Donc ma question plus générale est la suivante : comment implémente t-on un download de fichier avec spring webflow ?

D'avance merci.