Reputation: 929
In my Tomcat webapp I have a Java file that is responsible for loading and compiling Jasper jrxml files.
JasperReport jasperReport = reportMap.get(reportName);
if (jasperReport == null) {
synchronized (reportMap) {
jasperReport = reportMap.get(reportName);
if (jasperReport == null) {
InputStream in;
if (reportName.contains("csv"))
in = getClass().getClassLoader().getResourceAsStream(
"report/" + reportName + "_CSV.jrxml");
else
in = getClass().getClassLoader().getResourceAsStream(
"report/" + reportName + ".jrxml");
JasperDesign design = JRXmlLoader.load(in);
jasperReport = JasperCompileManager.compileReport(design);
reportMap.put(reportName, jasperReport);
}
}
}
return jasperReport;
This has worked fine so far because the report templates I inherited don't have subreports, but the problem I'm facing now is that I'm developing a new report template, and its requirements necessitate the use of subreports.
These are the steps I've done so far:
Created subreport.jrxml
file in the same folder as all my other jrxml files - in this case, the report
folder (i.e report/subreport.jrxml
)
Added the following parameter for the subreport in mainreport.jrxml
:
<parameter name="SUBREPORT_DATA" class="java.util.List" isForPrompting="false">
<parameterDescription><![CDATA[Subreport Data]]></parameterDescription>
</parameter>
<subreport>
<reportElement x="20" y="150" width="410" height="60"/>
<dataSourceExpression><![CDATA[new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($P{SUBREPORT_DATA})]]></dataSourceExpression>
<subreportExpression><![CDATA["subreport.jasper"]]></subreportExpression>
</subreport>
To test whether the subreport is being displayed correctly, subreport.jrxml
is all string stubs for now.
When I test this in my webapp, I get the following exception:
Caused by: net.sf.jasperreports.engine.JRException: Resource not found at : subreport.jasper
at net.sf.jasperreports.repo.RepositoryUtil.getResource(RepositoryUtil.java:155) ~[oss-net-sf-jasperreports-4.1.3.jar:4.1.3]
at net.sf.jasperreports.repo.RepositoryUtil.getReport(RepositoryUtil.java:126) ~[oss-net-sf-jasperreports-4.1.3.jar:4.1.3]
at net.sf.jasperreports.engine.fill.JRFillSubreport.evaluateReport(JRFillSubreport.java:317) ~[oss-net-sf-jasperreports-4.1.3.jar:4.1.3]
at net.sf.jasperreports.engine.fill.JRFillSubreport.evaluateSubreport(JRFillSubreport.java:347) ~[oss-net-sf-jasperreports-4.1.3.jar:4.1.3]
at net.sf.jasperreports.engine.fill.JRFillSubreport.evaluate(JRFillSubreport.java:275) ~[oss-net-sf-jasperreports-4.1.3.jar:4.1.3]
at net.sf.jasperreports.engine.fill.JRFillElementContainer.evaluate(JRFillElementContainer.java:257) ~[oss-net-sf-jasperreports-4.1.3.jar:4.1.3]
at net.sf.jasperreports.engine.fill.JRFillBand.evaluate(JRFillBand.java:473) ~[oss-net-sf-jasperreports-4.1.3.jar:4.1.3]
at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillNoData(JRVerticalFiller.java:2192) ~[oss-net-sf-jasperreports-4.1.3.jar:4.1.3]
at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillReport(JRVerticalFiller.java:207) ~[oss-net-sf-jasperreports-4.1.3.jar:4.1.3]
at net.sf.jasperreports.engine.fill.JRBaseFiller.fill(JRBaseFiller.java:836) ~[oss-net-sf-jasperreports-4.1.3.jar:4.1.3]
at net.sf.jasperreports.engine.fill.JRBaseFiller.fill(JRBaseFiller.java:765) ~[oss-net-sf-jasperreports-4.1.3.jar:4.1.3]
at net.sf.jasperreports.engine.fill.JRFiller.fillReport(JRFiller.java:84) ~[oss-net-sf-jasperreports-4.1.3.jar:4.1.3]
at net.sf.jasperreports.engine.JasperFillManager.fillReport(JasperFillManager.java:624) ~[oss-net-sf-jasperreports-4.1.3.jar:4.1.3]
...
Obviously the subreport expression is wrong, but I don't know what I should change it to (report/subreport.jasper
didn't work either.) - I did a quick search of my file system and it seems like no jasper file is being generated?
Upvotes: 0
Views: 361
Reputation: 5093
If you know in advance the subreport that the main report is using, you can compile the subreport into a JasperReport object (using the same code as for the main report), pass the JasperReport object as a parameter and use the parameter in the subreport expression.
Something like this:
JasperReports subreport = compileReport("subreport.jrxml");
...
parameters.put("SUBREPORT", subreport);
In the report:
<parameter name="SUBREPORT" class="net.sf.jasperreports.engine.JasperReport" isForPrompting="false">
<parameterDescription><![CDATA[Subreport]]></parameterDescription>
</parameter>
...
<subreportExpression><![CDATA[$P{SUBREPORT}]]></subreportExpression>
Upvotes: 0