класс данных kotlin + проверка бонуса jsr 303

Я пытаюсь заставить Котлина работать с валидацией jsr 303 в проекте Spring-Data-Rest.

Учитывая следующую декларацию класса данных:

@Entity data class User( @Id @GeneratedValue(strategy = javax.persistence.GenerationType.AUTO) var id: Long? = null, @Size(min=5, max=15) val name: String ) 

Аннотация @Size не имеет никакого эффекта здесь, что позволяет мне сохранять пользователя с именем 1 символ.
Он отлично работает при выполнении того же примера, но в классе Java вместо Kotlin.

Это заставляет меня думать о проблеме Котлина.

Заранее спасибо за вашу помощь !

Вам нужно использовать целевые объекты целевого использования Annotation, поскольку значение по умолчанию для свойства, объявленного в конструкторе, предназначено для нацеливания аннотации на параметр конструктора, а не на getter (что будет видно на совместимых с JavaBeans узлах) при наличии нескольких доступных вариантов.

 @Entity data class User( @Id @GeneratedValue(strategy = javax.persistence.GenerationType.AUTO) var id: Long? = null, @get:Size(min=5, max=15) // added annotation use-site target here val name: String ) 

property target из документов Kotlin может выглядеть заманчивым, но его можно увидеть только из Kotlin, а не из Java. Обычно get выполняет трюк, и он не нужен в set компонентов.

Документы описывают процесс следующим образом:

Если вы не укажете цель использования сайта, цель будет выбрана в соответствии с аннотацией @Target используемой аннотации. Если имеется несколько применимых целей, используется первая применимая цель из следующего списка:

  • пары
  • имущество
  • поле

И аннотация @Size :

 @Target(value={METHOD,FIELD,ANNOTATION_TYPE,CONSTRUCTOR,PARAMETER}) 

Поэтому, поскольку PARAMETER является допустимой мишенью и доступны несколько целей (параметр, поле, метод [get / set]), он выбирает PARAMETER который не является тем, что вы хотите. Поэтому для хоста JavaBean, чтобы увидеть свойство, он будет искать getter (свойства определяются с помощью getter / setter, а не поля поддержки).

В одном из примеров Java это показывает:

 public class Book { private String title; private String description; // ... @NotEmpty(groups={FirstLevelCheck.class, Default.class}) @Size(max=30) public String getTitle() { return title; } // ... } 

Что соответствует нашему использованию наличия на геттере. Если бы это было на поле, как показано в некоторых аннотациях проверки, см. Цель использования целевого сайта. Или, если поле также должно быть общедоступным, см. Аннотацию @JvmField в Котлине.

ПРИМЕЧАНИЕ. Я не изменял аннотации JPA, вы должны проверить их, если у вас есть проблемы.

Intereting Posts
Удалить слушателя Firebase не работает Получение ошибки «Несовместимые типы» при использовании кода, сгенерированного из класса данных Kotlin Создание карты со значениями, содержащими дженерики Вложенные многозадачи в Котлине Является ли ключевое слово lateinit ненужным? Как сериализовать карту в строку JSON через JSON.stringify в kotlin JS? Объявление байта в Kotlin делает ошибку времени компиляции «Целочисленный литерал не соответствует ожидаемому типу Byte» window.reload в Webview Наследование дженериков Котлина – несоответствие типов Kotlin: Как я могу получить фактический общий тип T в OneClass <T> во время выполнения Назначение значений ArrayList с помощью mapTo kotlin, как упростить передачу параметров в конструктор базового класса? Может ли поле быть перенесено в не нулевую версию? Java Interop: применить @JvmName к getters свойств в интерфейсе или абстрактном классе Почему Котлин держит MetaData в файле класса Kotlin?