com.hughes.exception.HughesException
at com.hughes.service.serviceImpl.HomeServiceImpl.sendTicketEmail(HomeServiceImpl.java:1094)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
.......................................................
..........................................
Caused by: net.sf.jasperreports.engine.JRException: Resource not found at : nullinvoiceDetail.jasper
at net.sf.jasperreports.repo.RepositoryUtil.getResource(RepositoryUtil.java:155)
at net.sf.jasperreports.repo.RepositoryUtil.getReport(RepositoryUtil.java:126)
at net.sf.jasperreports.engine.fill.JRFillSubreport.evaluateReport(JRFillSubreport.java:317)
at net.sf.jasperreports.engine.fill.JRFillSubreport.evaluateSubreport(JRFillSubreport.java:347)
at net.sf.jasperreports.engine.fill.JRFillSubreport.evaluate(JRFillSubreport.java:275)
at net.sf.jasperreports.engine.fill.JRFillElementContainer.evaluate(JRFillElementContainer.java:257)
at net.sf.jasperreports.engine.fill.JRFillBand.evaluate(JRFillBand.java:473)
at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillColumnBand(JRVerticalFiller.java:2021)
at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillDetail(JRVerticalFiller.java:755)
at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillReportStart(JRVerticalFiller.java:265)
at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillReport(JRVerticalFiller.java:128)
at net.sf.jasperreports.engine.fill.JRBaseFiller.fill(JRBaseFiller.java:836)
at net.sf.jasperreports.engine.fill.JRBaseFiller.fill(JRBaseFiller.java:765)
at net.sf.jasperreports.engine.fill.JRFiller.fillReport(JRFiller.java:84)
at net.sf.jasperreports.engine.JasperFillManager.fillReport(JasperFillManager.java:624)
at com.hughes.service.serviceImpl.HomeServiceImpl.sendTicketEmail(HomeServiceImpl.java:1046)
... 81 more
JasperReport jasperReport = JasperCompileManager.compileReport(hdnWebInfPath+seperator+"reports"+seperator+"invoice.jrxml");
JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, model, new JREmptyDataSource());
JasperExportManager.exportReportToPdfFile(jasperPrint, fPath+seperator+fileName);
此工程时,简单的报告子报表不工作...
我Jarper知识是情侣的版本老了,但让我们希望这是有帮助的。
这是因为碧玉没有找到你的报表。 碧玉可以编译您的报告,但是当你把它不会编译引用子报表compileReport
。 在填充报表中引用子报表都没有找到,因为它们不是在工作目录中。
(编译报告每次请求的时间是怎样的一个坏主意(除非你有一些非常重的理由这样做)。)
有几种方法解决这个。 其中之一是确保该路径是正确的,之前预编译的应用程序部署的报告。 链接亚历ķ提供的是用于此的极好来源。 如果应用程序编译需要然后使用下面的解决方案是可能的:
在Web应用程序中,我发现,工作实践是处理汇编并填写您的报告是手动管理。 下面是辅助类我写的。 希望它是有用的(它使用弹簧,但这些部件是容易替换的)。
public class ReportSource {
// Key = document name, Value = path to .jrxml
private Map<String, String> reports;
private final Map<String, JasperReport> compiled;
private final boolean lazy;
private final Logger log = Logger.getLogger(ReportSource.class);
public ReportSource(final boolean lazyBuild) {
super();
lazy = lazyBuild;
compiled = new HashMap<String, JasperReport>();
}
public void setCompileTargets(final Map<String, String> targets) {
reports = new HashMap<String, String>(targets);
if (!lazy) {
for (final String key : targets.keySet()) {
compile(key);
}
}
}
public JasperReport getReport(final String reportName) {
if (compiled.get(reportName) == null) { // not found or not compiled
log.info("Lazily compiling: " + reportName);
return compile(reportName);
}
return compiled.get(reportName);
}
private JasperReport compile(final String reportName) {
final String path = reports.get(reportName);
InputStream fis = null;
JasperReport report = null;
try {
final FileSystemResourceLoader resourceLoader = new FileSystemResourceLoader();
fis = resourceLoader.getResource(path).getInputStream();
log.info("Compiling report: " + reportName + " (" + path + ")");
report = JasperCompileManager.compileReport(fis);
} catch (final IOException ioe) {
throw new IllegalStateException("Configuration error file: " + path + " (for key: " + reportName +") not found.", ioe);
} catch (final JRException jre) {
throw new IllegalStateException("Configuration error file: " + path + " (for key: " + reportName +") not found.", jre);
}
compiled.put(reportName, report);
return report;
}
}
有了这个类,你可以参考在这样的文档子报表的帮助:
<subreport>
<reportElement x="0" y="0" width="200" height="30"/>
<subreportParameter name="data">
<subreportParameterExpression><![CDATA[$P{data}]]></subreportParameterExpression>
</subreportParameter>
<subreportParameter name="REPORT_RESOURCE_BUNDLE">
<subreportParameterExpression><![CDATA[$P{REPORT_RESOURCE_BUNDLE}]]></subreportParameterExpression>
</subreportParameter>
<dataSourceExpression><![CDATA[new net.sf.jasperreports.engine.JREmptyDataSource()]]></dataSourceExpression>
<subreportExpression class="net.sf.jasperreports.engine.JasperReport"><![CDATA[$P{data}.getSubreport("name_of_your_subreport")]]></subreportExpression>
</subreport>
这里$P{data}
是作为文件参数中提供合适的物体,其中getSubreport()
结束调用ReportSource.getReport()
当然,这可能是$P{reportSource}.getReport("....")
如果ReportSource
作为参数直接提供。 (我们使用ReportModel的方法;总之它是安装在报告的背景下呈现模型)。