Não foi possível criar meta-anotação para @RequestBody no Springboot
Eu quero criar uma meta-anotação, chamada @QueryRequest
, para Spring, @RequestBody
como 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 @Target
tipo correto . De qualquer forma, como você já pode ver meus valores @Target
e @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.METHOD
ou ElementType.TYPE
tipos, 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
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, @RequestBody
deve 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
@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