Volver al inicio

Biblioteca modular jasper-modular para JasperReports

La biblioteca jasper-modular simplifica el trabajo con subinformes en JasperReports mediante clases Java tipadas y anotaciones. La generación automática de JRXML y parámetros elimina la perforación manual de datos. Soporta anidamiento y colecciones para informes complejos.

jasper-modular: informes modulares en JasperReports sin complicaciones
Advertisement 728x90

Biblioteca Modular para JasperReports: Simplificando Subinformes y Datos

Trabajar con informes grandes en JasperReports a menudo conduce a archivos JRXML monolíticos. El diseño, la lógica de datos y las reglas de negocio se mezclan, dificultando el mantenimiento. Los subinformes abordan la modularidad, pero pasar datos a ellos introduce complejidades.

Enfoques típicos de datos:

  • JSON único: JsonDataSource con rutas en XML. Los errores de ruta no se detectan en tiempo de compilación, y REPORT_DATA_SOURCE se pasa implícitamente.
  • SQL en plantillas: REPORT_CONNECTION para consultas. La lógica reside fuera de Java, sin verificaciones de tipo.
  • Pasar REPORT_DATA_SOURCE: Las fuentes de datos consumibles se agotan después del primer subinforme.
  • Parámetros manuales: Docenas de <subreportParameter> y params.put() en Java, requiriendo sincronización.

El principio de jasper-modular

La biblioteca pasa dos parámetros a cada subinforme:

Google AdInline article slot
  • <prefix>Report — el JasperReport compilado.
  • <prefix>MapParameter — un Map<String, Object> que contiene datos.

El mapa se desempaqueta mediante REPORT_PARAMETERS_MAP: las claves se convierten en $P{key} sin <subreportParameter>. Un procesador de anotaciones genera parámetros y JRXML durante la compilación. El renderizador llena recursivamente los subinformes usando reflexión.

Agregar dependencias

Para JasperReports 7.x:

<dependency>
    <groupId>io.github.hhdevr</groupId>
    <artifactId>jasper-modular-starter-jr7</artifactId>
    <version>1.0.0</version>
</dependency>

Para 6.x:

Google AdInline article slot
<dependency>
    <groupId>io.github.hhdevr</groupId>
    <artifactId>jasper-modular-starter-jr6</artifactId>
    <version>1.0.0</version>
</dependency>

Procesador de anotaciones en 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>

Estructura de clases de informe

Informe raíz:

@Getter
@Setter
@JasperModularReport(templatePath = "/reports/company_report.jrxml")
public class CompanyReport extends ModularReport {
    private TitleSubModule titleSubModule;
    private FinancialSubModule financialSubModule;
}

Subinforme:

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

Anidación: FinancialSubModule contiene RevenueSubModule, ExpenseSubModule, ProfitSubModule. Cada módulo verifica isEmpty() para renderizado condicional.

Colecciones:

@JasperCollection(columnWidth = 150)
private List<RevenueItem> items;

Excluir campos:

@JasperIgnore
private transient String internalCache;

Modos de generación de JRXML

El procesador de anotaciones actualiza plantillas en target/generated-sources/:

  • CREATE: Genera un JRXML completo con parámetros, conjuntos de datos, componentes de colección y bandas de subinformes.
  • INJECT (predeterminado): Agrega elementos faltantes preservando el diseño existente.
  • NONE: Sin cambios.

Después de la generación, las plantillas se pueden refinar en Jaspersoft Studio.

Ejemplo de árbol de proyecto:

  • CompanyReport

- TitleSubModule (CompanyDetails, period, currency)

- FinancialSubModule

- RevenueSubModule (totalRevenue, growthPercent, List<RevenueItem>)

- ExpenseSubModule (totalExpenses, growthPercent, List<ExpenseItem>)

- ProfitSubModule (grossProfit, operatingProfit, netProfit, margin, List<ProfitBreakdown>)

Conclusiones clave

  • Modularidad mediante clases Java: subinformes como campos, con datos tipados.
  • Generación automática de parámetros y JRXML por el procesador de anotaciones.
  • Renderizado recursivo sin paso manual de datos.
  • Soporte para colecciones con @JasperCollection y profundidad de anidación ilimitada.
  • Compatibilidad con JasperReports 6.x/7.x y Spring Boot 3.x/4.x.

— Editorial Team

Advertisement 728x90

Leer después