2016-04-09 17 views
6

Ich habe eine Einheit:Kotlin und @Valid Frühling Anmerkung

class SomeInfo(
     @NotNull @Pattern(regexp = Constraints.EMAIL_REGEX) var value: String) { 
    var id: Long? = null 
} 

und Controller-Methode:

@RequestMapping(value = "/some-info", method = RequestMethod.POST) 
public Id create(@Valid @RequestBody SomeInfo someInfo) { 
     ... 
    } 

@Valid Annotation funktioniert nicht.

Es scheint Frühling einen Standard-parameterlosen Konstruktor und Phantasie Code oben wird in etwas hässlich (aber funktioniert) wie folgt benötigt:

class SomeInfo() { 

    constructor(value: String) { 
      this.value = value 
     } 

     @NotNull @Pattern(regexp = Constraints.EMAIL_REGEX) 
     lateinit var value: String 

     var id: Long? = null 
    } 

Jede gute Praxis ist es weniger wortreich zu machen?

Danke.

+0

Sie sagen, Spring benötigt einen parameterlosen Konstruktor, aber der Arbeitscode hat immer noch nur einen Konstruktor für einen Parameter. – Michael

+0

Ja, du hast Recht. Bearbeitet. – user2138356

Antwort

17

Scheint, dass Spring diese Annotationen auf ein Feld anwenden muss. Aber Kotlin wird diese Annotationen auf den Konstruktorparameter anwenden. Verwenden Sie field: Specifier, wenn Sie eine Annotation anwenden, damit sie auf ein Feld angewendet wird. Der folgende Code sollte für Sie in Ordnung sein.

class SomeInfo(
    @field:NotNull 
    @field:Pattern(regexp = Constraints.EMAIL_REGEX) 
    var value: String 
) { 
    var id: Long? = null 
} 
+0

Neugierig, wie kommst du darauf? Reflexion über das resultierende Datenmodell? – Scott

3

Als Alternative zu Michals Antwort funktioniert auch das Kommentieren des Getters.

Der nervige Teil ist, dass @get nicht verwendet: oder @field: wird den Konstruktor Parameter kommentieren. Dies ist immer noch gültig Kotlin-Code (damit Sie keine Fehlermeldung erhalten). In diesen Anwendungsfällen ist es einfach nutzlos.

+0

Ich habe es versucht und habe es nicht funktioniert. Benötige ich eine zusätzliche Konfiguration oder funktioniert es? – ttt

+0

Nein, sollte out of the box funktionieren. Ich benutze es in einem Frühlingsprojekt, also habe ich das Spring-Kotlin-Paket, das Spring-Klassen als automatisch "offene" Klassen und "Open-Methoden" als Spring-Anmerkungen definiert. Das könnte ein Site-Effekt sein, der einsetzt. –