🏗️ Microsoft Fabric Datenarchitektur im SPL
Überblick
Das Ziel dieses Dokuments ist es, eine kurze Einführung in die Fabric-Datenarchitektur im SPL zu geben.
Fabric ist eine integrierte Datenverwaltungsplattform, die verschiedene Aufgaben wie Datenaufnahme, Speicherung, Transformation und Optimierung in einem einheitlichen System vereint. Sie hilft Unternehmen, Daten effizienter zu verwalten, zu analysieren und darauf zu reagieren, indem sie eine nahtlose Erfahrung über verschiedene Daten-Workloads und -Tools hinweg bietet.
Im SPL gilt Fabric als Single Source of Truth. Daten aus Fabric können in Power BI, Excel-Arbeitsmappen, Board, SQL Management Studio (SSMS), Azure Data Studio und anderen Drittanbieter-Tools genutzt werden, die eine Authentifizierung über Microsoft Entra unterstützen.
Fabric im SPL
Datenfluss in Fabric — Übersicht der wichtigsten Komponenten und Daten-Pipelines im SPL.
Basierend auf den bewährten Richtlinien von Microsoft verwenden wir eine Medaillon-Architektur zur Datenorganisation. Sie besteht aus drei Ebenen mit zunehmender Datenqualität:
flowchart LR
SRC[📂 Quellsysteme
Rimo · BMD · Board · H3A
SharePoint · ADLS] --> B[🥉 Bronze
Rohdaten]
B -->|Bereinigung
Validierung
Harmonisierung| S[🥈 Silver
Validierte Daten]
S -->|Anreicherung
Aggregation| G[🥇 Gold
Konsumierbare Daten]
G --> PBI[📊 Power BI
Berichte und Dashboards]
G --> EXT[🔗 Drittanbieter
Excel · Board · SSMS]
style B fill:#cd7f32,color:#fff
style S fill:#c0c0c0,color:#000
style G fill:#ffd700,color:#000
- Bronze-Schicht (Rohdaten): erfasst Rohdaten aus verschiedenen Quellen ohne Verarbeitung oder Transformation. Erste Ablagezone für alle Daten.
- Silber-Schicht (validierte Daten): Daten aus der Bronze-Schicht werden bereinigt, validiert und harmonisiert. Bietet einen verfeinerten Datensatz mit detaillierten Informationen für Analysen.
- Gold-Schicht (angereicherte Daten): enthält hochverarbeitete und angereicherte Daten, die bereit zur Nutzung sind.
Diese Architektur gewährleistet, dass die Datenqualität sich schrittweise verbessert, während die Daten jede Schicht durchlaufen — ideal für Datenbereitstellung und Berichterstellung.
Die Architektur von Fabric im SPL ist in sieben Schlüsselaufgaben organisiert. Eine ähnliche Aufgabenansicht findet sich auch im Fabric-Arbeitsbereich:
Aufgaben-Übersicht im Fabric-Arbeitsbereich.
Datenaufnahme
Zweck: verantwortlich für das Kopieren von Daten aus verschiedenen Quellen wie On-Premise-Systemen, SharePoint und ADLS.
Je nach Quelltyp variiert das Element, das für die Datenaufnahme verwendet wird. Zu den Elementen gehören Datenpipelines, Datenflüsse und Notebooks.
Datenaufnahme-Aufgabenflow im SPL Fabric.
Datenpipelines
Pipelines können basierend auf ihrem Verwendungszweck in zwei Kategorien eingeteilt werden — Ingestion-Pipelines und Ausführungs-Pipelines.
Ingestion-Pipelines
Wenn die Quellsysteme On-Premise-Server sind, werden Datenpipelines für die Datenaufnahme verwendet. Derzeit verwenden wir eine separate Pipeline für jeden einzelnen On-Premise-Server. So haben wir jeweils eine Pipeline für Rimo, BMD, Board und H3A. Details zu den einzelnen Pipelines und den kopierten Tabellen finden sich auf der DATA-CATALOGUE-Seite.
Ausführungs-Pipelines
Ausführungs-Pipelines werden genutzt, um Operationen auszulösen. In bestimmten Fällen müssen zusätzliche Operationen direkt nach dem Durchlauf einer Ingestion-Pipeline ausgeführt werden. Beispielsweise wird bei einer notwendigen Historisierung eine Notebook-Aktivität unmittelbar nach der Kopieraktivität in die Ingestion-Pipeline eingefügt. Die gesamte Pipeline wird dann über eine Ausführungs-Pipeline ausgeführt. Eine Ausführungs-Pipeline kann weitere Pipelines, Datenflüsse, gespeicherte Prozeduren und Notebooks als Aktionselemente enthalten.
Ausführungs-Pipelines bieten heute keine unmittelbaren Vorteile mehr. Sie waren in der Vergangenheit notwendig, als wir ein Data Warehouse als Datenspeicher verwendeten und gespeicherte Prozeduren für interne Datenübertragungen nutzten. Heute sind sie ein Überbleibsel der vorherigen Architektur und können nach entsprechender Diskussion schrittweise abgeschafft werden.
Dataflows
Wenn die Quelle eine Flat-Datei aus SharePoint ist, werden Datenflüsse als Tool für die Datenaufnahme verwendet. Gen2-Datenflüsse bieten das gleiche UI-Erlebnis wie Power Query in einem Power BI-Datenfluss, in Power BI Desktop und in Excel. Als Low-Code-Lösung haben sie Vorteile.
WarningDatenflüsse sind aus Sicht der Compute Unit (CU)-Nutzung ineffizient und verbrauchen erhebliche Ressourcen, selbst bei Dateien von wenigen hundert Megabyte. Daher raten wir von der Verwendung von Datenflüssen im Fabric-Prozessfluss aktiv ab.
Im Zuge dieses neuen Ansatzes wurden einige Datenflüsse, die zuvor für interne Datenübertragungen genutzt wurden, durch Notebooks ersetzt. Zudem erfolgt die Ingestion der Telefonica-Excel-Datei nun ausschließlich mit Notebooks unter Nutzung der Shortcut-Funktion von ADLS. Derzeit aktive Datenflüsse werden für die Aufnahme von Kelog-SharePoint-Dateien und H3A-SharePoint-Dateien genutzt.
Notebooks
Notebooks in Fabric funktionieren ähnlich wie Jupyter-Notebooks in der Cloud. Sie unterstützen Sprachen wie Python, SQL und Scala — Benutzer können Code schreiben, ausführen und ihre Arbeit dokumentieren. Notebooks sind äußerst effizient im CU-Verbrauch. Durch die Nutzung von Python-Bibliotheken wie Polars und PySpark konnten wir die Verarbeitung großer Tabellen auf weniger als eine Minute reduzieren.
Notebooks sind daher unser primäres Datentransformations-Tool in Fabric, wo immer möglich. SQL-gespeicherte Prozeduren, die zuvor Teil des Data Warehouses in Fabric waren, wurden durch PySpark oder SparkSQL ersetzt und mit Notebooks ausgeführt. Notebooks können eigenständig oder über eine Ausführungs-Pipeline geplant werden.
Spark-Notebooks
Diese verwenden die Apache Spark-Computing-Engine, die ideal für großskalige Datenverarbeitung und Analysen ist. PySpark und Spark SQL benötigen diesen Typ von Notebook für ihre Funktion. Spark-Notebooks können auch für Aufgaben genutzt werden, die benutzerdefinierte Python-Bibliotheken erfordern. Eine benutzerdefinierte Umgebung kann erstellt werden, in der alle zusätzlichen Bibliotheken installiert werden, um sie dann im Notebook zu verwenden.
Python-Notebooks
Diese nutzen die vCore-Verarbeitung von Microsoft und bieten eine vielseitige und interaktive Umgebung für Verarbeitung und Visualisierung. Die Spark-Engine benötigt in der Regel mehr CU und mehr Zeit für die Initialisierung. Daher verwenden wir, wenn die Aufgabe nicht die Spark-Engine erfordert, reine Python-Notebooks (auch Vanilla-Notebooks genannt) für die Verarbeitung.
Ein wesentlicher Nachteil dieses Notebook-Typs ist, dass keine benutzerdefinierte Umgebung genutzt werden kann. Zusätzliche Bibliotheken, die nicht von Microsoft bereitgestellt werden, müssen bei jedem Lauf installiert werden (mittels pip install). Nichtsdestotrotz setzen wir ein Vanilla-Notebook für die Umwandlung von Excel-Dateien in Delta-Tabellen ein.
BronzeStore
Zweck: dient als Zwischenspeicher, in dem Daten aus der Ingestion ohne Transformation gespeichert werden.
BronzeStore ist der generische Name für alle Elemente, die als Zwischenablage für Daten verwendet werden. Er umfasst Lakehouses, semantische Modelle und SQL-Endpunkte, die mit dem Lakehouse verbunden sind. Im Rahmen unserer ursprünglichen Architektur haben wir für jedes Quellsystem ein eigenes Lakehouse entwickelt. Daher gibt es individuelle Lakehouses für Rimo, BMD, Board, H3A, Telefonica-Dateien und Kelog-Dateien. Dies war damals erforderlich, da die Schemata von Lakehouses nicht nativ unterstützt wurden — was inzwischen nicht mehr der Fall ist.
Da es sich um einen Zwischenspeicher handelt, versuchen wir, die Daten aus dem Quellsystem so genau wie möglich abzubilden. Es werden keine Transformationen durchgeführt, außer Konvertierungen von Datentypen. In einigen Fällen mussten Spalten umbenannt werden, um nicht unterstützte Zeichen aus den Spaltennamen zu entfernen.
Übersicht über BronzeStore mit den Lakehouses pro Quellsystem.
Bronze to Silver
Zweck: nutzt Notebooks und Datenflüsse, um Daten von BronzeStore zu SilverStore zu transformieren, wobei Shortcuts für mehr Effizienz verwendet werden.
Gemäß der definierten Architektur ist der Übergang der Daten von Bronze zu Silber nicht zwingend erforderlich. Solange keine Transformation der Daten notwendig ist, werden sie nicht in die Silber-Schicht verschoben. Falls eine Transformation erforderlich ist, besteht der erste Schritt darin, einen Shortcut von der Bronze-Schicht zum entsprechenden Schema im Silver-Lakehouse zu erstellen.
Die Elemente unter der Bronze-zu-Silber-Aufgabe führen die erste Stufe der Datentransformation durch. Zu den verwendeten Elementen gehören Datenpipelines, Datenflüsse, Notebooks und gespeicherte Prozeduren.
Mit der jüngsten Änderung der Architektur sind Datenflüsse, Datenpipelines und gespeicherte Prozeduren nicht mehr in Betrieb. Alle zuvor verwendeten gespeicherten Prozeduren wurden in PySpark und Spark SQL überführt und werden nun als Notebooks genutzt. Historisierungen, die zuvor über Datenpipelines durchgeführt wurden, sind nicht mehr im Einsatz und werden jetzt durch Notebooks ersetzt, die eine bessere CU-Nutzung und Leistung bieten.
Aufgabenfluss von Bronze zu Silver.
SilverStore
Zweck: enthält Lakehouses, die transformierte Daten speichern, organisiert in Schemata, die den Quellsystemen entsprechen.
SilverStore ist die Ebene, in der transformierte Daten gespeichert werden. Diese Daten werden entweder weiterverarbeitet oder als Quelle für weitere Transformationen genutzt. Die Ergebnisse der Bronze-zu-Silber-Aufgabe werden hier abgelegt.
Historisch wurden Datenflüsse, gespeicherte Prozeduren und Pipelines verwendet, um Daten von BronzeStore zu SilverStore zu bewegen. Im Einklang mit der neu definierten Architektur minimieren wir nun die Datenbewegung und -duplikation, indem wir nach Möglichkeit Shortcuts nutzen, um Daten aus BronzeStore zu verknüpfen.
Lakehouses in SilverStore:
- sharepointfiles_silver_lh — enthält Tabellen, die aus Flat-Dateien stammen, die in SharePoint und ADLS gespeichert sind. Dieses Lakehouse wurde vor der Einführung von Schemata in Lakehouses erstellt und enthält ein einziges Standardschema dbo. Da es inzwischen überflüssig ist, kann es nach weiterer Diskussion entfernt werden.
- spl_silver_lh — beinhaltet Tabellen aus On-Premise-Servern und Flat-Datei-Quellen mit separaten Schemata für jedes System.
Nicht jede Tabelle wird hierher kopiert, es sei denn, sie muss transformiert oder anders gespeichert werden als in ihrer ursprünglichen Form. In solchen Fällen kommt die Bronze-zu-Silber-Aufgabe zum Einsatz. Tabellen, die nach der Transformation erstellt werden, sind normalerweise entweder direkt für die Nutzung bereit oder werden für die nächste Stufe der Transformation verwendet.
Allgemein gesprochen werden Tabellen aus SilverStore nicht direkt in benutzerorientierten Anwendungen oder Berichten verwendet. Früher, als das Data Warehouse die primäre Single Source of Truth war, wurden Ansichten basierend auf den Tabellen aus SilverStore erstellt.
Übersicht über SilverStore.
GoldStore
Zweck: enthält ein einziges Lakehouse (spl_gold_lh), in dem die endgültigen, konsumierbaren Daten aus allen Lakehouses zur Verteilung und Nutzung in Power-BI-Berichten gespeichert werden.
spl_gold_lh ist als Single Source of Truth im Datenregime von SPL konzipiert. Die hier gehosteten Daten gelten als reinste Form, bereit für die Nutzung in Anwendungen und Berichten. Abhängig vom Quelltyp werden die Daten im Lakehouse in verschiedene Schemata unterteilt.
Derzeit wird das Lakehouse nicht mit Nutzern außerhalb der Power-BI-Admin-Gruppe geteilt. Die Daten aus diesem Lakehouse sind über SQL-Endpunkt-basierte Datenflüsse in Power BI verfügbar. In einigen Fällen werden Berichte direkt auf den Delta-Tabellen aufgebaut — sowohl im Direct-Lake-Modus als auch im Import-Modus über SQL-Endpunkte.
WarningBekannte Einschränkung — SQL-Endpunkt-Verzögerung: Es gibt eine Verzögerung von typischerweise bis zu 15 Minuten zwischen den Daten im Delta Lake und der Verfügbarkeit am SQL-Endpunkt. Daher sollte der Aktualisierungsplan immer mindestens 15 Minuten nach der Datenaufnahme in spl_gold_lh liegen.
Visualisierung
Zweck: stellt Daten aus Fabric-Elementen für Power BI und Drittanbieter-Anwendungen bereit.
Visualisierungs-Aufgabenflow: Daten aus Fabric zu Power BI und Drittanbieter-Tools.
Direct Lake
Was es ist: Der Direct-Lake-Modus ermöglicht Power BI, direkt auf Daten aus einem Fabric-Lakehouse zuzugreifen und Abfragen auszuführen, ohne die Daten in Power BI zu importieren. Dieser Modus nutzt die Leistung der In-Memory-Datenverarbeitung.
Wie es sich unterscheidet: Im Gegensatz zu anderen Methoden verbleiben die Daten im Lakehouse und werden in Echtzeit direkt abgefragt. So sind stets aktuelle Ergebnisse ohne Import oder periodische Aktualisierungen verfügbar.
Berechtigungen: Benutzer benötigen Lesezugriff auf das Fabric-Lakehouse, um die Daten in Berichten anzeigen zu können.
DirectQuery
Was es ist: Der DirectQuery-Modus ermöglicht Power BI, Daten direkt aus der zugrunde liegenden Datenquelle abzufragen — jedes Mal, wenn ein Bericht geladen oder mit ihm interagiert wird. Dies gewährleistet, dass die Daten stets aktuell sind.
Wie es sich unterscheidet: DirectQuery vermeidet ebenfalls den Datenimport, nutzt jedoch keine In-Memory-Verarbeitung. Stattdessen werden Daten auf Abruf abgefragt — das sichert Echtzeit-Updates, kann jedoch die Leistung beeinträchtigen.
Berechtigungen: Benutzer benötigen Lesezugriff auf den SQL-Endpunkt, um die Daten abzufragen und anzuzeigen.
Importmodus mit SQL-Endpunkt
Was es ist: Im Importmodus importiert Power BI Daten aus dem Fabric-Lakehouse in sein eigenes Datenmodell. Diese Daten können dann innerhalb von Power BI abgefragt und verarbeitet werden. Der SQL-Endpunkt wird genutzt, um die Daten in Power BI zu laden.
Wie es sich unterscheidet: Im Gegensatz zu den beiden anderen Methoden werden die Daten in den Power-BI-Speicher übernommen. Dies verbessert die Abfrageleistung (Daten sind lokal), erfordert jedoch regelmäßige Aktualisierungen, um die Daten aktuell zu halten.
Berechtigungen:
- Benutzer benötigen Lesezugriff auf den SQL-Endpunkt, um Daten in Power BI Desktop zu importieren.
- Für veröffentlichte Berichte kann jeder Benutzer mit mindestens einer Viewer-Rolle den Bericht anzeigen, ohne expliziten Zugriff auf den SQL-Endpunkt zu benötigen.
InformationUm die Nutzung von Compute Units (CU) zu begrenzen, verwenden wir derzeit den Importmodus mit SQL-Endpunkt als bevorzugte Methode zur Berichterstellung. Eine begrenzte Anzahl semantischer Modelle wird ebenfalls mit Direct Lake erstellt — diese sind jedoch hauptsächlich für Berichte vorgesehen, die nicht für eine breitere Verteilung bestimmt sind.
Optimize
Zweck: Optimierung und Bereinigung der Lakehouse-Tabellen in den Bronze-, Silber- und Gold-Schichten.
Da die Daten im Lakehouse im Delta-Format gespeichert werden, wird bei jeder Datenaufnahme eine neue Parquet-Datei im Lakehouse-Ordner erstellt. Im Laufe der Zeit kann die Größe dieser Dateien erheblich zunehmen, was zu höheren Speicherkosten führt.
Microsoft bietet eine Option zur Bereinigung redundanter Dateien mithilfe der Maintenance-Funktion. Durch die Verwendung der VACUUM-Option werden alle nicht verwendeten Dateien, die über einen bestimmten Zeitraum hinausgehen, aus dem Speicher entfernt.
Weitere Details dazu sind im Abschnitt „Good to know" zu finden.
Optimize hat keine festgelegte Position im Aufgabenfluss. Diese Schicht umfasst ausschließlich Notebooks.
Ordnerstruktur
Alle in Fabric erstellten Elemente werden in verschiedene Ordner zusammengefasst, wobei jeder Ordner eine spezifische Funktion hat. Unter jedem übergeordneten Ordner können sich Unterordner befinden. Nachfolgend sind die übergeordneten Ordner im Arbeitsbereich (Stand März 2025) aufgeführt:
- 00_Execution — alle Ausführungs-Pipelines
- 01_Dataingestion — alle Datenflüsse und Ingestion-Pipelines
- 02_Bronze — alle Bronze-Layer-Elemente
- 03_Silver — alle Silver-Layer-Elemente
- 04_Gold — alle Gold-Layer-Elemente
- 05_StoredProcedure_notebooks — alle Spark- und Python-Notebooks für interne Datenübertragungen zwischen Ebenen sowie für die Optimierungsschicht
- 06_PowerBI Report notebooks — alle Python- und Spark-Notebooks, die speziell für die Erstellung von Tabellen für Power-BI-Berichte verwendet werden
- 07_Power BI Reports und semantische Modelle — benutzerdefinierte semantische Modelle und paginierte Berichte, die aus Lakehouse-Daten (spl_gold_lh) erstellt wurden
- archived_items — alle Elemente, die nicht mehr in Betrieb sind, werden hier zu Referenzzwecken gespeichert
InformationMigrations-Hinweis: Diese Seite wurde am 24.05.2026 aus dem SharePoint WikiPowerBI ins Lumi-XWiki-Staging migriert.
Original-Autor: Bukkerji Sreejith (Consulter, Erstellung 2025-05-06)
Original-Quelle: Microsoft Fabric Datenarchitektur im SPL (SharePoint)
Migration: Dimitri Rupp via ClaudeAI
Bemerkungen zur Migration:
- 7 Bilder mit sprechenden Dateinamen übernommen (01-data-movement-in-fabric.png bis 07-visualisierung.png)
- Sprach-Glättung: Pseudo-Listen mit Bindestrich-Sätzen in echte Bullet-Listen umgewandelt; inline-bold Stichworte als eigene H4-Subheadings (Spark-Notebooks, Python-Notebooks, Direct Lake, DirectQuery, Importmodus); CU-Warnung zu Datenflüssen und SQL-Endpunkt-Verzögerung als sichtbare Warning-Boxen
- Mermaid-Diagramm Medallion-Architektur ergänzt am Anfang: visualisiert die Datenfluss-Hierarchie Bronze → Silver → Gold mit Quellsystemen und Verbrauchern
- Inhaltliche Substanz unverändert; alle Schemata, Lakehouse-Namen und technischen Bezeichner 1:1 aus Original
Verwandte Themen
Failed to execute the [velocity] macro. Cause: [The execution of the [velocity] script macro is not allowed in [xwiki:IT-Wiki.Makros.Verwandte-Themen.WebHome]. Check the rights of its last author or the parameters if it's rendered from another script.]. Click on this message for details.
org.xwiki.rendering.macro.MacroExecutionException: The execution of the [velocity] script macro is not allowed in [xwiki:IT-Wiki.Makros.Verwandte-Themen.WebHome]. Check the rights of its last author or the parameters if it's rendered from another script.
at org.xwiki.rendering.macro.script.AbstractScriptMacro.execute(AbstractScriptMacro.java:178)
at org.xwiki.rendering.macro.script.AbstractScriptMacro.execute(AbstractScriptMacro.java:58)
at org.xwiki.rendering.internal.transformation.macro.MacroTransformation.transform(MacroTransformation.java:441)
at org.xwiki.rendering.internal.transformation.DefaultRenderingContext.transformInContext(DefaultRenderingContext.java:183)
at org.xwiki.rendering.internal.transformation.DefaultTransformationManager.performTransformations(DefaultTransformationManager.java:88)
at org.xwiki.display.internal.DocumentContentAsyncExecutor.executeInCurrentExecutionContext(DocumentContentAsyncExecutor.java:397)
at org.xwiki.display.internal.DocumentContentAsyncExecutor.execute(DocumentContentAsyncExecutor.java:269)
at org.xwiki.display.internal.DocumentContentAsyncRenderer.execute(DocumentContentAsyncRenderer.java:112)
at org.xwiki.rendering.async.internal.block.AbstractBlockAsyncRenderer.render(AbstractBlockAsyncRenderer.java:157)
at org.xwiki.rendering.async.internal.block.AbstractBlockAsyncRenderer.render(AbstractBlockAsyncRenderer.java:54)
at org.xwiki.rendering.async.internal.DefaultAsyncRendererExecutor.syncRender(DefaultAsyncRendererExecutor.java:290)
at org.xwiki.rendering.async.internal.DefaultAsyncRendererExecutor.render(DefaultAsyncRendererExecutor.java:267)
at org.xwiki.rendering.async.internal.block.DefaultBlockAsyncRendererExecutor.execute(DefaultBlockAsyncRendererExecutor.java:125)
at org.xwiki.display.internal.DocumentContentDisplayer.display(DocumentContentDisplayer.java:93)
at org.xwiki.display.internal.DocumentContentDisplayer.display(DocumentContentDisplayer.java:46)
at org.xwiki.display.internal.DefaultDocumentDisplayer.display(DefaultDocumentDisplayer.java:96)
at org.xwiki.display.internal.DefaultDocumentDisplayer.display(DefaultDocumentDisplayer.java:39)
at org.xwiki.sheet.internal.SheetDocumentDisplayer.display(SheetDocumentDisplayer.java:123)
at org.xwiki.sheet.internal.SheetDocumentDisplayer.display(SheetDocumentDisplayer.java:52)
at org.xwiki.display.internal.ConfiguredDocumentDisplayer.display(ConfiguredDocumentDisplayer.java:68)
at org.xwiki.display.internal.ConfiguredDocumentDisplayer.display(ConfiguredDocumentDisplayer.java:42)
at com.xpn.xwiki.doc.XWikiDocument.display(XWikiDocument.java:1433)
at com.xpn.xwiki.doc.XWikiDocument.getRenderedContent(XWikiDocument.java:1569)
at com.xpn.xwiki.doc.XWikiDocument.displayDocument(XWikiDocument.java:1519)
at com.xpn.xwiki.doc.XWikiDocument.displayDocument(XWikiDocument.java:1488)
at com.xpn.xwiki.api.Document.displayDocument(Document.java:822)
at jdk.internal.reflect.GeneratedMethodAccessor599.invoke(Unknown Source)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.base/java.lang.reflect.Method.invoke(Unknown Source)
at org.apache.velocity.util.introspection.UberspectImpl$VelMethodImpl.doInvoke(UberspectImpl.java:571)
at org.apache.velocity.util.introspection.UberspectImpl$VelMethodImpl.invoke(UberspectImpl.java:554)
at org.apache.velocity.runtime.parser.node.ASTMethod.execute(ASTMethod.java:221)
at org.apache.velocity.runtime.parser.node.ASTReference.execute(ASTReference.java:368)
at org.apache.velocity.runtime.parser.node.ASTReference.value(ASTReference.java:704)
at org.apache.velocity.runtime.parser.node.ASTExpression.value(ASTExpression.java:75)
at org.apache.velocity.runtime.parser.node.ASTSetDirective.render(ASTSetDirective.java:242)
at org.apache.velocity.runtime.parser.node.ASTBlock.render(ASTBlock.java:147)
at org.apache.velocity.runtime.parser.node.SimpleNode.render(SimpleNode.java:439)
at org.apache.velocity.runtime.parser.node.ASTIfStatement.render(ASTIfStatement.java:190)
at org.apache.velocity.runtime.parser.node.ASTBlock.render(ASTBlock.java:147)
at org.xwiki.velocity.internal.directive.TryCatchDirective.render(TryCatchDirective.java:86)
at org.apache.velocity.runtime.parser.node.ASTDirective.render(ASTDirective.java:304)
at org.apache.velocity.runtime.parser.node.SimpleNode.render(SimpleNode.java:439)
at org.apache.velocity.Template.merge(Template.java:358)
at org.apache.velocity.Template.merge(Template.java:262)
at org.xwiki.velocity.internal.InternalVelocityEngine.evaluate(InternalVelocityEngine.java:233)
at com.xpn.xwiki.internal.template.VelocityTemplateEvaluator.evaluateContent(VelocityTemplateEvaluator.java:107)
at com.xpn.xwiki.internal.template.TemplateAsyncRenderer.evaluateContent(TemplateAsyncRenderer.java:219)
at com.xpn.xwiki.internal.template.TemplateAsyncRenderer.renderVelocity(TemplateAsyncRenderer.java:174)
at com.xpn.xwiki.internal.template.TemplateAsyncRenderer.render(TemplateAsyncRenderer.java:135)
at com.xpn.xwiki.internal.template.TemplateAsyncRenderer.render(TemplateAsyncRenderer.java:54)
at org.xwiki.rendering.async.internal.DefaultAsyncRendererExecutor.lambda$syncRender$0(DefaultAsyncRendererExecutor.java:284)
at com.xpn.xwiki.internal.security.authorization.DefaultAuthorExecutor.call(DefaultAuthorExecutor.java:98)
at org.xwiki.rendering.async.internal.DefaultAsyncRendererExecutor.syncRender(DefaultAsyncRendererExecutor.java:284)
at org.xwiki.rendering.async.internal.DefaultAsyncRendererExecutor.render(DefaultAsyncRendererExecutor.java:267)
at org.xwiki.rendering.async.internal.block.DefaultBlockAsyncRendererExecutor.render(DefaultBlockAsyncRendererExecutor.java:154)
at com.xpn.xwiki.internal.template.InternalTemplateManager.render(InternalTemplateManager.java:869)
at com.xpn.xwiki.internal.template.InternalTemplateManager.renderFromSkin(InternalTemplateManager.java:831)
at com.xpn.xwiki.internal.template.InternalTemplateManager.render(InternalTemplateManager.java:818)
at com.xpn.xwiki.internal.template.InternalTemplateManager.renderNoException(InternalTemplateManager.java:773)
at com.xpn.xwiki.internal.template.InternalTemplateManager.renderNoException(InternalTemplateManager.java:765)
at com.xpn.xwiki.internal.template.DefaultTemplateManager.renderNoException(DefaultTemplateManager.java:79)
at com.xpn.xwiki.internal.template.DefaultTemplateManager.renderNoException(DefaultTemplateManager.java:73)
at org.xwiki.template.script.TemplateScriptService.render(TemplateScriptService.java:54)
at jdk.internal.reflect.GeneratedMethodAccessor173.invoke(Unknown Source)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.base/java.lang.reflect.Method.invoke(Unknown Source)
at org.apache.velocity.util.introspection.UberspectImpl$VelMethodImpl.doInvoke(UberspectImpl.java:571)
at org.apache.velocity.util.introspection.UberspectImpl$VelMethodImpl.invoke(UberspectImpl.java:554)
at org.apache.velocity.runtime.parser.node.ASTMethod.execute(ASTMethod.java:221)
at org.apache.velocity.runtime.parser.node.ASTReference.execute(ASTReference.java:368)
at org.apache.velocity.runtime.parser.node.ASTReference.render(ASTReference.java:492)
at org.apache.velocity.runtime.parser.node.ASTBlock.render(ASTBlock.java:147)
at org.apache.velocity.runtime.directive.VelocimacroProxy.render(VelocimacroProxy.java:217)
at org.apache.velocity.runtime.directive.RuntimeMacro.render(RuntimeMacro.java:331)
at org.apache.velocity.runtime.directive.RuntimeMacro.render(RuntimeMacro.java:261)
at org.apache.velocity.runtime.parser.node.ASTDirective.render(ASTDirective.java:304)
at org.apache.velocity.runtime.parser.node.SimpleNode.render(SimpleNode.java:439)
at org.apache.velocity.Template.merge(Template.java:358)
at org.apache.velocity.Template.merge(Template.java:262)
at org.xwiki.velocity.internal.InternalVelocityEngine.evaluate(InternalVelocityEngine.java:233)
at com.xpn.xwiki.internal.template.VelocityTemplateEvaluator.evaluateContent(VelocityTemplateEvaluator.java:107)
at com.xpn.xwiki.internal.template.TemplateAsyncRenderer.evaluateContent(TemplateAsyncRenderer.java:219)
at com.xpn.xwiki.internal.template.TemplateAsyncRenderer.renderVelocity(TemplateAsyncRenderer.java:174)
at com.xpn.xwiki.internal.template.TemplateAsyncRenderer.render(TemplateAsyncRenderer.java:135)
at com.xpn.xwiki.internal.template.TemplateAsyncRenderer.render(TemplateAsyncRenderer.java:54)
at org.xwiki.rendering.async.internal.DefaultAsyncRendererExecutor.lambda$syncRender$0(DefaultAsyncRendererExecutor.java:284)
at com.xpn.xwiki.internal.security.authorization.DefaultAuthorExecutor.call(DefaultAuthorExecutor.java:98)
at org.xwiki.rendering.async.internal.DefaultAsyncRendererExecutor.syncRender(DefaultAsyncRendererExecutor.java:284)
at org.xwiki.rendering.async.internal.DefaultAsyncRendererExecutor.render(DefaultAsyncRendererExecutor.java:267)
at org.xwiki.rendering.async.internal.block.DefaultBlockAsyncRendererExecutor.render(DefaultBlockAsyncRendererExecutor.java:154)
at com.xpn.xwiki.internal.template.InternalTemplateManager.render(InternalTemplateManager.java:869)
at com.xpn.xwiki.internal.template.InternalTemplateManager.renderFromSkin(InternalTemplateManager.java:831)
at com.xpn.xwiki.internal.template.InternalTemplateManager.render(InternalTemplateManager.java:818)
at com.xpn.xwiki.internal.template.InternalTemplateManager.renderNoException(InternalTemplateManager.java:773)
at com.xpn.xwiki.internal.template.InternalTemplateManager.renderNoException(InternalTemplateManager.java:765)
at com.xpn.xwiki.internal.template.DefaultTemplateManager.renderNoException(DefaultTemplateManager.java:79)
at com.xpn.xwiki.internal.template.DefaultTemplateManager.renderNoException(DefaultTemplateManager.java:73)
at org.xwiki.template.script.TemplateScriptService.render(TemplateScriptService.java:54)
at jdk.internal.reflect.GeneratedMethodAccessor173.invoke(Unknown Source)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.base/java.lang.reflect.Method.invoke(Unknown Source)
at org.apache.velocity.util.introspection.UberspectImpl$VelMethodImpl.doInvoke(UberspectImpl.java:571)
at org.apache.velocity.util.introspection.UberspectImpl$VelMethodImpl.invoke(UberspectImpl.java:554)
at org.apache.velocity.runtime.parser.node.ASTMethod.execute(ASTMethod.java:221)
at org.apache.velocity.runtime.parser.node.ASTReference.execute(ASTReference.java:368)
at org.apache.velocity.runtime.parser.node.ASTReference.render(ASTReference.java:492)
at org.apache.velocity.runtime.parser.node.ASTBlock.render(ASTBlock.java:147)
at org.apache.velocity.runtime.directive.VelocimacroProxy.render(VelocimacroProxy.java:217)
at org.apache.velocity.runtime.directive.RuntimeMacro.render(RuntimeMacro.java:331)
at org.apache.velocity.runtime.directive.RuntimeMacro.render(RuntimeMacro.java:261)
at org.apache.velocity.runtime.parser.node.ASTDirective.render(ASTDirective.java:304)
at org.apache.velocity.runtime.parser.node.ASTBlock.render(ASTBlock.java:147)
at org.apache.velocity.runtime.parser.node.ASTIfStatement.render(ASTIfStatement.java:171)
at org.apache.velocity.runtime.parser.node.ASTBlock.render(ASTBlock.java:147)
at org.apache.velocity.runtime.parser.node.SimpleNode.render(SimpleNode.java:439)
at org.apache.velocity.runtime.parser.node.ASTIfStatement.render(ASTIfStatement.java:190)
at org.apache.velocity.runtime.parser.node.SimpleNode.render(SimpleNode.java:439)
at org.apache.velocity.Template.merge(Template.java:358)
at org.apache.velocity.Template.merge(Template.java:262)
at org.xwiki.velocity.internal.InternalVelocityEngine.evaluate(InternalVelocityEngine.java:233)
at com.xpn.xwiki.internal.template.VelocityTemplateEvaluator.evaluateContent(VelocityTemplateEvaluator.java:107)
at com.xpn.xwiki.internal.template.TemplateAsyncRenderer.evaluateContent(TemplateAsyncRenderer.java:219)
at com.xpn.xwiki.internal.template.TemplateAsyncRenderer.renderVelocity(TemplateAsyncRenderer.java:174)
at com.xpn.xwiki.internal.template.TemplateAsyncRenderer.render(TemplateAsyncRenderer.java:135)
at com.xpn.xwiki.internal.template.TemplateAsyncRenderer.render(TemplateAsyncRenderer.java:54)
at org.xwiki.rendering.async.internal.DefaultAsyncRendererExecutor.lambda$syncRender$0(DefaultAsyncRendererExecutor.java:284)
at com.xpn.xwiki.internal.security.authorization.DefaultAuthorExecutor.call(DefaultAuthorExecutor.java:98)
at org.xwiki.rendering.async.internal.DefaultAsyncRendererExecutor.syncRender(DefaultAsyncRendererExecutor.java:284)
at org.xwiki.rendering.async.internal.DefaultAsyncRendererExecutor.render(DefaultAsyncRendererExecutor.java:267)
at org.xwiki.rendering.async.internal.block.DefaultBlockAsyncRendererExecutor.render(DefaultBlockAsyncRendererExecutor.java:154)
at com.xpn.xwiki.internal.template.InternalTemplateManager.render(InternalTemplateManager.java:869)
at com.xpn.xwiki.internal.template.InternalTemplateManager.renderFromSkin(InternalTemplateManager.java:831)
at com.xpn.xwiki.internal.template.InternalTemplateManager.renderFromSkin(InternalTemplateManager.java:811)
at com.xpn.xwiki.internal.template.InternalTemplateManager.render(InternalTemplateManager.java:797)
at com.xpn.xwiki.internal.template.DefaultTemplateManager.render(DefaultTemplateManager.java:91)
at com.xpn.xwiki.internal.template.DefaultTemplateManager.render(DefaultTemplateManager.java:85)
at com.xpn.xwiki.XWiki.evaluateTemplate(XWiki.java:2552)
at com.xpn.xwiki.web.Utils.parseTemplate(Utils.java:180)
at com.xpn.xwiki.web.XWikiAction.execute(XWikiAction.java:651)
at com.xpn.xwiki.web.XWikiAction.execute(XWikiAction.java:339)
at com.xpn.xwiki.web.LegacyActionServlet.service(LegacyActionServlet.java:111)
at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:723)
at org.eclipse.jetty.ee11.servlet.ServletHolder$NotAsync.service(ServletHolder.java:1397)
at org.eclipse.jetty.ee11.servlet.ServletHolder.handle(ServletHolder.java:754)
at org.eclipse.jetty.ee11.servlet.ServletHandler$ChainEnd.doFilter(ServletHandler.java:1668)
at com.xpn.xwiki.web.ActionFilter.doFilter(ActionFilter.java:123)
at org.eclipse.jetty.ee11.servlet.FilterHolder.doFilter(FilterHolder.java:205)
at org.eclipse.jetty.ee11.servlet.ServletHandler$Chain.doFilter(ServletHandler.java:1640)
at org.xwiki.wysiwyg.filter.ConversionFilter.doFilter(ConversionFilter.java:71)
at org.eclipse.jetty.ee11.servlet.FilterHolder.doFilter(FilterHolder.java:205)
at org.eclipse.jetty.ee11.servlet.ServletHandler$Chain.doFilter(ServletHandler.java:1640)
at org.xwiki.container.servlet.filters.internal.SetHTTPHeaderFilter.doFilter(SetHTTPHeaderFilter.java:66)
at org.eclipse.jetty.ee11.servlet.FilterHolder.doFilter(FilterHolder.java:205)
at org.eclipse.jetty.ee11.servlet.ServletHandler$Chain.doFilter(ServletHandler.java:1640)
at org.xwiki.resource.servlet.RoutingFilter.doFilter(RoutingFilter.java:135)
at org.eclipse.jetty.ee11.servlet.FilterHolder.doFilter(FilterHolder.java:205)
at org.eclipse.jetty.ee11.servlet.ServletHandler$Chain.doFilter(ServletHandler.java:1640)
at org.xwiki.container.servlet.filters.internal.SavedRequestRestorerFilter.doFilter(SavedRequestRestorerFilter.java:212)
at org.eclipse.jetty.ee11.servlet.FilterHolder.doFilter(FilterHolder.java:205)
at org.eclipse.jetty.ee11.servlet.ServletHandler$Chain.doFilter(ServletHandler.java:1640)
at org.xwiki.container.servlet.filters.internal.SafeRedirectFilter.doFilter(SafeRedirectFilter.java:106)
at org.eclipse.jetty.ee11.servlet.FilterHolder.doFilter(FilterHolder.java:205)
at org.eclipse.jetty.ee11.servlet.ServletHandler$Chain.doFilter(ServletHandler.java:1640)
at org.xwiki.container.servlet.filters.internal.ResolveRelativeRedirectFilter.doFilter(ResolveRelativeRedirectFilter.java:129)
at org.eclipse.jetty.ee11.servlet.FilterHolder.doFilter(FilterHolder.java:205)
at org.eclipse.jetty.ee11.servlet.ServletHandler$Chain.doFilter(ServletHandler.java:1640)
at org.xwiki.container.servlet.filters.internal.SourceURLResolverFilter.doFilter(SourceURLResolverFilter.java:177)
at org.eclipse.jetty.ee11.servlet.FilterHolder.doFilter(FilterHolder.java:205)
at org.eclipse.jetty.ee11.servlet.ServletHandler$Chain.doFilter(ServletHandler.java:1640)
at org.xwiki.container.servlet.filters.internal.SetCharacterEncodingFilter.doFilter(SetCharacterEncodingFilter.java:120)
at org.eclipse.jetty.ee11.servlet.FilterHolder.doFilter(FilterHolder.java:208)
at org.eclipse.jetty.ee11.servlet.ServletHandler$Chain.doFilter(ServletHandler.java:1640)
at org.eclipse.jetty.ee11.websocket.servlet.WebSocketUpgradeFilter.doFilter(WebSocketUpgradeFilter.java:199)
at org.eclipse.jetty.ee11.servlet.FilterHolder.doFilter(FilterHolder.java:205)
at org.eclipse.jetty.ee11.servlet.ServletHandler$Chain.doFilter(ServletHandler.java:1640)
at org.eclipse.jetty.ee11.servlet.ServletHandler$MappedServlet.handle(ServletHandler.java:1602)
at org.eclipse.jetty.ee11.servlet.ServletChannel.dispatch(ServletChannel.java:871)
at org.eclipse.jetty.ee11.servlet.ServletChannel.handle(ServletChannel.java:449)
at org.eclipse.jetty.ee11.servlet.ServletHandler.handle(ServletHandler.java:469)
at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:546)
at org.eclipse.jetty.ee11.servlet.SessionHandler.handle(SessionHandler.java:763)
at org.eclipse.jetty.server.handler.ContextHandler.handle(ContextHandler.java:1226)
at org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:178)
at org.eclipse.jetty.server.Server.handle(Server.java:197)
at org.eclipse.jetty.server.internal.HttpChannelState$HandlerInvoker.run(HttpChannelState.java:788)
at org.eclipse.jetty.server.internal.HttpConnection.onFillable(HttpConnection.java:420)
at org.eclipse.jetty.server.internal.HttpConnection$FillableCallback.succeeded(HttpConnection.java:1809)
at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:105)
at org.eclipse.jetty.io.SelectableChannelEndPoint$1.run(SelectableChannelEndPoint.java:54)
at org.eclipse.jetty.util.thread.strategy.AdaptiveExecutionStrategy.runTask(AdaptiveExecutionStrategy.java:492)
at org.eclipse.jetty.util.thread.strategy.AdaptiveExecutionStrategy.epcRunTask(AdaptiveExecutionStrategy.java:428)
at org.eclipse.jetty.util.thread.strategy.AdaptiveExecutionStrategy.consumeTask(AdaptiveExecutionStrategy.java:401)
at org.eclipse.jetty.util.thread.strategy.AdaptiveExecutionStrategy.tryProduce(AdaptiveExecutionStrategy.java:255)
at org.eclipse.jetty.util.thread.strategy.AdaptiveExecutionStrategy.run(AdaptiveExecutionStrategy.java:204)
at org.eclipse.jetty.util.thread.ReservedThreadExecutor$ReservedThread.run(ReservedThreadExecutor.java:317)
at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:1009)
at org.eclipse.jetty.util.thread.QueuedThreadPool$Runner.doRunJob(QueuedThreadPool.java:1240)
at org.eclipse.jetty.util.thread.QueuedThreadPool$Runner.run(QueuedThreadPool.java:1194)
at java.base/java.lang.Thread.run(Unknown Source)
Status: Migriert — Team-Review ausstehend · Owner: (festlegen) · Letzter Review: 2026-06-11