Ich versuche herauszufinden, wie Daten, die bei einer Anfrage eingehen, einem Hibernate-Objekt zugeordnet werden, und das Problem besteht darin, dass die hereinkommenden Daten sich auf dem Objekt oder den untergeordneten Objekten befinden und die Felddaten nicht unbedingt sind bekannt - die Formulare sind benutzerkonfiguriert, um die gewünschten Daten zu enthalten und zu sammeln.
Grob sind die Objekte wie folgt:
%Vor%Wenn der Benutzer also festgelegt hat, dass er die JobLocation-Beschreibung bearbeiten möchte, erhalten wir in der Anfrage etwas in der Art von
zurück %Vor% Wie wird das auf das Kind von Job
abgebildet, mit dem ich es zu tun habe? Alles, was ich zum Zeitpunkt habe, ist der Verweis auf Job
, alle anderen Elemente können variieren, je nachdem, was sie in Dropdowns usw. ausgewählt haben. Eine Option ist das Speichern einer Referenz wie job.location.description
, Getter und Verwendung Reflexion, um eine Prozess-Fahren-Option zu machen:
Leider gibt es nichts, das sagt, es könnten nicht mehrere Ebenen sein, und um die Methoden zu bekommen, die wir derzeit denken, müssten wir die Reflexion verwenden. Gibt es andere, bessere Möglichkeiten, um diese Art von Operation zu tun, oder müssen wir nur durchgehen?
Ich hatte fast ähnliche Anforderungen in unserem Projekt. Wir haben am Ende die Reflection + Annotation für das Mapping verwendet. Auf den Punkt gebracht, hatten wir so etwas, um das Objekt zu konstruieren.
%Vor%Wenn Sie nicht verstanden haben, was wir meinen, haben wir eine benutzerdefinierte Annotation erstellt, und wir haben eine Utility-Methode geschrieben, die über Reflektionsschleifen durch die Elemente mit folgenden Annotationen verläuft:
%Vor% Wenn Sie zum Zeitpunkt der Kompilierung den Namen der Methode kennen, die Sie aufrufen, müssen Sie keine Reflektion verwenden. Es hört sich so an, als müsste man nachdenken. Das bedeutet jedoch nicht, dass Sie die rohe java.lang.reflect
API verwenden müssen, was ziemlich schmerzhaft ist, direkt zu verwenden. Wenn Sie bereits Spring verwenden, ist BeanWrapperImpl
ein sehr nettes Dienstprogramm, das Ihre vorhandene ConversionService
verwenden kann, um Ihre Eingabe in den Zieltyp zu konvertieren. Ansonsten würde ich Commons BeanUtils vorschlagen, was ziemlich genau dasselbe ohne Springiness tut. Beide Bibliotheken wissen, wie geschachtelte Eigenschaften und Map
-bewertete Eigenschaften ebenfalls behandelt werden.