Im Rahmen eines aktuellen Projekts verwenden wir JAXB zum Unmarshalling strukturierter Inhalte, die aus einem CMS gelesen werden. Es ergab sich die Notwendigkeit, nach dem reinen Unmarshalling noch weitere Dinge zu tun, um dem neu erzeugten Objekt(baum) einen konsistenten Zustand zu geben. Im konkreten Fall wurde eine Map benötigt, die redaktionell gepflegte textuelle IDs zu numerischen IDs zuordnet. Da diese Zuordnung nicht aus dem XML ablesbar ist, muss sie nach dem Erzeugen des Objekts hergestellt werden.
Auf der Suche nach einer möglichst eleganten Möglichkeit, den generischen XML-Reader um ein Postprocessing zu erweitern, hatten wir zunächst die Idee ein Interface zu definieren das von jeder gemappten Top-Level-Modellklasse implementiert werden muss, die Postprocessing benötigt. Dies stellte sich jedoch als überflüssige Idee heraus, da JAXB bereits Mechanismen für Pre- und Postprocessing anbietet. Die zugehörige Dokumentation befindet sich in der Javadoc zu javax.xml.bind.Unmarshaller .
Indem man der gemappten Modellklasse eine Methode
1void afterUnmarshal(Unmarshaller, Object parent);
hinzufügt, hat man einen Callback-Hook der jeweils nach dem Unmarshalling aufgerufen wird. Innerhalb der Methode hat man vollen Zugriff auf den Unmarshaller und auf das in der Hierarchie höherstehende parent-Objekt. Befindet man sich im Top-Level-Objekt (XmlRootElement), so ist parent null.
Implementiert man diese Methode in der obersten Modellklasse, so kann man von dort aus bequem den Objektbaum durchwandern und die nötigen Aktionen vornehmen. In unserem konkreten Fall sieht das unspektakulär aus:
1void afterUnmarshal(Unmarshaller unmarshaller, Object parent) {
2 createIDs();
3}
Die Methode „createIDs();“ hat default visibility, ist also vom zugehörigen Unit-Test im gleichen Package aufrufbar, ohne dort in Abwesenheit von JAXB afterUnmarshal(…) nutzen zu müssen. Dies dient einerseits der „separation of concerns“, andererseits ist so die afterUnmarshal(…) Methode je nach Anforderung beliebig erweiterbar ohne dass dort ein Dickicht an Code entsteht.
Weitere Beiträge
von Robert Spielmann
Dein Job bei codecentric?
Jobs
Agile Developer und Consultant (w/d/m)
Alle Standorte
Weitere Artikel in diesem Themenbereich
Entdecke spannende weiterführende Themen und lass dich von der codecentric Welt inspirieren.
Gemeinsam bessere Projekte umsetzen.
Wir helfen deinem Unternehmen.
Du stehst vor einer großen IT-Herausforderung? Wir sorgen für eine maßgeschneiderte Unterstützung. Informiere dich jetzt.
Hilf uns, noch besser zu werden.
Wir sind immer auf der Suche nach neuen Talenten. Auch für dich ist die passende Stelle dabei.
Blog-Autor*in
Robert Spielmann
Du hast noch Fragen zu diesem Thema? Dann sprich mich einfach an.
Du hast noch Fragen zu diesem Thema? Dann sprich mich einfach an.