Невозможно создать мета-аннотацию для @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