Невозможно создать мета-аннотацию для @RequestBody в Springboot
Я хочу создать мета-аннотацию с именем @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
, но не смог работать над аннотацией.
Кто-нибудь знает, что на самом деле не так с приведенной выше мета-аннотацией?
Ответы
Поскольку @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
@Daniel объяснил, почему это происходит, на примере.
Кроме того, любой, кто ищет обходной путь , должен прочитать этот ответ, как упоминалось выше @Michiel.https://stackoverflow.com/a/40861154/2148365