首页 > 解决方案 > Jasper 报告--java.lang.IllegalArgumentException: 名称

问题描述

我的要求:使用带有jasper报告模板(.jrxml文件)的restApi在客户端下载生成的pdf报告

我正在使用与 Spring Boot 集成的 jasper 报告创建报告。我需要为我创建其余的 api 打印 pdf 文件。代码看起来像

@PostMapping("/client-projects")
public void clientProject(@RequestParam String format,@RequestBody List<ProjectReportModel> project,HttpServletResponse response)  {
    
       report.clientProjectReport(format,response,project);
         
    }

服务类看起来像这样

 public void clientProjectReport(String format,List<ProjectReportModel> project,HttpServletResponseresponse){
    
    InputStream stream = this.getClass().getResourceAsStream("/clientProject.jrxml");
    JasperReport report = JasperCompileManager.compileReport(stream);
    JRBeanCollectionDataSource source = new JRBeanCollectionDataSource(project);
    JasperPrint print = JasperFillManager.fillReport(report, null, source);
    if(format.equals("pdf")){
        JasperExportManager.exportReportToPdfStream(print, response.getOutputStream());
         response.setContentType("application/pdf");
         response.addHeader("Content-Disposition", "inline; filename=jasper.pdf;");
    }

当我在本地运行代码时一切正常,但是当我在服务器(GCP)中部署代码时,我遇到了以下错误

java.lang.IllegalArgumentException: name
at java.base/jdk.internal.loader.URLClassPath$Loader.findResource(URLClassPath.java:600) ~[na:na]
at java.base/jdk.internal.loader.URLClassPath.findResource(URLClassPath.java:291) ~[na:na]
at java.base/java.net.URLClassLoader$2.run(URLClassLoader.java:655) ~[na:na]
at java.base/java.net.URLClassLoader$2.run(URLClassLoader.java:653) ~[na:na]
at java.base/java.security.AccessController.doPrivileged(Native Method) ~[na:na]
at java.base/java.net.URLClassLoader.findResource(URLClassLoader.java:652) ~[na:na]
at org.springframework.boot.loader.LaunchedURLClassLoader.findResource(LaunchedURLClassLoader.java:100) ~[app.jar:0.0.1-SNAPSHOT]
at java.base/java.lang.ClassLoader.getResource(ClassLoader.java:1401) ~[na:na]
at org.apache.catalina.loader.WebappClassLoaderBase.getResource(WebappClassLoaderBase.java:1048) ~[tomcat-embed-core-9.0.39.jar!/:9.0.39]
at net.sf.jasperreports.engine.util.JRResourcesUtil.findClassLoaderResource(JRResourcesUtil.java:457) ~[jasperreports-6.6.0.jar!/:6.6.0]
at net.sf.jasperreports.repo.DefaultRepositoryService.getInputStream(DefaultRepositoryService.java:131) ~[jasperreports-6.6.0.jar!/:6.6.0]
at net.sf.jasperreports.repo.InputStreamPersistenceService.load(InputStreamPersistenceService.java:51) ~[jasperreports-6.6.0.jar!/:6.6.0]
at net.sf.jasperreports.repo.DefaultRepositoryService.getResource(DefaultRepositoryService.java:196) ~[jasperreports-6.6.0.jar!/:6.6.0]
at net.sf.jasperreports.repo.RepositoryUtil.findInputStream(RepositoryUtil.java:195) ~[jasperreports-6.6.0.jar!/:6.6.0]
at net.sf.jasperreports.repo.RepositoryUtil.getBytesFromLocation(RepositoryUtil.java:211) ~[jasperreports-6.6.0.jar!/:6.6.0]
at net.sf.jasperreports.renderers.util.RendererUtil.getNonLazyRenderable(RendererUtil.java:179) ~[jasperreports-6.6.0.jar!/:6.6.0]
at net.sf.jasperreports.engine.fill.JRFillImage.evaluateImage(JRFillImage.java:564) ~[jasperreports-6.6.0.jar!/:6.6.0]
at net.sf.jasperreports.engine.fill.JRFillImage.evaluate(JRFillImage.java:489) ~[jasperreports-6.6.0.jar!/:6.6.0]
at net.sf.jasperreports.engine.fill.JRFillElementContainer.evaluate(JRFillElementContainer.java:383) ~[jasperreports-6.6.0.jar!/:6.6.0]
at net.sf.jasperreports.engine.fill.JRFillBand.evaluate(JRFillBand.java:548) ~[jasperreports-6.6.0.jar!/:6.6.0]
at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillTitle(JRVerticalFiller.java:323) ~[jasperreports-6.6.0.jar!/:6.6.0]
at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillReportStart(JRVerticalFiller.java:256) ~[jasperreports-6.6.0.jar!/:6.6.0]
at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillReport(JRVerticalFiller.java:110) ~[jasperreports-6.6.0.jar!/:6.6.0]
at net.sf.jasperreports.engine.fill.JRBaseFiller.fill(JRBaseFiller.java:615) ~[jasperreports-6.6.0.jar!/:6.6.0]
at net.sf.jasperreports.engine.fill.BaseReportFiller.fill(BaseReportFiller.java:432) ~[jasperreports-6.6.0.jar!/:6.6.0]
at net.sf.jasperreports.engine.fill.JRFiller.fill(JRFiller.java:162) ~[jasperreports-6.6.0.jar!/:6.6.0]
at net.sf.jasperreports.engine.fill.JRFiller.fill(JRFiller.java:145) ~[jasperreports-6.6.0.jar!/:6.6.0]
at net.sf.jasperreports.engine.JasperFillManager.fill(JasperFillManager.java:689) ~[jasperreports-6.6.0.jar!/:6.6.0]
at net.sf.jasperreports.engine.JasperFillManager.fillReport(JasperFillManager.java:1005) ~[jasperreports-6.6.0.jar!/:6.6.0]
at com.yenmin.proton.report.service.ReportService.clientProjectReport(ReportService.java:135) ~[classes!/:0.0.1-SNAPSHOT]
at com.yenmin.proton.report.controller.ReportController.clientProject(ReportController.java:42) ~[classes!/:0.0.1-SNAPSHOT]
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:na]
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
at java.base/java.lang.reflect.Method.invoke(Method.java:566) ~[na:na]
at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:197) ~[spring-web-5.3.1.jar!/:5.3.1]
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:141) ~[spring-web-5.3.1.jar!/:5.3.1]

