0
com.hughes.exception.HughesException
    在 com.hughes.service.serviceImpl.HomeServiceImpl.sendTicketEmail(HomeServiceImpl.java:1094)
    在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

..................................................... ......
………………………………………………………………………………………………………………………………………………

引起:net.sf.jasperreports.engine.JRException:资源未找到:nullinvoiceDetail.jasper
    在 net.sf.jasperreports.repo.RepositoryUtil.getResource(RepositoryUtil.java:155)
    在 net.sf.jasperreports.repo.RepositoryUtil.getReport(RepositoryUtil.java:126)
    在 net.sf.jasperreports.engine.fill.JRFillSubreport.evaluateReport(JRFillSubreport.java:317)
    在 net.sf.jasperreports.engine.fill.JRFillSubreport.evaluateSubreport(JRFillSubreport.java:347)
    在 net.sf.jasperreports.engine.fill.JRFillSubreport.evaluate(JRFillSubreport.java:275)
    在 net.sf.jasperreports.engine.fill.JRFillElementContainer.evaluate(JRFillElementContainer.java:257)
    在 net.sf.jasperreports.engine.fill.JRFillBand.evaluate(JRFillBand.java:473)
    在 net.sf.jasperreports.engine.fill.JRVerticalFiller.fillColumnBand(JRVerticalFiller.java:2021)
    在 net.sf.jasperreports.engine.fill.JRVerticalFiller.fillDetail(JRVerticalFiller.java:755)
    在 net.sf.jasperreports.engine.fill.JRVerticalFiller.fillReportStart(JRVerticalFiller.java:265)
    在 net.sf.jasperreports.engine.fill.JRVerticalFiller.fillReport(JRVerticalFiller.java:128)
    在 net.sf.jasperreports.engine.fill.JRBaseFiller.fill(JRBaseFiller.java:836)
    在 net.sf.jasperreports.engine.fill.JRBaseFiller.fill(JRBaseFiller.java:765)
    在 net.sf.jasperreports.engine.fill.JRFiller.fillReport(JRFiller.java:84)
    在 net.sf.jasperreports.engine.JasperFillManager.fillReport(JasperFillManager.java:624)
    在 com.hughes.service.serviceImpl.HomeServiceImpl.sendTicketEmail(HomeServiceImpl.java:1046)
    ... 81 更多
JasperReport jasperReport = JasperCompileManager.compileReport(hdnWebInfPath+seperator+"reports"+seperator+"invoice.jrxml");
                        JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, model, new JREmptyDataSource());
                        JasperExportManager.exportReportToPdfFile(jasperPrint, fPath+seperator+fileName);

这在简单报告不适用于子报告时有效...

4

1 回答 1

1

我的 Jarper 知识是几个旧版本,但希望这会有所帮助。

这是因为 jasper 没有找到您的子报表。Jasper 可以编译您的报告,但是当您调用compileReport. 填写报告时找不到引用的子报告,因为它们在工作目录中不可用。

(每次请求时都编译报告是个坏主意(除非你有一些非常重要的理由这样做)。)

有几种方法可以解决这个问题。一种方法是确保路径正确并在应用程序部署之前预编译报告。Alex K 提供的链接是一个很好的来源。如果需要在应用程序中编译,则可以使用以下解决方案:

在 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("....")ifReportSource直接作为参数提供。(我们使用 ReportModel 方法;简而言之,它是适合报告上下文的演示模型)。

于 2012-05-15T11:45:04.890 回答