Moin zusammen,
ich muss (strukturell unterschiedliche) Datensätze aus einer einzigen DB2-Tabelle abziehen und in eine XML Struktur übernehmen. Für das XML Marshalling habe ich mir per JaxB eine "Marshallingklasse" generiert. Die daten werden (momentan) per JDBC ausgelesen.
Ich habe in der Table 5 Felder, im 5. Feld stehen Rohdaten die aber inhaltlich nochmal nach fester Breite getrennt sind und im Ziel-XML Elemente oder Attribute darstellen.
Durch die anderen 4 "einfach gefüllten" Felder lässt sich die Struktur ableiten, anhand der die "Rohdaten" aus dem 5. Feld in Strings gesplittet werden können.
Es könnte also z.B. im 5. Feld "123456.99€" stehen und anhand der vorderen 4 Felder erkenne ich, das es sich um eine Rechnungsposition handelt, die aus einer 1-stelligen Positionsnummer, einer 4-stelligen Artikelnummer sowie dem 3-stelligen Preis besteht.
Mein ergebnis soll also nach JaxB Marshalling so aussehen:
Also in <Position Nummer=1><Artikel =2345>6.99€</Artikel></Position>
Genauso könnte in Feld 5 aber auch ein Datensatz mit der Kundenadresse stehen, der eine eigene Struktur hat und mit in die selbe Ziel-XML Datei übernommen werden muss.
Momentan gibt es für jede dieser Strukturen eine eigene Klasse, die ihre "Feldbreiten" im SQL-Resultset sowie ihr Zielattribut im JaxB-Objekt kennt und ein Interface implementiert, dass eine Methode bietet die als Parameter eine Referenz auf das JaxB Objekt erhält und "ihre" Informationen dort hinzufügt. Die Interfacemethode "setXMLData(JaxBObj meinObj)" führt also "meinObj.addPositionsNummer(this.posNr)" usw. aus).
Eine Schleife läuft durch das Resultset, lässt sich von einer Factory das zum jeweiligen Datensatz gehörende Verarbeitungsobjekt geben und dieses schreibt seine Informationen ins JaxB Objekt.
Ist das Resultset durchlaufen wird gemarshalled und ich habe meine XML Datei.
Das ganze funktioniert und ist auch von der Performance sicht, aber aus OOP-Sicht und in Hinblick auf Erweiterbarkeit wird mir schlecht. Das ganze ist viel zu hart verdrahtet und ich müsste für ein weiteres Zieldokument (z.B. Lieferschein) pro Datenstruktur (im Falle der Rechnung sind das schon ca. 20 verschiedene) eine Klasse mit den einzelnen Feldern und Feldbreiten erzeugen und diese auch noch der Factory bekannt machen.
Ich hoffe das war einigermaßen verständlich, ansonsten gerne weiter nachfragen. Wäre klasse, wenn jemand ne elegantere Lösung vorschlagen kann!
ich muss (strukturell unterschiedliche) Datensätze aus einer einzigen DB2-Tabelle abziehen und in eine XML Struktur übernehmen. Für das XML Marshalling habe ich mir per JaxB eine "Marshallingklasse" generiert. Die daten werden (momentan) per JDBC ausgelesen.
Ich habe in der Table 5 Felder, im 5. Feld stehen Rohdaten die aber inhaltlich nochmal nach fester Breite getrennt sind und im Ziel-XML Elemente oder Attribute darstellen.
Durch die anderen 4 "einfach gefüllten" Felder lässt sich die Struktur ableiten, anhand der die "Rohdaten" aus dem 5. Feld in Strings gesplittet werden können.
Es könnte also z.B. im 5. Feld "123456.99€" stehen und anhand der vorderen 4 Felder erkenne ich, das es sich um eine Rechnungsposition handelt, die aus einer 1-stelligen Positionsnummer, einer 4-stelligen Artikelnummer sowie dem 3-stelligen Preis besteht.
Mein ergebnis soll also nach JaxB Marshalling so aussehen:
Also in <Position Nummer=1><Artikel =2345>6.99€</Artikel></Position>
Genauso könnte in Feld 5 aber auch ein Datensatz mit der Kundenadresse stehen, der eine eigene Struktur hat und mit in die selbe Ziel-XML Datei übernommen werden muss.
Momentan gibt es für jede dieser Strukturen eine eigene Klasse, die ihre "Feldbreiten" im SQL-Resultset sowie ihr Zielattribut im JaxB-Objekt kennt und ein Interface implementiert, dass eine Methode bietet die als Parameter eine Referenz auf das JaxB Objekt erhält und "ihre" Informationen dort hinzufügt. Die Interfacemethode "setXMLData(JaxBObj meinObj)" führt also "meinObj.addPositionsNummer(this.posNr)" usw. aus).
Eine Schleife läuft durch das Resultset, lässt sich von einer Factory das zum jeweiligen Datensatz gehörende Verarbeitungsobjekt geben und dieses schreibt seine Informationen ins JaxB Objekt.
Ist das Resultset durchlaufen wird gemarshalled und ich habe meine XML Datei.
Das ganze funktioniert und ist auch von der Performance sicht, aber aus OOP-Sicht und in Hinblick auf Erweiterbarkeit wird mir schlecht. Das ganze ist viel zu hart verdrahtet und ich müsste für ein weiteres Zieldokument (z.B. Lieferschein) pro Datenstruktur (im Falle der Rechnung sind das schon ca. 20 verschiedene) eine Klasse mit den einzelnen Feldern und Feldbreiten erzeugen und diese auch noch der Factory bekannt machen.
Ich hoffe das war einigermaßen verständlich, ansonsten gerne weiter nachfragen. Wäre klasse, wenn jemand ne elegantere Lösung vorschlagen kann!
Zuletzt bearbeitet: