Tidak dapat membuat meta-anotasi untuk @RequestBody di Springboot
Saya ingin membuat meta-annotation, disebut @QueryRequest
, untuk Spring @RequestBody
seperti yang ditunjukkan di bawah ini.
@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
@RequestBody
public @interface QueryRequest {
}
Namun, ini melontarkan kesalahan kompilasi yang disebut, java: annotation type not applicable to this kind of declaration
Ketika saya mencari di internet, itu memberitahu saya untuk memverifikasi @Target
jenis yang benar . Bagaimanapun, karena Anda sudah dapat melihat my @Target
dan @Retention
nilai - nilai, mereka sama seperti Spring @RequestBody
, tetapi kesalahan masih di atas dilemparkan.
Saya telah berhasil membuat meta-annotation for @Target=ElementType.METHOD
or ElementType.TYPE
types, tetapi saya tidak dapat membuat anotasi di atas anotasi bekerja.
Ada yang tahu apa yang salah dengan meta-annotation di atas?
Jawaban
Karena @RequestBody dianotasi, @Target(ElementType.PARAMETER)
Anda hanya dapat menambahkan anotasi ini pada parameter. Di sini Anda mencoba menerapkan anotasi pada anotasi. Untuk mencapai itu @RequestBody
seharusnya diberi anotasi dengan @Target(ElementType.ANNOTATION_TYPE)
atau dengan @Target(ElementType.TYPE)
.
Misalnya, kode ini tidak akan berfungsi karena Anda tidak dapat membuat anotasi QueryRequest pada anotasi:
@Target(ElementType.PARAMETER)
@Documented
@Retention(RetentionPolicy.RUNTIME)
public @interface QueryRequest {
}
@Target(ElementType.ANNOTATION_TYPE)
@Documented
@Retention(RetentionPolicy.RUNTIME)
@QueryRequest
@interface NextQueryRequest
Namun ini akan berhasil, karena Anda mengizinkan QueryResult untuk diletakkan di anotasi
@Target(ElementType.TYPE)
@Documented
@Retention(RetentionPolicy.RUNTIME)
public @interface QueryRequest {
}
@Target(ElementType.ANNOTATION_TYPE)
@Documented
@Retention(RetentionPolicy.RUNTIME)
@QueryRequest
@interface NextQueryRequest
@Target(ElementType.ANNOTATION_TYPE)
@Documented
@Retention(RetentionPolicy.RUNTIME)
public @interface QueryRequest {
}
@Target(ElementType.ANNOTATION_TYPE)
@Documented
@Retention(RetentionPolicy.RUNTIME)
@QueryRequest
@interface NextQueryRequest
@Daniel telah menjelaskan mengapa ini terjadi dengan sebuah contoh.
Juga, siapa pun yang mencari solusi harus membaca jawaban ini sebagai @Michiel yang disebutkan di atas.https://stackoverflow.com/a/40861154/2148365