2016-04-09 5 views
6

У меня есть сущность: методКотлин и @Valid Spring аннотацию

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

И контроллер:

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

@Valid аннотаций не работает.

кажется Spring нуждается в конструктор по умолчанию без параметров и фантазии код, приведенный выше становится в чем-то уродливым (но рабочий), как это:

class SomeInfo() { 

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

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

     var id: Long? = null 
    } 

Любая хорошая практика, чтобы сделать его менее многословным?

Спасибо.

+0

Вы говорите, что Spring нужен конструктор без параметров, но рабочий код по-прежнему имеет только один конструктор параметров. – Michael

+0

Да, вы правы. Ред. – user2138356

ответ

17

Кажется, что Spring нужны эти аннотации для применения к полю. Но Котлин применит эти аннотации к параметру конструктора. Используйте спецификатор field: при применении аннотации, чтобы оно применимо к полю. Следующий код должен отлично работать для вас.

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

Любопытно, как вы это придумали? Отражение результирующей модели данных? – Scott

3

В качестве альтернативы ответа Михала, аннотирование геттера также работает.

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

Раздражает часть, которая не используется @get: или @field: аннотирует параметр конструктора. Это по-прежнему действительный код kotlin (так что вы не получите ошибку). Это бесполезно в этих случаях использования.

+0

Я пробовал и не работал. Нужна ли мне дополнительная настройка или она просто работает? – ttt

+0

Нет, должен работать из коробки. Я использую его в весеннем проекте, поэтому у меня есть пакет spring-kotlin, который существенно изменяет весенние классы, чтобы автоматически «открывать» классы и «открывать методы», если они весны аннотированы. Это может быть эффект сайта, который срабатывает. –

Смежные вопросы