| 

.NET C# Java Javascript Exception

objekte mit Hilfe des Kontrollers in andere Objekte kopieren

Dies ist das Archiv des ehemaligen Forums zum Thema Groovy, Grails, Griffon und Bean Scripting Framework, welches unter groovy-forum.de existierte. Die neue Adresse des Groovy-Forums ist: http://codekicker.de/fragen/themen/groovy.


objekte mit Hilfe des Kontrollers in andere Objekte kopieren

michi - 11.12.2007 11:02
Ich hab ein Klasse CustomerDetail, wenn ein Objact davon verändert wird (also edit aufgerufen) will ich das alte Objekt in ein Objekt der Klasse CustomerDetailHist kopieren, welches genau dieselben properties + Datum der Änderung enthält.
Die Daten werden alle richtig kopiert, aber die gleichzeitige Speicherung der Änderungen im Objekt CustomerDetail funktioniert nicht. Das heißt wenn ich auf Update klicke kommt die tolle HTTP Error 404 Seite...Hat einer von euch einen Tip was ich falsch mache?

Danke, Michi ;-)

def edit = {
def customerDetail = CustomerDetail.get( params.id )


if(!customerDetail) {
flash.message = "CustomerDetail not found with id ${params.id}"
redirect(action:list)
}
else {
customerDetailHist = new CustomerDetailHist()
customerDetailHist.properties = customerDetail.properties
customerDetailHist.date = new Date()
customerDetailHist.save()
return [customerDetail:customerDetail]
}
}


Re: objekte mit Hilfe des Kontrollers in andere Objekte kopieren

christian - 20.12.2007 11:23
Hallo Michi,

das Problem liegt vermutlich in der Art der Zuweisung der Attribute.
customerDetailHist.properties = customerDetail.properties
properties ist eine Map mit den Eigenschaften eines Objekts. Kleines Beispiel:
class Customer{
    String name
}
Customer c = new Customer()
print c.properties
führt zu der Ausgabe:
["metaClass":groovy.lang.MetaClassImpl@79801c[class Customer], "class":class Customer, "name":null]
Du versuchst vermutlich, mehr zu kopieren als Du eigentlich beabsichtigst. Bau Dir mal einen Konstruktor in customerDetailHist, der die Parameter explizit entgegennimmt bzw. der das Objekt entgegennimmt und intern die Attribute ausliest und in das zu erzeugende Objekt übernimmt. Evtl. musst du dann noch einen leeren Konstruktor einfügen, weil Grails sonst manchmal keine Objekte erzeugen kann. Siehe auch Unittests von Klassen mit Nicht-Standard-Konstruktor.

Du könntest auch clone() implementieren und damit das Objekt kopieren.

Gruß
Christian


Re: objekte mit Hilfe des Kontrollers in andere Objekte kopieren

christian - 20.12.2007 23:17
roock schrieb:

> Vielleicht kann man sich was Generisches mit
> GPaths und grep darauf bauen?

Das ist eine interessante Idee, aber vermutlich nicht ganz einfach umzusetzen. Man könnte alle Attribute kopieren, die nicht einmalig sein müssen (wie die Objekt-ID) oder Grails-intern sind. Aber was ist mit Referenzen des kopierten Objekts auf weitere Objekte? Sollen Original und Kopie auf dieselben oder die gleichen Objekte zeigen, soll es also eine tiefe Kopie sein oder nicht? Das könnte man vielleicht noch lösen, indem man sowohl eine Funktion für tiefe als auch für flache Kopien anbietet.

Da stellt sich schon die nächste Frage, nämlich wo diese Funktion implementiert werden soll. In der Klasse der zu kopierenden Objekte wohl eher nicht, denn dann wäre sie ja nicht allgemein zum Kopieren beliebiger Objekte verwendbar. Wenn man aber eine Hilfsklasse mit den beiden Kopiermethoden schriebe, wäre die Rückgabe vom Typ "Object" und damit würde die Typsicherheit flöten gehen. Die Lösung könnten Generics sein, aber die gibt es erst in Groovy 1.5, was es in Grails noch nicht gibt.

Nächstes Problem ist die Tatsache, dass man mit GPath scheinbar nicht auf private Attribute zugreifen kann.

Das Skript
class Objekt{
    private String name = "Klaus"
    int alter = 43
    public Objekt(){
        properties.each{println it}
    }
}
new Objekt()
liefert
metaClass=groovy.lang.MetaClassImpl@509df8[class Objekt]
class=class Objekt
alter=43
Result: Objekt@dfc362
Das Attribut name wird nicht ausgeben, da es privat ist. Man könnte mit klassischer Introspektion (Reflection) arbeiten, aber das dürfte auch nicht trivial sein und außerdem muss man den Security-Manager so konfigurieren, dass der Zugriff auf private Attribute von außen erlaubt ist. Mehr dazu steht in dem empfehlenswerten Java 6 Programmierhandbuch.

Eine weitere Hürde könnte Vererbung sein, weil man dann auch die Oberklassen untersuchen müsste.

Soweit mal meine Gedanken zu möglichen Problemen, für den tapferen Programmierer, der diese Funktion umsetzt ;-)

Gruß
Christian


Stelle deine Groovy-Frage jetzt!


Diese Seite zeigt den Thread "objekte mit Hilfe des Kontrollers in andere Objekte kopieren" der ehemaligen Webseite groovy-forum.de, welche durch einen Serverunfall zerstört wurde. codekicker.de hat viele Konversationen über die beliebte Programmiersprache Groovy und zugehörige Frameworks wie das Grails-Framework retten können.

Hast Du eine Frage zum Thema Groovy, Grails oder allgemein Java? Viele ehemalige groovy-forum.de Mitglieder beantworten dir auf codekicker.de deine Frage! Stelle jetzt eine Frage!

Viele weitere Diskussionen zu Grails und Groovy befinden sich auf der Threadübersicht des alten groovy-forum.de.