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); 

cela fonctionne quand simple rapport ne fonctionne pas pour les rapports sous ...Jasper sous erreur de rapport

+0

Vous pouvez afficher [cet article] (http://stackoverflow.com/questions/4825726/how-to-load-subreport-resources-with-jasper), [celui-ci] (http://stackoverflow.com/questions/9785451/generate-jasper-report-with-sub-report-from-java) et [celui-ci] (http://stackoverflow.com/questions/3702565/how-to-pass-jasper-file-path-to -sous-rapport de sous-rapport) –

Répondre

1

connaissances Mon Jarper est versions vieux couple, mais laisse espérer que cela est utile.

C'est parce que jasper ne trouve pas votre sous-état. Jasper peut compiler votre rapport, mais il ne compile pas les sous-rapports référencés lorsque vous appelez compileReport. Lors du remplissage du rapport, les sous-rapports référencés sont introuvables car ils ne sont pas disponibles dans le répertoire de travail.

(rapport chaque fois Compiler il est demandé est en quelque sorte une mauvaise idée (sauf si vous avez des raisons vraiment lourdes pour le faire).)

Il existe deux façons de résoudre ce. On devrait s'assurer que les chemins sont corrects et précompiler les rapports avant le déploiement de l'application. Liens fournis Alex K sont une excellente source pour cela. Si dans la compilation de l'application est nécessaire, l'utilisation de la solution ci-dessous est possible:

Dans l'application web, j'ai trouvé qu'une pratique de travail consiste à gérer la compilation et à remplir vos rapports pour la gérer manuellement. Voici la classe d'aide que j'ai écrite. Espérons que c'est utile (il utilise le printemps, mais ces parties sont facilement remplaçables).

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; 
    } 
} 

Avec l'aide de cette classe, vous pouvez consulter dans les documents subreports comme ceci:

<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> 

Ici $P{data} est objet approprié fourni en tant que paramètre de documents, où getSubreport() finit par appeler ReportSource.getReport(). Il pourrait bien sûr être $P{reportSource}.getReport("....") si ReportSource est fourni en paramètre directement. (Nous utilisons l'approche ReportModel, en bref c'est un modèle de présentation adapté au contexte des rapports).