Insérer une image avec itext - Java - Programmation
Marsh Posté le 26-11-2008 à 10:25:48
Citation : java.lang.IllegalStateException: "getOutputStream()" a déjà été appelé pour cette réponse |
L'erreur n'a rien à voir avec iText mais plus avec ce que tu fais après.
en effet, une requette Http ne peut avoir qu'une réponse, soit tu retourne un PDF, soit tu affiches une page.
Ici tu veux retourner un PDF, donc il n'y a pas de page, donc pas de forward à la fin de ton action.
D'une façon générale, dans une action struts, si on joue avec l'OutputStream de la reponse, on doit retourner null.
Code :
|
Marsh Posté le 26-11-2008 à 10:41:26
C'est déjà le cas je retourne null. voiçi mon action :
------------------------------------------------------------------------
public ActionForward editionPdf(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception {
ActionBean actionBean = (ActionBean) request.getSession().getAttribute("actionBeanForUpdate" );
Document document = new Document(PageSize.A4);
try {
response.setContentType("application/pdf" );
String fileName = "DetailAction"+actionBean.getCodeAction()+".pdf";
response.addHeader("Content-disposition", "attachment; filename=\"" + fileName +"\"" );
PdfWriter.getInstance(document, response.getOutputStream());
// DEBUT DU DOCUMENT
document.open();
Paragraph p9 = new Paragraph();
p9.add(new Phrase("Commentaires : ", new Font(Font.HELVETICA, 10, Font.NORMAL, Color.decode("#0052AD" ))));
p9.add("\n\n" );
document.add(p9);
Image image = new Image.getInstance("http://forum-images.hardware.fr/icones/smilies/pt1cable.gif" );
document.add(image);
}catch(DocumentException de) {
de.printStackTrace();
System.err.println("document: " + de.getMessage());
}
document.close();
return null;
}
----------------------------------------------------------------------------
Il n y a rien d'anormal
Marsh Posté le 26-11-2008 à 14:22:11
Citation : java.lang.IllegalStateException: "getOutputStream()" a déjà été appelé pour cette réponse |
en suivant la stacktrace de bas en haut on peut déduire l'enchainement suivant :
1) une action a été lancée et a priori elle s'est bien terminée (ActionServlet.process)
2) cette action a fait un forward vers un layout (doForward puis processTilesDefinition)
3) ce layout fait intervenir "defaultPage.jsp" et doit faire un template:insert
4) pour une raison X ou Y cet insert se passe mal (processException)
5) comme la réponse à déjà été utilisée, Tomcat n'arrive pas à écrire la stacktrace de cette erreur
c'est probablement l'action appelée en 1) qui a écrit dans la réponse
Peux tu nous montrer le contenu de defaultPage.jsp et comment tout ça est appelé (code html du lien ou bouton qui déclanche tout)
Marsh Posté le 26-11-2008 à 14:35:19
Autre chose, tu devrais catcher les exceptions de type IOException (possible lors du response.getOutputStream() et Image.getInstance)
Code :
|
ça compile chez toi ça ?
pour moi, le new est en trop (appel de la méthode static Image.getInstance(String))
Marsh Posté le 26-11-2008 à 14:53:22
Merci pour tes explication bidem. Le new Image ne compile pas chez moi non plus (ça marche bien avec Image.getInstance).
Voiçi les contenu des différents fichiers :
Struts_config.xml
----------------
....
<form-bean name="editionPdfForm" type="com.proj.jp.vue.form.ActionJpForm"/>
.....
<action path="/editionPdf"
name="editionPdfForm"
parameter="action"
type="com.proj.jp.vue.action.ActionJpAction"
scope="request"
validate="false">
<forward name="editionPdf" path="editionPdf"/>
</action>
....
Tiles.xml
--------
.....
<definition name="reportingList" extends="defaultPanel">
<put name="content" value="/jsp/reportingList.jsp" />
<put name="pageId" value="reportingList" />
<put name="menu" value="non" />
</definition>
.....
Tiles_defs.xml
-------------
<definition name="defaultPage" path="/jsp/common/defaultPage.jsp">
<!-- pages definitions -->
<put type="page" name="header" />
<put type="page" name="content" />
<put type="page" name="footer" />
<!-- attributes definitions -->
<put type="string" name="pageId" />
<put type="string" name="menu" />
</definition>
mon action : ActionJpAction.java
--------------------------------
ce que j'ai écrit au dessus
Ma_jsp.jsp
----------
.....
<html:form name="editionPdf" action="/editionPdf.do?action=editionPdf" type="com.proj.jp.vue.form.ActionJpForm">
<input class="buttom" type="submit" value="Editer" />
</html:form>
....
Merci encore une fois bidem
Marsh Posté le 26-11-2008 à 17:58:46
J'ai un doute quant au lien entre editionPdf et la stacktrace.
En effet la stacktrace montre clairement qu'il y a un forward fait après l'action.
Essaye le code suivant pour être sûr qu'on passe bien par où on pense :
Code :
|
Si tu as l'affichage "responseUsed == true" c'est qu'on a isolé le problème (une exception lancée donc Struts faisait un forward vers la page d'erreur)
Si tu n'as pas "Erreur Exception : ...", je sèche
Marsh Posté le 26-11-2008 à 18:10:51
Effectivement ça génère un exception mais pas de responseUsed.
java.net.ConnectException: Connection timed out: connect
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.PlainSocketImpl.doConnect(Unknown Source)
at java.net.PlainSocketImpl.connectToAddress(Unknown Source)
at java.net.PlainSocketImpl.connect(Unknown Source)
at java.net.Socket.connect(Unknown Source)
at java.net.Socket.connect(Unknown Source)
at sun.net.NetworkClient.doConnect(Unknown Source)
at sun.net.www.http.HttpClient.openServer(Unknown Source)
at sun.net.www.http.HttpClient.openServer(Unknown Source)
at sun.net.www.http.HttpClient.<init>(Unknown Source)
at sun.net.www.http.HttpClient.New(Unknown Source)
at sun.net.www.http.HttpClient.New(Unknown Source)
at sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(Unknown Source)
at sun.net.www.protocol.http.HttpURLConnection.plainConnect(Unknown Source)
at sun.net.www.protocol.http.HttpURLConnection.connect(Unknown Source)
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(Unknown Source)
at java.net.URL.openStream(Unknown Source)
at com.lowagie.text.Image.getInstance(Unknown Source)
at com.lowagie.text.Image.getInstance(Unknown Source)
at com.Proj.jp.vue.action.ActionJpAction.editionPdf(ActionJpAction.java:542)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.apache.struts.actions.DispatchAction.dispatchMethod(DispatchAction.java:280)
at org.apache.struts.actions.DispatchAction.execute(DispatchAction.java:216)
at com.Proj.jp.vue.BasicDispatchAction.execute(BasicDispatchAction.java:33)
at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:484)
at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:274)
at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1482)
at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:525)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:710)
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.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:433)
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:174)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:874)
at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:665)
at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:528)
at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:81)
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:689)
at java.lang.Thread.run(Unknown Source)
Erreur IOException : Connection timed out: connect
Marsh Posté le 27-11-2008 à 10:39:00
Citation : java.net.ConnectException: Connection timed out: connect |
Voilà on a trouvé l'erreur d'origine, c'est "juste" un problème d'accès à l'URL de l'image.
tu est derrière un proxy ?
si oui, il faut configurer le bousin
Code :
|
Marsh Posté le 26-11-2008 à 09:54:12
Bonjour,
J'essaie d'insérer une image avec itext, mais je n'y arrive pas. Voiçi le bot de mon code :
-----------------------------------------------------
Paragraph p9 = new Paragraph();
p9.add(new Phrase("Commentaires : ", new Font(Font.HELVETICA, 10, Font.NORMAL, Color.decode("#0052AD" ))));
p9.add("\n\n" );
document.add(p9);
Image image = Image.getInstance("images/information.png" );
document.add(image);
----------------------------------------------------
Le serveur web (Tomcat) m'affiche l'erreur suivante :
---------------------------------------------------
org.apache.jasper.JasperException: "getOutputStream()" a déjà été appelé pour cette réponse
org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:460)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:367)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:329)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:265)
javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
org.apache.struts.action.RequestProcessor.doForward(RequestProcessor.java:1069)
org.apache.struts.tiles.TilesRequestProcessor.doForward(TilesRequestProcessor.java:274)
org.apache.struts.tiles.TilesRequestProcessor.processTilesDefinition(TilesRequestProcessor.java:254)
org.apache.struts.tiles.TilesRequestProcessor.processForwardConfig(TilesRequestProcessor.java:309)
org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:279)
org.apache.struts.action.ActionServlet.process(ActionServlet.java:1482)
org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:525)
javax.servlet.http.HttpServlet.service(HttpServlet.java:710)
javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
cause mère
java.lang.IllegalStateException: "getOutputStream()" a déjà été appelé pour cette réponse
org.apache.catalina.connector.Response.getWriter(Response.java:607)
org.apache.catalina.connector.ResponseFacade.getWriter(ResponseFacade.java:196)
org.apache.jasper.runtime.JspWriterImpl.initOut(JspWriterImpl.java:125)
org.apache.jasper.runtime.JspWriterImpl.flushBuffer(JspWriterImpl.java:118)
org.apache.jasper.runtime.JspWriterImpl.flush(JspWriterImpl.java:173)
java.io.PrintWriter.newLine(Unknown Source)
java.io.PrintWriter.println(Unknown Source)
java.io.PrintWriter.println(Unknown Source)
java.lang.Throwable.printStackTrace(Unknown Source)
org.apache.struts.taglib.tiles.InsertTag$InsertHandler.processException(InsertTag.java:947)
org.apache.struts.taglib.tiles.InsertTag$InsertHandler.doEndTag(InsertTag.java:914)
org.apache.struts.taglib.tiles.InsertTag.doEndTag(InsertTag.java:473)
org.apache.jsp.jsp.common.defaultPage_jsp._jspx_meth_tiles_005finsert_005f0(defaultPage_jsp.java:455)
org.apache.jsp.jsp.common.defaultPage_jsp._jspx_meth_c_005fif_005f0(defaultPage_jsp.java:411)
org.apache.jsp.jsp.common.defaultPage_jsp._jspx_meth_html_005fhtml_005f0(defaultPage_jsp.java:258)
org.apache.jsp.jsp.common.defaultPage_jsp._jspService(defaultPage_jsp.java:113)
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:98)
javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:331)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:329)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:265)
javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
org.apache.struts.action.RequestProcessor.doForward(RequestProcessor.java:1069)
org.apache.struts.tiles.TilesRequestProcessor.doForward(TilesRequestProcessor.java:274)
org.apache.struts.tiles.TilesRequestProcessor.processTilesDefinition(TilesRequestProcessor.java:254)
org.apache.struts.tiles.TilesRequestProcessor.processForwardConfig(TilesRequestProcessor.java:309)
org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:279)
org.apache.struts.action.ActionServlet.process(ActionServlet.java:1482)
org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:525)
javax.servlet.http.HttpServlet.service(HttpServlet.java:710)
javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
-------------------------------------------------------------------------------------------