Bonjour à tous.
J'ai une erreur déclenchée par la FacesServlet de JSF dont voici la trace :
1 2 3 4 5 6 7 8 9 10 11
|
javax.faces.FacesException: Cannot forward after response has been committed
at com.sun.faces.context.ExceptionHandlerImpl.handle(ExceptionHandlerImpl.java:142)
at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:119)
at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:139)
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:594)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:630)
at org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:535)
at org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:472) |
En debuggant les sources de mon implémentation de JSF (mojarra 2.1.4) j'ai remarqué que cette exception était levée lors de l'instruction suivante :
lifecycle.render(context);
J'ai aussi remarqué que c'est le bout d'instruction suivant qui conduit à cette erreur :
1 2 3 4 5 6 7 8 9 10 11 12
| StreamResult iStreamResult = new StreamResult(new StringWriter());
if (pageContext != null) {
iStreamResult = new StreamResult(pageContext.getOut());
}
Source source = new DOMSource(iNode);
// Perform the transformation
iTransformer.transform(source, iStreamResult);
iStreamResult.getWriter().close(); |
notamment la ligne en gras. Si je remplace le par, par exemple,
new StreamResult(new StringWriter())
je n'ai plus d'exception levée mais bien évidemment je n'ai pas non plus le résultat escompté.
Ce que je ne comprends pas c'est que le problème vienne de la ligne en gras; si c'était le StreamResult qui posait problème, alors l'exception devrait toujours être levée si je met la ligne en gras en commentaire (ce qui n'est pas le cas). De plus je pense avoir fait le necessaire pour clore le flux.
Je précise que je fais appel à la servlet FacesServlet via une autre servlet (
iServletRequest.getRequestDispatcher("/FacesServlet/*").include(iServletRequest,iServletResponse);
).
Je sais que ce problème est assez pointilleux mais j'espère que vous pourrez m'éclaircir.
Merci d'avance.
Partager