您需要使用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