Modulare Bibliothek für JasperReports: Vereinfachung von Unterberichten und Daten
Die Arbeit mit großen Berichten in JasperReports führt oft zu monolithischen JRXML-Dateien. Design, Datenlogik und Geschäftsregeln vermischen sich, was die Wartung erschwert. Unterberichte adressieren Modularität, aber die Datenübergabe an sie führt zu Komplexitäten.
Typische Datenansätze:
- Einzelnes JSON: JsonDataSource mit Pfaden in XML. Pfadfehler werden nicht zur Kompilierzeit erkannt, und REPORT_DATA_SOURCE wird implizit übergeben.
- SQL in Vorlagen: REPORT_CONNECTION für Abfragen. Die Logik liegt außerhalb von Java, ohne Typprüfungen.
- Übergabe von REPORT_DATA_SOURCE: Verbrauchbare Datenquellen sind nach dem ersten Unterbericht erschöpft.
- Manuelle Parameter: Dutzende von <subreportParameter> und params.put() in Java, die Synchronisierung erfordern.
Das jasper-modular-Prinzip
Die Bibliothek übergibt zwei Parameter in jeden Unterbericht:
<prefix>Report— der kompilierte JasperReport.<prefix>MapParameter— eine Map<String, Object> mit Daten.
Die Map wird über REPORT_PARAMETERS_MAP entpackt: Schlüssel werden zu $P{key} ohne <subreportParameter>. Ein Annotation-Prozessor generiert Parameter und JRXML während der Kompilierung. Der Renderer füllt Unterberichte rekursiv mithilfe von Reflection.
Abhängigkeiten hinzufügen
Für JasperReports 7.x:
<dependency>
<groupId>io.github.hhdevr</groupId>
<artifactId>jasper-modular-starter-jr7</artifactId>
<version>1.0.0</version>
</dependency>
Für 6.x:
<dependency>
<groupId>io.github.hhdevr</groupId>
<artifactId>jasper-modular-starter-jr6</artifactId>
<version>1.0.0</version>
</dependency>
Annotation-Prozessor in 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>
Berichtsklassenstruktur
Hauptbericht:
@Getter
@Setter
@JasperModularReport(templatePath = "/reports/company_report.jrxml")
public class CompanyReport extends ModularReport {
private TitleSubModule titleSubModule;
private FinancialSubModule financialSubModule;
}
Unterbericht:
@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;
}
}
Verschachtelung: FinancialSubModule enthält RevenueSubModule, ExpenseSubModule, ProfitSubModule. Jedes Modul prüft isEmpty() für bedingtes Rendering.
Sammlungen:
@JasperCollection(columnWidth = 150)
private List<RevenueItem> items;
Felder ausschließen:
@JasperIgnore
private transient String internalCache;
JRXML-Generierungsmodi
Der Annotation-Prozessor aktualisiert Vorlagen in target/generated-sources/:
- CREATE: Generiert eine vollständige JRXML mit Parametern, Datasets, Sammlungskomponenten und Unterberichtsbändern.
- INJECT (Standard): Fügt fehlende Elemente hinzu, während das bestehende Design erhalten bleibt.
- NONE: Keine Änderungen.
Nach der Generierung können Vorlagen in Jaspersoft Studio verfeinert werden.
Beispielprojektstruktur:
- CompanyReport
- TitleSubModule (CompanyDetails, Periode, Währung)
- FinancialSubModule
- RevenueSubModule (Gesamtumsatz, Wachstumsprozent, List<RevenueItem>)
- ExpenseSubModule (Gesamtausgaben, Wachstumsprozent, List<ExpenseItem>)
- ProfitSubModule (Bruttogewinn, Betriebsgewinn, Nettogewinn, Marge, List<ProfitBreakdown>)
Wichtige Erkenntnisse
- Modularität über Java-Klassen: Unterberichte als Felder mit typisierten Daten.
- Automatische Parameter- und JRXML-Generierung durch den Annotation-Prozessor.
- Rekursives Rendering ohne manuelle Datenübergabe.
- Unterstützung für Sammlungen mit @JasperCollection und unbegrenzte Verschachtelungstiefe.
- Kompatibilität mit JasperReports 6.x/7.x und Spring Boot 3.x/4.x.
— Editorial Team
Noch keine Kommentare.