Blog

Eclipse BIRT in Spring-Webanwendungen

Silvester Van der Bijl

Aktualisiert Oktober 23, 2025
5 Minuten

Viele Anwendungen, die wir entwickelt haben, müssen Berichte erstellen, damit die Endbenutzer Ergebnisse, Fortschritte usw. überwachen können. In den meisten Fällen ist eine einfache Abfrage und ein Excel-Export mehr als ausreichend. In Fällen, in denen fortgeschrittenere Berichte erforderlich sind, sehen wir uns oft Projekte wie JasperReports an oder wenn das nicht ausreicht, vielleicht sogar Crystal Reports. Wie ich in diesem Blog zu erklären versuche, könnte es sich für Sie lohnen, einen Blick auf Eclipse BIRT zu werfen. Die Eclipse "Business Intelligence and Reporting Tools" sind eines der Eclipse-Projekte, die ich schon seit einiger Zeit verfolge. Die aktuelle Version enthält einen Berichtsdesigner, der auf unserer Lieblings-IDE basiert (auch als eigenständiger Download erhältlich) und mit dem nicht-technische Benutzer Berichte mit Diagrammen, Tabellen usw. erstellen können. Es enthält eine webbasierte Anwendung zur Anzeige von Berichten. Sie kann natürlich die Berichtsentwürfe ausführen, bietet aber auch Exportmöglichkeiten (mit AJAX-Spaltenauswahl) und eine Reihe anderer Funktionen. Einen ausführlicheren Überblick über die Funktionen von BIRT finden Sie auf der Website eclipse.org/birt/phoenix. Funktionen, die ich interessant fand:

  • Eigenständiger Designer (basierend auf der Eclipse IDE)
  • Unterstützung für verschiedene Datenquellen (einschließlich XML)
  • Verschiedene Ausgabeformate (mit ähnlichem Layout) Derzeit werden PDF und HTML unterstützt, aber es ist auch ein (experimenteller) XLS-Emitter verfügbar. Suchen Sie hier nach "tribix": https://qauck.blogspot.com

In den meisten Fällen möchten wir die Berichte direkt in unsere Anwendungen einbinden (um Sicherheit, Caching usw. bieten zu können). Da die meisten unserer Anwendungen mit dem Spring-Framework erstellt werden, wäre es praktisch, wenn wir BIRT verwenden könnten, indem wir ein paar Beans instanziieren. Wie sich herausstellt, können wir das, aber es hat mich einige Zeit gekostet, (manchmal) schlecht dokumentierten Quellcode zu lesen und viel zu googeln. Der Rest dieses Blogs beschreibt die Schritte, die ich unternommen habe, um BIRT in eine Spring-Beispiel-Webanwendung zu integrieren.

Installation der BIRT-Laufzeitumgebung Das BIRT-Projekt bietet einen Download nur der Komponenten, die zum Ausführen und Rendern von Berichten in JEE-Umgebungen benötigt werden, mit dem passenden Namen "BIRT Runtime". Für die Beispielanwendung habe ich die Version 2.1RC6 verwendet. Sie können sie von Eclipse.org herunterladen und nach ${eclipse.birt.home} extrahieren (diese Eigenschaft werden wir später verwenden). Beispielprojekt Ich habe ein Maven 1.x Beispielprojekt an diese Seite angehängt, das den gesamten Code und die notwendige Konfiguration enthält. Da die BIRT-Bibliotheken (noch) in keinem öffentlichen Repository verfügbar sind, müssen Sie die erforderlichen Bibliotheken aus der BIRT-Laufzeitumgebung (siehe ${eclipse.birt.home}/WebViewExample/WEB-INF/lib) kopieren und sie entsprechend der project.xml umbenennen. Starten von BIRT Bevor wir die BIRT-API zum Ausführen und Rendern von Berichten aufrufen können, muss die BIRT-Plattform selbst zunächst mit den entsprechenden Konfigurationsobjekten gestartet werden. Es hat sich als schwierig erwiesen, dies aus einem Spring-Anwendungskontext heraus nur mit den BIRT-Klassen zu tun, daher habe ich zwei Hilfsklassen erstellt: BirtConfiguration Neben den Gettern und Settern für Eigenschaften bietet diese Klasse die Methode getEngineConfig(), die eine Instanz von EngineConfig erzeugt, mit der Sie BIRT beim Start konfigurieren können. Die Eigenschaft "birtInstallation" allein reicht aus, um es zu starten und Berichte zu rendern, aber der HTML-Export verwendet file:// uri's, um auf die von Ihnen eingebundenen Bilder zu verweisen. Wir können dieses Problem lösen, indem wir BIRT anweisen, den HTMLServerImageHandler zu verwenden und die entsprechende Konfiguration festlegen (siehe BIRT Frühjahrskonfiguration). Außerdem können wir hier auch den Loglevel festlegen.

