2012-05-15 165 views
0
 
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); 

这作品时,简单的报告 不是子报表的工作...碧玉子报告错误

+0

您可以查看[此文章](http://stackoverflow.com/questions/4825726/how-to-load-subreport-resources-with-jasper),[this one](http://stackoverflow.com/questions/9785451/generate-jasper-report-with-subreport-from-java)and [this one](http://stackoverflow.com/questions/3702565/how-to-pass-jasper-file-path-to -subreport-的-报表) –

回答

1

我Jarper知识是情侣的版本老了,但让我们希望这是有帮助的。

这是因为碧玉没有找到你的子报告。 Jasper可以编译你的报告,但是当你拨打compileReport时,它不会编译引用的子报告。填写报告时引用的子报表没有找到,因为它们在工作目录中不可用。

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

有几种方法解决这个。一种方法是确保路径正确并在应用程序部署之前预编译报告。链接亚历克斯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()提供合适的对象。如果直接提供ReportSource作为参数,它当然可以是$P{reportSource}.getReport("....")。 (我们使用ReportModel-approach;简而言之,它是适用于报告上下文的表示模型)。