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.