JasperReports with JBoss seam
cleitonash Oct 13, 2009 4:32 PMHi.
I'm using jboss-4.2.3.GA and jboss-seam-2.2.0.GA, and to create my reports, i'm using jasperreports-3.6.0 and ireport-nb.3.6.0. I created a very simple report, wich don't have parameters, only one static field, then I created a desktop application to test, and it works. And then I created a xhtml file into the itext example of jboss seam, that calls an seam action to generate the report, below is my code.
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://java.sun.com/jsf/html" xmlns:f="http://java.sun.com/jsf/core" xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:s="http://jboss.com/products/seam/taglib"> <head> <title>Generate Report</title> </head> <body> <h1>Generate report</h1> <ul> <s:button id="report" value="Generate" action="#{reportAction.create}"/> </ul> </body> </html>
and below is my seam action
package org.jboss.seam.example.pdf; import java.io.ByteArrayOutputStream; import java.io.File; import java.net.URL; import java.util.HashMap; import java.util.List; import javax.faces.context.FacesContext; import javax.servlet.ServletContext; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletResponse; import net.sf.jasperreports.engine.JREmptyDataSource; import net.sf.jasperreports.engine.JasperExportManager; import net.sf.jasperreports.engine.JasperFillManager; import net.sf.jasperreports.engine.JasperPrint; import net.sf.jasperreports.view.JasperViewer; import org.jboss.seam.ScopeType; import org.jboss.seam.annotations.In; import org.jboss.seam.annotations.Logger; import org.jboss.seam.annotations.Name; import org.jboss.seam.annotations.Scope; import org.jboss.seam.annotations.datamodel.DataModel; import org.jboss.seam.international.StatusMessages; import org.jboss.seam.log.Log; @Name("reportAction") @Scope(ScopeType.SESSION) public class ReportAction { @Logger private Log log; @In StatusMessages statusMessages; @DataModel private List<String> l; public void create() { try { ServletContext servletContext = (ServletContext)FacesContext.getCurrentInstance().getExternalContext().getContext(); System.out.println(servletContext.getRealPath("/WEB-INF/reports/ReportTest.jasper").replace("./", "")); HashMap parameters = new HashMap(); JasperPrint jasperPrint = JasperFillManager.fillReport(servletContext.getRealPath("/WEB-INF/reports/ReportTest.jasper").replace("./", ""), parameters, new JREmptyDataSource()); ByteArrayOutputStream output = new ByteArrayOutputStream(); JasperExportManager.exportReportToPdfStream(jasperPrint, output); HttpServletResponse response = (HttpServletResponse) FacesContext.getCurrentInstance().getExternalContext().getResponse(); response.setContentType("application/pdf"); response.addHeader("Content-Disposition","attachment;filename=RankReport.pdf"); response.setContentLength(output.size()/*bytes.length*/); ServletOutputStream servletOutputStream = response.getOutputStream(); servletOutputStream.write(output.toByteArray(), 0, output.size()/*bytes, 0, bytes.length*/); servletOutputStream.flush(); servletOutputStream.close(); FacesContext.getCurrentInstance().responseComplete(); } catch (Exception jre) { jre.printStackTrace(); } } }
but the fillReport command returns an exception
net.sf.jasperreports.engine.JRException: Error loading object from file : /home/cleitonash/java/jboss-4.2.3.GA/server/default/tmp/deploy/tmp1866210135615017893jboss-seam-itext.ear-contents/jboss-seam-itext-exp.war/WEB-INF/reports/ReportTest.jasper
the structure of my .ear file is:
-lib
-META-INF
jboss-seam.jar
jboss-seam-itext.jar
jboss-seam-itext.war
pdf.keystore
into the lib package, I put the jasperreports-3.6.0.jar, it already had the commons jars and itext.jar.
I put ReportTest.jasper into the .war file, in the reports package that is into the WEB-INF.
anyone know where I'm wrong ? Is something missing ? I don't know where I can't access the file.
Thanks.