Zurück zur Startseite

Modulare Bibliothek jasper-modular für JasperReports

jasper-modular Bibliothek vereinfacht die Arbeit mit Subreports in JasperReports durch typisierte Java-Klassen und Annotationen. Automatische JRXML- und Parameter-Generierung eliminiert manuelles Daten-Durchreichen. Unterstützt Verschachtelung und Sammlungen für komplexe Berichte.

jasper-modular: modulare Berichte in JasperReports ohne Aufwand
Advertisement 728x90

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:

Google AdInline article slot
  • <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:

Google AdInline article slot
<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:

Google AdInline article slot
@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

Advertisement 728x90

Weiterlesen