您需要使用Annotation use-site targets因爲默認的構造函數聲明的屬性是針對在構造函數中的註釋參數代替吸氣(將由JavaBeans的兼容主機上看到的),當有多個可用選項。同樣使用data
課程可能不合適(請參閱末尾的註釋)。
@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
目標可能看起來很誘人,但它只能從科特林而不是Java見過。通常get
會訣竅,並且它在豆set
上不需要。
該文檔描述的過程:
如果不指定使用站點內的目標,目標根據正在使用的註釋的@Target註解選擇。如果有多個適用對象,從下面的列表中的第一個適用的目標時:
而且@Size
註釋:
@Target(value={METHOD,FIELD,ANNOTATION_TYPE,CONSTRUCTOR,PARAMETER})
因此,自PARAMETER
是一個有效的目標,並且有多個目標可用(參數,字段,方法[get/set])它選擇了PARAMETER
這不是你想要的。因此,對於JavaBean主機來查看屬性,它將查找getter(屬性由getter/setter而不是後臺字段定義)。
在Java samples之一,它表明:
public class Book {
private String title;
private String description;
// ...
@NotEmpty(groups={FirstLevelCheck.class, Default.class})
@Size(max=30)
public String getTitle() {
return title;
}
// ...
}
其中我們有它的吸氣劑的使用相匹配。如果它像在某些驗證註釋中顯示的那樣在現場,請參閱field
使用場所目標。或者,如果該字段也必須公開訪問,請參閱Kotlin中的@JvmField annotation。
注:正如別人在筆記中提到,您應該可能考慮不使用data
類實體,如果他們使用一個自動生成的ID,因爲它不會爲新對象的相同檢索存在對象;並且data
課程將生成equals
和hashCode
以包括所有字段,包括它不應該包含的字段。你可以從Hibernate docs閱讀關於這方面的指導。
註解的目標應該是什麼?構造函數參數還是字段? – voddan