Impossible de créer une méta-annotation pour @RequestBody dans Springboot

Aug 15 2020

Je veux créer une méta-annotation, appelée @QueryRequest, pour Spring @RequestBodycomme indiqué ci-dessous.

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

Cependant, il génère une erreur de compilation appelée, java: annotation type not applicable to this kind of declaration

Lorsque j'ai recherché sur Internet, il me dit de vérifier le @Targettype correct . Quoi qu'il en soit, comme vous pouvez déjà voir mes valeurs @Targetet @Retention, elles sont identiques à celles de Spring @RequestBody, mais l'erreur est toujours au-dessus.

J'ai créé avec succès des méta-annotations pour @Target=ElementType.METHODou des ElementType.TYPEtypes, mais je ne pouvais pas travailler au-dessus de l'annotation.

Quelqu'un sait-il ce qui ne va pas avec la méta-annotation ci-dessus?

Réponses

1 DanielJacob Aug 16 2020 at 02:15

Puisque @RequestBody est annoté, @Target(ElementType.PARAMETER)vous ne pouvez ajouter cette annotation qu'à un paramètre. Ici, vous essayez d'appliquer l'annotation sur une annotation. Pour y parvenir, cela @RequestBodyaurait dû être annoté avec @Target(ElementType.ANNOTATION_TYPE)ou avec @Target(ElementType.TYPE).

Par exemple, ce code ne fonctionnera pas car vous ne pouvez pas annoter QueryRequest sur une annotation:

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

Cependant, cela fonctionnera, car vous autorisez QueryResult à être placé sur une annotation

@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 a expliqué pourquoi cela se produit avec un exemple.

De plus, toute personne à la recherche d' une solution de contournement doit lire cette réponse comme @Michiel mentionné ci-dessus.https://stackoverflow.com/a/40861154/2148365