Nie można utworzyć meta-adnotacji dla @RequestBody w Springboot

Aug 15 2020

Chcę utworzyć meta-adnotację o nazwie @QueryRequestSpring, @RequestBodyjak 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 @Targettyp. Zresztą jak już widać moje @Targeti @Retentionwartości są takie same jak Spring @RequestBody, ale wciąż powyżej wyrzucany jest błąd.

Pomyślnie utworzyłem meta-adnotacje dla @Target=ElementType.METHODlub ElementType.TYPEtypów, ale nie mogłem pracować nad adnotacją.

Czy ktoś wie, co właściwie jest nie tak z powyższą meta-adnotacją?

Odpowiedzi

1 DanielJacob Aug 16 2020 at 02:15

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ąć, @RequestBodypowinno 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
isuru89 Aug 16 2020 at 10:19

@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