public EngineConfig getEngineConfig() {
if (engineConfig == null) {
if (log.isDebugEnabled()) {
log.debug("Creating new instance of EngineConfig");
}
engineConfig = new EngineConfig();
engineConfig.setEngineHome(birtRuntimeLocation);
engineConfig.setLogConfig(logLocation, logLevel);
HTMLEmitterConfig htmlConfig = new HTMLEmitterConfig();
htmlConfig.setActionHandler(new HTMLActionHandler());
// This allows images to be referenced by url
htmlConfig.setImageHandler(new HTMLServerImageHandler());
engineConfig.getEmitterConfigs().put("html", htmlConfig);
}
return engineConfig;
}

BirtPlatformListener Diese Klasse verwendet die EngineConfig (wie sie von der Klasse BirtConfiguration erstellt wurde), um die Plattform zu starten und zu initialisieren, und ermöglicht die Erstellung einer IReportEngine, die wiederum zur Ausführung und Darstellung von Berichten verwendet werden kann.

[java]
public void start() {
try {
Platform.startup(engineConfig);
} catch (BirtException be) {
throw new IllegalArgumentException("Failure starting BIRT platform", be);
}
}
public void shutdown() {
if (reportEngine != null) {
reportEngine.shutdown();
}
// Just call shutdown
Platform.shutdown();
}
public IReportEngine getReportEngine() {
if (reportEngine == null) {
IReportEngineFactory factory = (IReportEngineFactory)
Platform.createFactoryObject(IReportEngineFactory.EXTENSION_REPORT_ENGINE_FACTORY);
reportEngine = factory.createReportEngine(engineConfig);
}
return reportEngine;
}
[/java]

Bean-Definitionen Sobald wir diese beiden Klassen haben, müssen wir nur noch die Beans konfigurieren, damit wir BIRT verwenden können, wann immer wir es wollen. Der folgende Ausschnitt aus dem Spring-Kontext zeigt alle erforderlichen Definitionen, um die Plattform zusammen mit der Anwendung zu starten und zu stoppen und eine IReportEngine-Instanz zu erstellen. [xml]

[/xml] Hinzufügen einiger Controller Ich habe zwei Spring MVC-Controller für die Beispielanwendung erstellt. Der ReportImageController ist für den Empfang von Anfragen für die in den Berichten enthaltenen Bilder zuständig. Er versucht einfach, die Datei zu öffnen und schreibt den Inhalt zurück (und löscht die Dateien anschließend). Der ReportController ist für den Aufruf von BIRT und die Ausführung unseres Beispielberichts verantwortlich. Die Beispielanwendung enthält einen Berichtsentwurf, der den Slashdot RSS-Feed als Datenquelle verwendet. Der folgende Code zeigt, wie Sie diesen Bericht ausführen und darstellen können:

[java]protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response) throws Exception {
String format = RequestUtils.getStringParameter(request, "format", "html");
IReportRunnable runnable = reportEngine.openReportDesign(new ClassPathResource("BirtExample.rptdesign").getInputStream());
IRunAndRenderTask runAndRenderTask = reportEngine.createRunAndRenderTask(runnable);
// Although it's called HtmlRenderOption, it is used for all formats
HTMLRenderOption htmlRenderOption = new HTMLRenderOption();
htmlRenderOption.setOutputFormat(format);
htmlRenderOption.setOutputStream(response.getOutputStream());
runAndRenderTask.setAppContext(renderOptions);
runAndRenderTask.setRenderOption(htmlRenderOption);
runAndRenderTask.run();
return null;
}[/java]

Der Zugriff auf die Anwendung (standardmäßig xebia.com/blog:8080/springbirt/) sollte zu einer HTML-Seite führen, die ähnlich aussieht wie diese (wenn auch wahrscheinlich mit neuen Einträgen :-)):

Screenshot des Slashdot Birt-Berichts

Wenn Sie sich lieber die PDF-Version ansehen möchten, hängen Sie einfach ?format=pdf an die URL an. Sie sollten nun eine schöne PDF-Datei im gleichen Format wie die HTML-Version erhalten. Die Beispielanwendung ist einfach. Sie ermöglicht lediglich die Anzeige eines gesamten Berichts ohne jegliche Interaktion (was in den meisten Fällen ausreicht), aber sie könnte erweitert werden, um ähnliche Funktionen wie die Webanwendung von BIRT zu bieten... Fazit Obwohl BIRT immer noch einige Schwächen hat (z.B. der Designer, der die Formatierung meiner Diagramme durcheinander bringt), ist es eine leistungsstarke Plattform, die ich auf jeden Fall häufiger für Berichte verwenden werde.

Verfasst von

Silvester Van der Bijl

Contact

Let’s discuss how we can support your journey.