Clase de datos kotlin + validation de frijol jsr 303

Intento que Kotlin trabaje con la validation de jsr 303 en un proyecto de spring de reposo de datos.

Dada la siguiente declaracion de class de datos:

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

La anotación @Size no tiene ningún efecto aquí, lo que me permite save un usuario con un nombre de 1 carácter.
Funciona bien al ejecutar el mismo ejemplo, pero en una class de Java en lugar de Kotlin.

Esto me hace pensar en un problema de Kotlin.

Gracias de antemano por su ayuda!

Debe usar los objectives del sitio de uso de anotación ya que el valor pnetworkingeterminado para una propiedad declarada en el constructor es apuntar a la anotación en el parámetro constructor en lugar del getter (que será visto por los hosts compatibles con JavaBeans) cuando hay múltiples opciones disponibles.

 @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 ) 

El objective de property de los documentos de Kotlin puede parecer tentador, pero solo se puede ver desde Kotlin y no desde Java. Por lo general, get el truco, y no es necesario en el set frijoles.

Los documentos describen el process como:

Si no especifica un objective de sitio de uso, el objective se elige de acuerdo con la anotación @Target de la anotación que se utiliza. Si hay varios objectives aplicables, se utiliza el primer objective aplicable de la siguiente list:

  • param
  • propiedad
  • campo

Y la anotación @Size es:

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

Por lo tanto, dado que PARAMETER es un objective válido, y hay varios objectives disponibles (parámetro, campo, método [get / set]), elige PARAMETER que no es lo que usted desea. Por lo tanto, para que un host JavaBean vea la propiedad, searchá el getter (las properties están definidas por el getter / setter y no el campo de respaldo).

En una de las muestras de Java , muestra:

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

Lo que coincide con nuestro uso de tenerlo en el getter. Si fuera a estar en el campo como muestran algunas de las annotations de validation, consulte el objective del sitio de uso de field . O si el campo también debe ser de acceso público, consulte la anotación @JvmField en Kotlin.

NOTA: No modifiqué las annotations de JPA, debe verificarlas si tiene problemas.