Невозможно создать мета-аннотацию для @RequestBody в Springboot

Aug 15 2020

Я хочу создать мета-аннотацию с именем @QueryRequestдля Spring, @RequestBodyкак показано ниже.

@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
@RequestBody
public @interface QueryRequest {
}

Однако он выдает ошибку компиляции, называемуюjava: annotation type not applicable to this kind of declaration

Когда я искал в Интернете, он говорит мне проверить правильный @Targetтип. В любом случае, как вы уже можете видеть, мои значения @Targetи @Retention, они такие же, как и у Spring @RequestBody, но по-прежнему возникает ошибка выше.

Я успешно создал мета-аннотации для типов @Target=ElementType.METHODили ElementType.TYPE, но не смог работать над аннотацией.

Кто-нибудь знает, что на самом деле не так с приведенной выше мета-аннотацией?

Ответы

1 DanielJacob Aug 16 2020 at 02:15

Поскольку @RequestBody аннотирован @Target(ElementType.PARAMETER), вы можете добавить эту аннотацию только к параметру. Здесь вы пытаетесь применить аннотацию к аннотации. Для этого @RequestBodyнужно было аннотировать с помощью @Target(ElementType.ANNOTATION_TYPE)или с помощью @Target(ElementType.TYPE).

Например, этот код не будет работать, потому что вы не можете аннотировать QueryRequest к аннотации:

@Target(ElementType.PARAMETER)
@Documented
@Retention(RetentionPolicy.RUNTIME)
public @interface QueryRequest {
}
@Target(ElementType.ANNOTATION_TYPE)
@Documented
@Retention(RetentionPolicy.RUNTIME)
@QueryRequest
@interface NextQueryRequest

Однако это будет работать, потому что вы разрешаете помещать QueryResult в аннотацию.

@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 объяснил, почему это происходит, на примере.

Кроме того, любой, кто ищет обходной путь , должен прочитать этот ответ, как упоминалось выше @Michiel.https://stackoverflow.com/a/40861154/2148365