Tidak dapat membuat meta-anotasi untuk @RequestBody di Springboot

Aug 15 2020

Saya ingin membuat meta-annotation, disebut @QueryRequest, untuk Spring @RequestBodyseperti 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 @Targetjenis yang benar . Bagaimanapun, karena Anda sudah dapat melihat my @Targetdan @Retentionnilai - nilai, mereka sama seperti Spring @RequestBody, tetapi kesalahan masih di atas dilemparkan.

Saya telah berhasil membuat meta-annotation for @Target=ElementType.METHODor ElementType.TYPEtypes, tetapi saya tidak dapat membuat anotasi di atas anotasi bekerja.

Ada yang tahu apa yang salah dengan meta-annotation di atas?

Jawaban

1 DanielJacob Aug 16 2020 at 02:15

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 @RequestBodyseharusnya 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
isuru89 Aug 16 2020 at 10:19

@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