Es könnte eine bessere Art und Weise sein, aber ein Trick ist, invokeMethod
direkt anrufen:
String buildCatalog(Catalog catalog) {
def writer = new StringWriter()
def xml = new MarkupBuilder(writer)
xml.catalog(xmlns:'http://www.sybrium.com/XMLSchema/NodeCatalog') {
delegate.invokeMethod('identity', [{
groupId(catalog.groupId)
artifactId(catalog.artifactId)
version(catalog.version)
}])
}
return writer.toString();
}
Dies ist effektiv, was Groovy hinter den Kulissen tut. Ich konnte nicht delegate.identity
oder owner.identity
arbeiten, die die üblichen Tricks sind.
bearbeiten: Ich fand heraus, was los ist.
Groovy adds a method mit einer Signatur von identity(Closure c)
zu jedem Objekt.
Das bedeutet, dass, wenn Sie das identity
Element auf dem XML-Builder, um dynamisch aufzurufen versucht, während in einem einzigen Verschluss Argument übergeben, wurde die identity()
Methode aufrufen, die wie der Aufruf delegate({...})
auf dem äußeren Verschluss ist.
Mit dem invokeMethod
Trick wird Groovy gezwungen, das Meta-Objektprotokoll zu umgehen und die Methode als dynamische Methode zu behandeln, obwohl die Methode identity
bereits auf MetaObject existiert.
Mit diesem Wissen können wir eine bessere, lesbarere Lösung zusammenstellen. Alles, was wir tun müssen, ist die Signatur der Methode zu ändern, etwa so:
String buildCatalog(Catalog catalog) {
def writer = new StringWriter()
def xml = new MarkupBuilder(writer)
xml.catalog(xmlns:'http://www.sybrium.com/XMLSchema/NodeCatalog') {
// NOTE: LEAVE the empty map here to prevent calling the identity method!
identity([:]) {
groupId(catalog.groupId)
artifactId(catalog.artifactId)
version(catalog.version)
}
}
return writer.toString();
}
Dies ist viel besser lesbar, es ist die Absicht klarer, und der Kommentar (hoffentlich) soll jemand von Entfernen der „unnötigen“ leer verhindern Karte.
Das hat funktioniert, aber können Sie das erklären? Was ist delegate und warum ist delegate.identity anders als delegate.invokeMethod ('identity')? –
Ich habe es herausgefunden, ich werde meine Antwort aktualisieren. – OverZealous
FYI: Ich habe dies mithilfe der GroovyConsole nachverfolgt, um das XML-Objekt zu untersuchen. Dies ließ mich wissen, dass die "Identitäts" -Methode bereits mit einem einzigen "Closure" als Argument existierte. – OverZealous