No se puede crear una metaanotación para @RequestBody en Springboot
Quiero crear una meta-anotación, llamada @QueryRequest
, para Spring @RequestBody
como se muestra a continuación.
@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
@RequestBody
public @interface QueryRequest {
}
Sin embargo, arroja un error de compilación llamado, java: annotation type not applicable to this kind of declaration
Cuando busqué en Internet, me dice que verifique el @Target
tipo correcto . De todos modos, como ya puede ver los valores my @Target
y @Retention
, son los mismos que los de Spring @RequestBody
, pero todavía se produce un error superior.
He creado con éxito meta-anotaciones para @Target=ElementType.METHOD
o ElementType.TYPE
tipos, pero no pude hacer funcionar la anotación anterior.
¿Alguien sabe qué es lo que está realmente mal con la meta-anotación anterior?
Respuestas
Dado que @RequestBody está anotado @Target(ElementType.PARAMETER)
, solo puede agregar esta anotación en un parámetro. Aquí está intentando aplicar la anotación en una anotación. Para lograrlo, @RequestBody
debería haberse anotado con @Target(ElementType.ANNOTATION_TYPE)
o con @Target(ElementType.TYPE)
.
Por ejemplo, este código no funcionará porque no puede anotar QueryRequest en una anotación:
@Target(ElementType.PARAMETER)
@Documented
@Retention(RetentionPolicy.RUNTIME)
public @interface QueryRequest {
}
@Target(ElementType.ANNOTATION_TYPE)
@Documented
@Retention(RetentionPolicy.RUNTIME)
@QueryRequest
@interface NextQueryRequest
Sin embargo, esto funcionará, porque está permitiendo que QueryResult se coloque en una anotación
@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 ha explicado por qué sucede esto con un ejemplo.
Además, cualquiera que esté buscando una solución alternativa debe leer esta respuesta como @Michiel mencionado anteriormente.https://stackoverflow.com/a/40861154/2148365