È necessario utilizzare Annotation use-site targets poiché il valore predefinito per una proprietà dichiarata nel costruttore è quello di colpire l'annotazione sul costruttore parametro al posto del getter (che sarà visto da JavaBeans host compatibili) quando ci sono più opzioni disponibili. Anche l'utilizzo di una classe data
potrebbe essere inappropriato qui (vedere la nota alla fine).
@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
)
Il property
bersaglio dalla documentazione Kotlin può sembrare allettante, ma può essere visto solo da Kotlin e non Java. Solitamente lo get
fa il trucco e non è necessario sul bean set
.
La documentazione descrivono il processo come:
Se non si specifica un target uso in loco, l'obiettivo viene scelto in base al l'annotazione @Target dell'annotazione in uso. Se ci sono più bersagli applicabili, il primo obiettivo applicabile dal seguente elenco viene utilizzato:
E l'annotazione @Size
è:
@Target(value={METHOD,FIELD,ANNOTATION_TYPE,CONSTRUCTOR,PARAMETER})
Pertanto dal PARAMETER
è un target valido e sono disponibili più destinazioni (parametro, campo, metodo [get/set]) che sceglie PARAMETER
che non è ciò che si desidera. Pertanto, affinché un host JavaBean visualizzi la proprietà, cercherà il getter (le proprietà sono definite dal getter/setter e non dal campo di supporto).
In uno dei Java samples, mostra:
public class Book {
private String title;
private String description;
// ...
@NotEmpty(groups={FirstLevelCheck.class, Default.class})
@Size(max=30)
public String getTitle() {
return title;
}
// ...
}
che corrisponde il nostro utilizzo di avere sul getter. Se dovesse essere sul campo come mostrano alcune annotazioni di convalida, vedere la destinazione del sito di utilizzo field
. Oppure se il campo deve essere accessibile al pubblico, consulta lo @JvmField annotation in Kotlin.
NOTA:Come accennato nelle note dagli altri, si dovrebbe probabilmente prendere in considerazione non utilizzando una classe data
per le entità se usano un ID generato automaticamente dal momento che non esisterà per i nuovi oggetti lo stesso che per il recuperati oggetti; e una classe data
genererà equals
e hashCode
per includere tutti i campi compresi quelli che non dovrebbe. Puoi leggere le indicazioni a riguardo dal Hibernate docs.
quale dovrebbe essere l'obiettivo dell'annotazione? Parametro costruttore o campo? – voddan