2010-12-18 8 views
1

Ich habe eine xsd von einer externen Quelle, über die ich keine Kontrolle habe. Nun wollen wir den von JAXB generierten Klassen benutzerdefinierte Methoden hinzufügen, damit das Objekt mehr über sich selbst erfahren kann als ein einfacher POJO mit Gettern und Sätzen zu sein.Wie benutzerdefinierte Verhaltensweisen zu JAXB generierten Klassen hinzugefügt werden. Custom überschreiben bestehende Methoden

Die Idee ist, wie wenn wir diese Art von Ansatz implementieren, brauchen wir nicht das hydrierte Objekt zu bohren, sondern das Objekt nach bestimmten Informationen, die wir durch den Aufruf der benutzerdefinierten Methoden benötigen, und könnten bekommen was wir wollen?

Natürlich gibt es die traditionelle Programmierung Ansatz, wo ich weiter unten die Kinder von Kindern Kinder des Root-Objekts, Getter-Methoden auf jedem Kind aufrufen und Business-Logik implementieren. Aber irgendwie will es das Team hier nicht.

Ein Ansatz, den ich bisher gemacht habe, ist Brute Force One. Wie ich Klassen von XSD mit JAXB generieren. dann habe ich ein externes Dienstprogramm (im Moment ist dies ein eigenständiges Java-Programm), das bei der Ausführung einige Textdateien (auf unsere eigene Art und Weise strukturiert, um herauszufinden, welche Methode in welche .java-Datei gehen soll) in einem bestimmten Verzeichnis zu lesen welche die benutzerdefinierten Methoden enthält und diese Methoden in geeignete JAXB-generierte Klassen verschiebt. Jedes Mal, wenn ich eine neue Version von XSD bekomme, muss ich Klassen generieren, dieses Dienstprogramm aufrufen und eventuell einige Kompilierungsprobleme lösen, falls es Variablenänderungen in JAXB generierten Klassen gibt. Das Dienstprogramm funktioniert einwandfrei. Aber ich möchte das wissen.

Gibt es einen besseren Weg, dies zu tun? Ich habe das Internet überprüft. Es gibt einige Lösungen, die jedoch die vorhandenen get-Methoden in den JAXB-generierten Objekten überschreiben und keine komplett neuen Methoden hinzufügen.

Bitte vorschlagen.

Antwort

1

Nun, der "sauberste Ansatz" wäre Aspect-orientierte Programmierung (AOP), die tut, was Sie nicht auf Quellcode-Ebene, sondern zur Laufzeit beschreiben. Es injiziert Methoden in Klassen. Eine mögliche Implementierung von AOP ist AspectJ

Eine zweite Alternative, die möglich wäre, wenn der XML-Shema nicht zu komplex ist, ist ein Wrapper um ihn herum.

Die dritte Alternative, die Sie bereits beschrieben haben. Aber ich meine, dass man sich auf Standardwerkzeuge verlassen kann, anstatt selbst etwas zu programmieren - ich würde vorschlagen, die Standard-Diff/Patch-Tools dafür zu verwenden. Solange Ihr Code-Stil behoben ist, ist es nicht zu kompliziert, ein Diff aus einer bestehenden modifizierten Java-Datei zu erstellen und auf den frisch generierten JAXB-Code anzuwenden.