2017-06-25 2 views
0

Angesichts der folgenden Domain-Klasse ObjektMap Konstruktor nicht String zuweisen in Grails

class Dog { 
    Object name // changing the type to String fixes it 
} 

Und diese Einheit Test:

import grails.test.mixin.Mock 
import grails.test.mixin.TestMixin 
import grails.test.mixin.support.GrailsUnitTestMixin 
import spock.lang.* 

/** 
* See the API for {@link grails.test.mixin.support.GrailsUnitTestMixin} for usage instructions 
*/ 
@TestMixin(GrailsUnitTestMixin) 
@Mock([Dog]) 
class DogSpec extends Specification { 

    def setup() { 
    } 

    def cleanup() { 
    } 

    void "test something"() { 
     Dog dog = new Dog(name:"sparky") 
     // dog.name = "sparky" // adding this line also fixes it 
     expect:"fix me" 
      dog.name == "sparky" 
    } 
} 

Lauf grails test-app nicht, aber wenn Sie die Art der Dog.name ändern zu String, es funktioniert gut. Debugging bringt mir zu erkennen, dass Dog.name nie zugewiesen wird und ist null. Wenn ich dog.name über reguläre Zuweisung nach dem Erstellen wie oben festgelegt wurde, wird der Test bestanden.

Dieses Problem tritt nicht in Groovy Script auf, das dieselbe Kartenkonstruktorzuweisung verwendet.

Ich möchte, dass mein Typ Object ist, da es je nach Anwendungsfall variiert.

Eine Idee, warum das passiert? Ist es ein Fehler in Grails?

+0

sieht aus wie GORM können die Serializer für die 'Object' Daten nicht gefunden tippt und schlägt lautlos – injecteer

+0

Siehe [this] (https://github.com/grails/grails-core/issues/10692) Fehlerbericht auf GitHub. –

Antwort

0

Ich habe einige Debugging und ich fand heraus, dass, wenn ein Feld akzeptiert ein Objekt, Grals Framework nicht Datenbindung auf diese Eigenschaft.

Genauer gesagt, das Dog # -Namensfeld gehört nicht zur Whitelist von Eigenschaften, wenn es als Object deklariert ist.

Deshalb funktioniert das nicht.

Wenn Sie debuggen möchten, finden Sie in der

grails.web.databinding.DataBindingUtils#getBindingIncludeList(final Object object) 

Wenn Sie dort einen Haltepunkt setzen, werden Sie sehen, wie Grails die weiße Liste von Eigenschaften erzeugt.

Ich denke, das macht sehr viel Sinn, da es auf Sicherheit bezogen ist!

Weitere Informationen here

Wenn Sie möchten, binden auf einem Objektfeld Sie doch kann dieser Code helfen:

class Dog { 
    Object name 
    static constraints = { 
    name(bindable: true) 
    } 
} 
Verwandte Themen