Impossible de créer une méta-annotation pour @RequestBody dans Springboot
Je veux créer une méta-annotation, appelée @QueryRequest
, pour Spring @RequestBody
comme 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 @Target
type correct . Quoi qu'il en soit, comme vous pouvez déjà voir mes valeurs @Target
et @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.METHOD
ou des ElementType.TYPE
types, 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
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 @RequestBody
aurait 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
@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