Kein Kommando ohne id

Bei der Validierung kommt es an vielen Stellen meiner Grails basierten Anwendung zum Einsatz von sogenannten Kommando-Objekten, welche die Überprüfung von Parametern und unter Umständen die Erstellung von gültigen Domain-Klassen bzw. deren Instanzen übernehmen.

Heute bin ich dabei über eine Kuriosität gestoßen. Grails (Version 1.2.2) weigerte sich, die eingehenden Request-Parameter auf das Kommando-Objekt "zu setzen". Obwohl also id und version ordnungsgemäß über ein Formular via POST versandt wurden kamen diese nicht im Kommando-Objekt an und verweilten bei null.

Um das Ganze zu verdeutlichen habe ich mal den folgenden Code-Schnipsel synthetisiert:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
class MyCommand {
    def id
    def version

    private _domain

    def getDomain() {
        _domain ?: Domain.get(id)
    }

    static constraints = {
        id(validator: { val, obj ->
            if (!obj.domain) {
                return [ 'domain.not.found' ]
            }
        })
        version(validator: { val, obj ->
            def version = val?.toLong()
            if (obj?.domain?.version > version) {
                return [ 'version.mismatch' ]
            }
        })
    }
}

Nach einiger Tüftelei hat sich herausgestellt, dass wenn ich version und dessen constraint entferne, das Feld id wie gewohnt gesetzt wird.

Eine praktikable Lösung - außer die Überprüfung der Version in der Aktion - habe ich allerdings nicht auf Lager.