我在加载.war文件中的 .jasper subReport 时遇到问题。
这个想法是加载在“ parte1”文件夹内的一个子报表。
在documentation中,您不能传递相对路径来加载subReport文件...
您不能使用相对路径来定位子报表文件。也就是说,如果您在c:\ myreport \ main_report.jasper中有一个报表,则不能使用.. \ mysubreports \ mysubreport.jasper这样的表达式来引用子报表。
这是因为JasperReports不会将正在使用的Jasper文件的原始位置保存在内存中。考虑到不一定要从物理文件中加载Jasper对象,这很合理。
所以我试图将完整路径传递给.jasper文件。
1.-我使用@Autowired获取上下文,然后以字符串形式完成路径...
parameters.put("SUBREPORT_DIR", contextPath + "WEB-INF" + File.separator + "report" + File.separator + "parte1" + File.separator);
2.-将路径作为参数传递给jasperReport
printFileName = JasperFillManager.fillReportToFile(getPath(sourceFileName), parameters, new JRBeanCollectionDataSource(lstDataSource));
3.-给出加载subReport文件的路径
<subreport>
<reportElement x="50" y="50" width="200" height="200" uuid="ced7076b-b6ba-4973-8e4c-cd289bd77c4e"/>
<dataSourceExpression><![CDATA[new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($F{motivoReclamo})]]></dataSourceExpression>
<subreportExpression><![CDATA[$P{SUBREPORT_DIR} + "ClsMotivoReclamoReportBean.jasper"]]></subreportExpression>
</subreport>
但是,当尝试运行它时。它显示此错误消息...
2019-01-15 05:29:19 [http-nio-8081-exec-2]错误xxx.xxx.xx.report.PDFGenerator-net.sf.jasperreports.engine.JRException:在以下位置找不到资源: C:\ Program Files \ Apache Software Foundation \ Tomcat 8.5 \ webapps \ xxxxxxxxx \ WEB-INF \ report \ parte1 \ ClsMotivoReclamoReportBean.jasper。
谢谢。
更新
我正在使用Spring Boot并生成一个.war文件
我正在使用此Maven插件来编译报告并生成.jasper文件。
https://github.com/alexnederlof/Jasper-report-maven-plugin
然后我使用这个Maven插件复制报告中所需的一些图像...
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<executions>
<execution>
<id>copy-resources</id>
<phase>process-sources</phase>
<goals>
<goal>copy-resources</goal>
</goals>
<configuration>
<outputDirectory>${project.build.directory}/generated-sources/report</outputDirectory>
<resources>
<resource>
<directory>${project.basedir}/src/main/jasperfiles</directory>
<filtering>true</filtering>
<excludes>
<exclude>**/*.jrxml</exclude>
</excludes>
</resource>
</resources>
</configuration>
</execution>
</executions>
</plugin>
然后我使用这个maven插件将jasper文件复制到.war
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<configuration>
<webResources>
<resource>
<directory>${project.build.directory}/generated-sources/report</directory>
<targetPath>WEB-INF/classes/report</targetPath>
</resource>
</webResources>
</configuration>
</plugin>
答案 0 :(得分:0)
您也可以将子报表定义为InputStream:
在您的JRXML中:
<parameter name="MY_SUB_REPORT" class="java.io.InputStream" isForPrompting="false"/>
...
</subreport>
...
<subreportExpression><![CDATA[$P{MY_SUB_REPORT}]]></subreportExpression>
</subreport>
在您的Java类中:
parameters.put("MY_SUB_REPORT", new ByteArrayInputStream(Files.readAllBytes(path)));