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:
<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:
<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:
@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
Aún no hay comentarios.