Meta-Annotation für @RequestBody in Springboot kann nicht erstellt werden

Aug 15 2020

Ich möchte eine Meta-Annotation @QueryRequestfür Spring erstellen , @RequestBodywie unten gezeigt.

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

Es wird jedoch ein Kompilierungsfehler namens " java: annotation type not applicable to this kind of declaration

Wenn ich im Internet gesucht habe, werde ich aufgefordert, den richtigen @TargetTyp zu überprüfen . Wie Sie bereits sehen können, sind meine @Targetund meine @RetentionWerte dieselben wie die von Spring @RequestBody, aber es wird immer noch ein Fehler ausgelöst.

Ich habe erfolgreich Meta-Annotationen für @Target=ElementType.METHODoder ElementType.TYPETypen erstellt, konnte jedoch keine Arbeit über Annotationen ausführen.

Weiß jemand, was mit der obigen Meta-Annotation eigentlich falsch ist?

Antworten

1 DanielJacob Aug 16 2020 at 02:15

Da @RequestBody mit Anmerkungen versehen ist @Target(ElementType.PARAMETER), können Sie diese Anmerkung nur einem Parameter hinzufügen. Hier versuchen Sie, die Anmerkung auf eine Anmerkung anzuwenden. Um dies zu erreichen, @RequestBodysollte mit @Target(ElementType.ANNOTATION_TYPE)oder mit kommentiert worden sein @Target(ElementType.TYPE).

Beispielsweise funktioniert dieser Code nicht, da Sie QueryRequest nicht mit Anmerkungen zu einer Anmerkung versehen können:

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

Dies funktioniert jedoch, da Sie zulassen, dass QueryResult in eine Anmerkung eingefügt wird

@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 hat anhand eines Beispiels erklärt, warum dies geschieht.

Jeder, der nach einer Problemumgehung sucht, sollte diese Antwort als @Michiel lesen, wie oben erwähnt.https://stackoverflow.com/a/40861154/2148365