No se puede crear una metaanotación para @RequestBody en Springboot

Aug 15 2020

Quiero crear una meta-anotación, llamada @QueryRequest, para Spring @RequestBodycomo 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 @Targettipo correcto . De todos modos, como ya puede ver los valores my @Targety @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.METHODo ElementType.TYPEtipos, 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

1 DanielJacob Aug 16 2020 at 02:15

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, @RequestBodydeberí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
isuru89 Aug 16 2020 at 10:19

@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