Nie można utworzyć meta-adnotacji dla @RequestBody w Springboot
Chcę utworzyć meta-adnotację o nazwie @QueryRequest
Spring, @RequestBody
jak pokazano poniżej.
@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
@RequestBody
public @interface QueryRequest {
}
Jednak zgłasza błąd kompilacji o nazwie, java: annotation type not applicable to this kind of declaration
Kiedy szukałem w Internecie, mówi mi, żebym zweryfikował właściwy @Target
typ. Zresztą jak już widać moje @Target
i @Retention
wartości są takie same jak Spring @RequestBody
, ale wciąż powyżej wyrzucany jest błąd.
Pomyślnie utworzyłem meta-adnotacje dla @Target=ElementType.METHOD
lub ElementType.TYPE
typów, ale nie mogłem pracować nad adnotacją.
Czy ktoś wie, co właściwie jest nie tak z powyższą meta-adnotacją?
Odpowiedzi
Ponieważ @RequestBody jest opatrzony adnotacją @Target(ElementType.PARAMETER)
, możesz dodać tę adnotację tylko do parametru. Tutaj próbujesz zastosować adnotację do adnotacji. Aby to osiągnąć, @RequestBody
powinno zostać opatrzone adnotacją z @Target(ElementType.ANNOTATION_TYPE)
lub z @Target(ElementType.TYPE)
.
Na przykład ten kod nie zadziała, ponieważ nie możesz dodać adnotacji QueryRequest do adnotacji:
@Target(ElementType.PARAMETER)
@Documented
@Retention(RetentionPolicy.RUNTIME)
public @interface QueryRequest {
}
@Target(ElementType.ANNOTATION_TYPE)
@Documented
@Retention(RetentionPolicy.RUNTIME)
@QueryRequest
@interface NextQueryRequest
Jednak to zadziała, ponieważ zezwalasz na umieszczenie QueryResult w adnotacji
@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 wyjaśnił, dlaczego tak się dzieje, na przykładzie.
Ponadto każdy, kto szuka obejścia, powinien przeczytać tę odpowiedź jako wspomnianą powyżej @Michiel.https://stackoverflow.com/a/40861154/2148365