JSF 2.0 Konvertieren von XHTML-Seite, um die PDF-Datei mit der Fliegenden Untertasse: java.lang.IllegalStateException
Ich versuche, zu konvertieren und zu exportieren einer JSF-Seite zu PDF. Ich habe versucht es auf folgende Weise:
Bean:
public void createPDF() {
try {
ITextRenderer renderer = new ITextRenderer();
renderer.setDocument(new URL(url).toString());
renderer.layout();
HttpServletResponse response = (HttpServletResponse) externalContext.getResponse();
response.reset();
response.setContentType("application/pdf");
response.setHeader("Content-Disposition", "inline; filename=\"" +PDF_FILE_NAME+ "\"");
OutputStream browserStream = response.getOutputStream();
renderer.createPDF(browserStream);
} catch (Exception ex) {
Logger.getLogger(PdfBean.class.getName()).log(Level.SEVERE, null, ex);
}
}
Seite mit der Schaltfläche PDF Erstellen /home.xhtml
:
<ui:define name="content">
<center>
<h:form id="pdfgen">
<h:panelGrid columns="2">
<h:outputText value="Enter Name:"/>
<h:inputText value="#{pdfBean.name}"/>
</h:panelGrid>
<h:commandButton value="Create PDF" action="#{pdfBean.createPDF()}"/>
</h:form>
</center>
</ui:define>
Die Seite, die ich konvertieren möchte:
<ui:define name="content">
<center>
<h:outputText value="Hello #{pdfBean.name}"/>
</center>
</ui:define>
Wenn ich versuche, dass ich eine PDF nur einmal, dann nie wieder. Ich habe folgenden Passenden Ausnahme:
SEVERE: Error Rendering View[/home.xhtml]
java.lang.IllegalStateException: PWC3991: getOutputStream() has already been called for this response
...
WARNING: StandardWrapperValve[Faces Servlet]: PWC1406: Servlet.service() for servlet Faces Servlet threw exception
java.lang.IllegalStateException: PWC3991: getOutputStream() has already been called for this response
Was mache ich falsch?
Aktualisiert Bean: sehen BalusC Antwort:
public void createPDF() {
FacesContext facesContext = FacesContext.getCurrentInstance();
ExternalContext externalContext = facesContext.getExternalContext();
String servername = externalContext.getRequestServerName();
String port = String.valueOf(externalContext.getRequestServerPort());
String appname = externalContext.getRequestContextPath();
String protocol = externalContext.getRequestScheme();
this.url = protocol + "://" + servername + ":" + port + appname + PDF_PAGE;
try {
ITextRenderer renderer = new ITextRenderer();
renderer.setDocument(new URL(url).toString());
renderer.layout();
HttpServletResponse response = (HttpServletResponse) externalContext.getResponse();
response.reset();
response.setContentType("application/pdf");
response.setHeader("Content-Disposition", "inline; filename=\"" + PDF_FILE_NAME + "\"");
OutputStream browserStream = response.getOutputStream();
renderer.createPDF(browserStream);
} catch (Exception ex) {
Logger.getLogger(PdfBean.class.getName()).log(Level.SEVERE, null, ex);
}
facesContext.responseComplete();
}
InformationsquelleAutor reen | 2011-04-14
Schreibe einen Kommentar Antworten abbrechen
Du musst angemeldet sein, um einen Kommentar abzugeben.
Müssen Sie anweisen, JSF, dass Sie schon die response-handling in Ihren Händen ist, und dass JSF sollten nicht mit der Standard-navigation, wenn die action-Methode abgeschlossen ist. Fügen Sie diese am Ende der action-Methode:
Update wie pro die Kommentare, greifen Sie auf
ExternalContext
als Instanz-variable, was darauf hindeutet, dass es zugewiesen und dieFacesContext
als class-variable, entwederstatic
oder als Eigenschaft eines session-scoped bean. Dies ist definitiv ein schlechte Idee. Sie sollten hand von Ihnen in der lokalen Methode vonFacesContext#getCurrentInstance()
und nie weisen Sie als Klassenvariable. Sie sind nämlich gebunden an einen bestimmten thread, den Antrag, die gibt es nicht in der nächsten Anfrage nicht mehr.IllegalStateException
dann bedeutet es, dass es keineFacesContext
mehr an diesem Punkt. Aber ich sehe keine mögliche Ursache für das. Haben Sie mehr code in der Methode, als Sie sind, die zeigen, wie weit du in deiner Frage?Ask Question
🙂 Tipp: jsessionid.