複数がある場合、コンストラクタで宣言されたプロパティのデフォルトはコンストラクタパラメータの代わりに、(JavaBeansの対応のホストが見られます)ゲッターに注釈を標的とすることであるので、あなたはAnnotation use-site targetsを使用する必要があります利用可能なオプション。 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
)
Kotlinのドキュメントからproperty
ターゲットは魅力的に見えるかもしれないが、それだけでKotlinはなく、Javaから見ることができます。通常はget
がトリックを行い、それは豆の上には必要ありませんset
。
ドキュメントのようにプロセスを説明します。あなたは利用サイトのターゲットを指定しない場合
、ターゲットが使用されている注釈の@Target注釈に従って選択されます。
そして@Size
注釈は次のとおりです:複数の適用対象がある場合は、以下のリストからの最初の適用対象が使用され
@Target(value={METHOD,FIELD,ANNOTATION_TYPE,CONSTRUCTOR,PARAMETER})
したがって、PARAMETER
は有効なターゲットであり、複数のターゲットが利用可能です(パラメータ、フィールド、メソッド[取得/設定])。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を参照してください。
注:他人からノートに述べたように、それは新しいオブジェクトのために取得した場合と同じに存在しないので、彼らが自動生成されたIDを使用している場合、あなたはおそらくエンティティのdata
クラスを使用していない検討すべきですオブジェクト; data
クラスは、equals
とhashCode
を生成し、含まないフィールドをすべて含むようにします。 Hibernate docsからこれに関するガイダンスを読むことができます。
注釈の対象は何ですか?コンストラクタパラメータまたはフィールド? – voddan