0
com.hughes.exception.HughesException
    com.hughes.service.serviceImpl.HomeServiceImpl.sendTicketEmail (HomeServiceImpl.java:1094) で
    sun.reflect.NativeMethodAccessorImpl.invoke0(ネイティブメソッド)

................................................................... .....
...................................................

原因: 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 はレポートをコンパイルできますが、 を呼び出したときに参照されたサブレポートをコンパイルしません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("....")場合もあります。ReportSource(ReportModel アプローチを使用します。要するに、レポートのコンテキストに適合したプレゼンテーション モデルです)。

于 2012-05-15T11:45:04.890 に答える