在.war文件

时间:2019-01-15 10:49:31

标签: java jasper-reports war

我在加载.war文件中的 .jasper subReport 时遇到问题。
这个想法是加载在“ parte1”文件夹内的一个子报表。

my .war file

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。

谢谢。

enter image description here

更新

我正在使用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>

1 个答案:

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