2016-04-09 13 views
6

Mam podmiot: metodęKotlin i @Valid Wiosna adnotacja

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

A Kontroler:

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

@Valid adnotacja nie działa.

Wydaje Wiosna potrzebuje domyślnego konstruktora bez parametrów i ozdobne powyższy kod staje się czymś brzydkim (roboczy), ale tak:

class SomeInfo() { 

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

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

     var id: Long? = null 
    } 

Każda dobra praktyka, aby uczynić go mniej rozwlekły?

Dzięki.

+0

Mówisz, że Spring potrzebuje konstruktora bez parametrów, ale działający kod ma tylko jeden konstruktor parametru. – Michael

+0

Tak, masz rację. Edytowane. – user2138356

Odpowiedz

17

Wydaje się, że Spring potrzebuje tych adnotacji do zastosowania na polu. Ale Kotlin zastosuje te adnotacje do parametru konstruktora. Użyj specyfikatora field: podczas stosowania adnotacji, aby zastosować ją do pola. Poniższy kod powinien działać dobrze dla Ciebie.

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

Co ciekawe, jak to wymyśliłeś? Refleksja nad powstałym modelem danych? – Scott

3

Jako alternatywa dla odpowiedzi Michała, adnotacja gettera również działa.

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

Denerwujące jest to, że nie używając @get: lub @field: będzie adnotować parametr konstruktora. To jest wciąż poprawny kod kotlina (więc nie otrzymasz błędu). W takich przypadkach jest to bezużyteczne.

+0

Próbowałem go i nie działało. Czy potrzebuję dodatkowej konfiguracji lub po prostu działa? – ttt

+0

Nie, powinien działać po wyjęciu z pudełka. Używam go w projekcie wiosennym, więc mam pakiet wiosna-kotlin, który w zasadniczy sposób modyfikuje klasy sprężynowe, aby były automatycznie "otwartymi" klasami i "otwartymi metodami", jeśli są wiosenne. To może być efekt witryny, który się pojawia. –