Вот моя проблема: у меня есть JasperReport (mainReport) с одним вложенным отчетом (subReport), который в то же время имеет один вложенный отчет (subSubReport ). Моя проблема возникает, когда я пытаюсь выполнить ее из своего веб-приложения. Эти отчеты извлекаются из базы данных Oracle, поэтому я передаю для них InputStream в качестве «пути».
Поскольку я тестировал «пути» как InputStream (полученный из той же базы данных), я знаю, что он работает, когда у меня есть простая иерархия mainReport -> subReport ... почему я почти уверен, что проблема заключается в том, как я передаю параметры в subSubReport.
Поскольку теперь, если я хочу передать какой-либо параметр (в качестве пути) в subReport, он должен быть определен в mainReport (также передается в mainReport strong> в качестве параметра), и его нужно было передать как параметр из mainReport в подотчет. По этой причине я переношу все параметры, даже те, которые необходимы для subSubReports, в mainReport (и я предполагаю, что это неправильный способ, поскольку я получение java.lang.OutOfMemoryError: GC overhead limit exceeded when executing
).
Я следую следующему формату, чтобы определить, куда должен идти каждый из моих параметров:
SUBREPORT_DIR для тех отчетов, которые хранятся в локальной папке.
SUBREPORTxLEVELy для тех отчетов, которые есть в базе данных.
Где:
x определяет номер подотчета в соответствии с его положением (полосой, в которой он находится) в основном отчете.
y определяет уровень, на котором необходим параметр (в данном случае subReport находится на уровне 1, а subSubReport - на уровне 2).
Например:
Имея такую иерархию, я кодирую ее следующим образом:
Проблемная иерархия
mainReport
------------> подотчет
-------------------------> subSubReport
Обратите внимание, что я определил SUBREPORT_DIR и SUBREPORTxLEVELy, потому что отчет можно найти либо в локальной папке, либо в базе данных, а в моем дизайне яшмы у меня есть это выражение для вложенных отчетов IF($P{SUBREPORT_DIR}==null,$P{SUBREPORTxLEVELy},$P{SUBREPORT_DIR})
.
Вот код, используемый в каждом отчете, и код Java для создания отчета.
mainReport
<subreport>
<reportElement key="" x="0" y="0" width="554" height="30" isRemoveLineWhenBlank="true" uuid="18ff5513-835d-4910-b39c-6d41252b4679"/>
<subreportParameter name="REPORT_CONNECTION">
<subreportParameterExpression><![CDATA[$P{REPORT_CONNECTION}]]></subreportParameterExpression>
</subreportParameter>
<subreportParameter name="REPORT_DATA_SOURCE">
<subreportParameterExpression><![CDATA[$P{REPORT_DATA_SOURCE}]]></subreportParameterExpression>
</subreportParameter>
<subreportParameter name="SUBREPORT_DIR">
<subreportParameterExpression><![CDATA[$P{SUBREPORT_DIR}]]></subreportParameterExpression>
</subreportParameter>
<subreportParameter name="SUBREPORT1LEVEL1">
<subreportParameterExpression><![CDATA[$P{SUBREPORT1LEVEL1}]]></subreportParameterExpression>
</subreportParameter>
<subreportParameter name="SUBREPORT1LEVEL2">
<subreportParameterExpression><![CDATA[$P{SUBREPORT1LEVEL2}]]></subreportParameterExpression>
</subreportParameter>
<connectionExpression><![CDATA[$P{REPORT_CONNECTION}]]></connectionExpression>
<subreportExpression><![CDATA[IF($P{SUBREPORT_DIR}==null,$P{SUBREPORT1LEVEL1},$P{SUBREPORT_DIR})]]></subreportExpression>
</subreport>
подотчет
<subreport>
<reportElement x="50" y="10" width="457" height="40" uuid="4528914e-bb9a-4300-8173-14be2ff2db85"/>
<subreportParameter name="REPORT_CONNECTION">
<subreportParameterExpression><![CDATA[$P{REPORT_CONNECTION}]]></subreportParameterExpression>
</subreportParameter>
<subreportParameter name="REPORT_DATA_SOURCE">
<subreportParameterExpression><![CDATA[$P{REPORT_DATA_SOURCE}]]></subreportParameterExpression>
</subreportParameter>
<subreportParameter name="SUBREPORT_DIR">
<subreportParameterExpression><![CDATA[$P{SUBREPORT_DIR}]]></subreportParameterExpression>
</subreportParameter>
<subreportParameter name="SUBREPORT1LEVEL2">
<subreportParameterExpression><![CDATA[$P{SUBREPORT1LEVEL2}]]></subreportParameterExpression>
</subreportParameter>
<connectionExpression><![CDATA[$P{REPORT_CONNECTION}]]></connectionExpression>
<subreportExpression><![CDATA[IF($P{SUBREPORT_DIR}==null,$P{SUBREPORT1LEVEL2},$P{SUBREPORT_DIR})]]></subreportExpression>
</subreport>
код Java
parameters.put("SUBREPORT1LEVEL1", inputStream1);
(для подотчета) parameters.put("SUBREPORT1LEVEL2", inputStream2);
(для подотчета)
Не счел необходимым опубликовать остальную часть кода Java, потому что я знаю, что он работает так, как должен.
Три отчета прекрасно компилируются в дизайнере (каждый отдельно), правильно генерируя файл .jasper.
Итак, мои вопросы были сказаны:
- Что я делаю неправильно?
- Как мне передать параметры для определения пути отчета для subSubReport?
- Нужно ли передавать параметр в mainReport, как я, когда у меня есть subReport?
В заключение я хочу иметь возможность назначать правильный InputStream каждому subReport / subSubReport. Какой из них является лучшим (и известным) способом сделать это?
Большое спасибо!
Вопрос задан по адресу: http://community.jaspersoft.com/questions/1042586/sub-subreport-execution-returns-javalangoutofmemoryerror-gc-overhead-limit