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.