Meta-Annotation für @RequestBody in Springboot kann nicht erstellt werden
Ich möchte eine Meta-Annotation @QueryRequest
für Spring erstellen , @RequestBody
wie 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 @Target
Typ zu überprüfen . Wie Sie bereits sehen können, sind meine @Target
und meine @Retention
Werte dieselben wie die von Spring @RequestBody
, aber es wird immer noch ein Fehler ausgelöst.
Ich habe erfolgreich Meta-Annotationen für @Target=ElementType.METHOD
oder ElementType.TYPE
Typen erstellt, konnte jedoch keine Arbeit über Annotationen ausführen.
Weiß jemand, was mit der obigen Meta-Annotation eigentlich falsch ist?
Antworten
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, @RequestBody
sollte 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
@ 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