Modulární knihovna pro JasperReports: zjednodušení podreportů a dat
Práce s rozsáhlými reporty v JasperReports vede k monolitickým JRXML souborům. Design, datová logika a obchodní pravidla se míchají, což komplikuje údržbu. Podreporty řeší modularitu, ale předávání dat do nich způsobuje potíže.
Typické přístupy k datům:
- Jednotný JSON: JsonDataSource s cestami v XML. Chyby v cestách se neodhalí při kompilaci, REPORT_DATA_SOURCE se předává implicitně.
- SQL v šabloně: REPORT_CONNECTION pro dotazy. Logika mimo Java, bez kontroly typů.
- Předávání REPORT_DATA_SOURCE: Consumable-datasource se vyčerpá po prvním podreportu.
- Ruční parametry: Desítky <subreportParameter> a params.put() v Javě, vyžadující synchronizaci.
Princip jasper-modular
Knihovna předává do každého podreportu dva parametry:
<prefix>Report— zkompilovaný JasperReport.<prefix>MapParameter— Map<String, Object> s daty.
Mapa se rozbalí přes REPORT_PARAMETERS_MAP: klíče se stanou $P{key} bez <subreportParameter>. Anotační procesor generuje parametry a JRXML při kompilaci. Renderer rekurzivně vyplňuje podreporty přes reflexi.
Připojení závislostí
Pro JasperReports 7.x:
<dependency>
<groupId>io.github.hhdevr</groupId>
<artifactId>jasper-modular-starter-jr7</artifactId>
<version>1.0.0</version>
</dependency>
Pro 6.x:
<dependency>
<groupId>io.github.hhdevr</groupId>
<artifactId>jasper-modular-starter-jr6</artifactId>
<version>1.0.0</version>
</dependency>
Anotační procesor v maven-compiler-plugin:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<annotationProcessorPaths>
<path>
<groupId>io.github.hhdevr</groupId>
<artifactId>jasper-modular-processor-jr7</artifactId>
<version>1.0.0</version>
</path>
</annotationProcessorPaths>
</configuration>
</plugin>
Struktura tříd reportu
Kořenový report:
@Getter
@Setter
@JasperModularReport(templatePath = "/reports/company_report.jrxml")
public class CompanyReport extends ModularReport {
private TitleSubModule titleSubModule;
private FinancialSubModule financialSubModule;
}
Podreport:
@Getter
@Setter
@JasperSubreport(templatePath = "/reports/sub_title_report.jrxml", prefix = "Title")
public class TitleSubModule extends SubreportModule {
private CompanyDetails companyDetails;
private String period;
private String currency;
@Override
public boolean isEmpty() {
return companyDetails == null;
}
}
Vnoření: FinancialSubModule obsahuje RevenueSubModule, ExpenseSubModule, ProfitSubModule. Každý modul kontroluje isEmpty() pro podmíněný render.
Kolekce:
@JasperCollection(columnWidth = 150)
private List<RevenueItem> items;
Vynechání polí:
@JasperIgnore
private transient String internalCache;
Režimy generování JRXML
Anotační procesor aktualizuje šablony v target/generated-sources/:
- CREATE: Vytvoří úplný JRXML s parametry, datasety, komponentami kolekcí a band'ami podreportů.
- INJECT (výchozí): Přidá chybějící prvky, zachová existující design.
- NONE: Bez změn.
Po generaci se šablony upravují v Jaspersoft Studio.
Strom sample-projektu:
- CompanyReport
- TitleSubModule (CompanyDetails, period, currency)
- FinancialSubModule
- RevenueSubModule (totalRevenue, growthPercent, List<RevenueItem>)
- ExpenseSubModule (totalExpenses, growthPercent, List<ExpenseItem>)
- ProfitSubModule (grossProfit, operatingProfit, netProfit, margin, List<ProfitBreakdown>)
Co je důležité
- Modularita přes Java-třídy: podreporty jako pole, data typizovaná.
- Automatická generace parametrů a JRXML anotačním procesorem.
- Rekurzivní render bez ručního předávání dat.
- Podpora kolekcí s @JasperCollection a vnoření libovolné hloubky.
- Kompatibilita s JasperReports 6.x/7.x a Spring Boot 3.x/4.x.
— Editorial Team
Zatím žádné komentáře.