Ошибка при загрузке скомпилированного файла Jasper внутри .war-файла - PullRequest
0 голосов
/ 15 января 2019

У меня возникла проблема при попытке загрузить .jasper subReport , который находится внутри файла .war.
Идея состоит в том, чтобы загрузить подотчет, который находится внутри папки "parte1".

my .war file

В документации сказано, что вы не можете передать относительный путь для загрузки файла подотчета ...

Вы не можете использовать относительный путь для поиска файла подотчета; то есть, если у вас есть отчет в 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

UPDATE

Я использую 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 для копирования файлов яшмы в .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 голосов
/ 15 января 2019

Вы также можете определить подотчет как 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)));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...