它没有填写报告,出现错误不知道为什么会发生此错误,我们在 gcp 中部署代码时也在使用 docker。

如果我将文件创建为 tmp 文件,例如

  File pdfFile = File.createTempFile("jasper", ".pdf");
    
        try(FileOutputStream pos = new FileOutputStream(pdfFile))
        {
            final JasperReport report = loadTemplate();
            JRBeanCollectionDataSource source = new JRBeanCollectionDataSource(project);
            System.out.println("Fill report error");
            JasperReportsUtils.renderAsPdf(report, null, source, pos);
        
                       
        }
        catch (final Exception e)
        {
            LOG.error(e.getLocalizedMessage(), e);
            
        }
       return pdfFile;
        
  }
 private JasperReport loadTemplate() throws JRException {

 final InputStream reportInputStream = getClass().getResourceAsStream("/clientproject.jrxml");
 final JasperDesign jasperDesign = JRXmlLoader.load(reportInputStream);
 return JasperCompileManager.compileReport(jasperDesign);
        }

一切正常,但不知道文件保存在哪里。但文件路径看起来像“/tmp/client065346395.pdf”我不清楚如何从 tmp 文件夹中检索文件。

请让我知道如何解决此问题或提供一些有用的链接...在此先感谢

标签: javaspring-bootdockergoogle-cloud-platformjasper-reports

解决方案


推荐阅读