2012-05-15 3 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); 

это работает, когда простой отчет не работает для докладов суба ...Jasper юг сообщить об ошибке

+0

Вы можете просмотреть [этот пост] (http://stackoverflow.com/questions/4825726/how-to-load-subreport-resources-with-jasper), [этот] (http://stackoverflow.com)/questions/9785451/generate-jasper-report-with-subreport-from-java) и [этот] (http://stackoverflow.com/questions/3702565/how-to-pass-jasper-file-path-to -subreport-оф-подотчетом) –

ответ

1

Моего Jarper знания пары версий старое, но позволяет надеяться, что это полезно.

Это потому, что яшма не находит ваш подзаголовок. Jasper может скомпилировать ваш отчет, но при вызове compileReport он не компилирует ссылочные вложенные записи. При заполнении отчета ссылки в подзаголовках не найдены, потому что они недоступны в рабочем каталоге.

(Составление отчета каждый раз, когда оно запрашивается, своего рода плохая идея (если у вас есть некоторые действительно тяжелые причины, чтобы сделать это).)

Есть несколько способов решения этой. Можно было бы убедиться, что пути правильные и предварительно скомпилировать отчеты перед развертыванием приложения. Ссылки, предоставленные Alex K, являются отличным источником для этого. Если в компиляции приложения требуется, то можно использовать нижеприведенное решение:

В веб-приложении я обнаружил, что практическая практика заключается в обработке компиляции и заполнении ваших отчетов, это управление ею вручную. Вот класс помощников, который я написал. Надеюсь, что это полезно (он использует весну, но эти части легко заменяемы).

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, вкратце - модель представления, соответствующая контексту отчетов).

Смежные вопросы