Zpět na domů

Modulární knihovna jasper-modular pro JasperReports

Knihovna jasper-modular zjednodušuje práci se subreporty v JasperReports prostřednictvím typizovaných Java tříd a anotací. Automatická generace JRXML a parametrů eliminuje ruční propojování dat. Podporuje vnořenost a kolekce pro složité reporty.

jasper-modular: modulární reporty v JasperReports bez bolesti
Advertisement 728x90

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:

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

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

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;
    }
}

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

Advertisement 728x90

Číst dál