Não foi possível criar meta-anotação para @RequestBody no Springboot

Aug 15 2020

Eu quero criar uma meta-anotação, chamada @QueryRequest, para Spring, @RequestBodycomo mostrado abaixo.

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

No entanto, ele lança um erro de compilação chamado, java: annotation type not applicable to this kind of declaration

Quando eu pesquisei na internet, ele me diz para verificar o @Targettipo correto . De qualquer forma, como você já pode ver meus valores @Targete @Retention, eles são iguais aos do Spring @RequestBody, mas ainda acima do erro é lançado.

Eu criei com sucesso meta-anotações para @Target=ElementType.METHODou ElementType.TYPEtipos, mas não consegui fazer o trabalho acima da anotação.

Alguém sabe o que realmente está errado com a meta-anotação acima?

Respostas

1 DanielJacob Aug 16 2020 at 02:15

Como @RequestBody é anotado, @Target(ElementType.PARAMETER)você só pode adicionar essa anotação em um parâmetro. Aqui você está tentando aplicar a anotação em uma anotação. Para conseguir isso, @RequestBodydeve ter sido anotado com @Target(ElementType.ANNOTATION_TYPE)ou com @Target(ElementType.TYPE).

Por exemplo, este código não funcionará porque você não pode anotar QueryRequest em uma anotação:

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

No entanto, isso funcionará, porque você está permitindo que QueryResult seja colocado em uma anotação

@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 explicou por que isso acontece com um exemplo.

Além disso, qualquer pessoa que esteja procurando uma solução alternativa deve ler esta resposta como @Michiel mencionado acima.https://stackoverflow.com/a/40861154/2148365