Ich verwende Play Framework, um einen Server zu entwickeln. In einigen meiner Methoden muss ich einige vorhergehende Maßnahmen durchführen (im Grunde Eingangsüberprüfung), also denke ich, der beste Weg, dies zu tun ist Action Composition.Wiederholen Sie die gleiche Aktion, wenn Sie in Play Framework Kompositionsaktionen ausführen
kann ich mehrere Anmerkungen verwenden, ohne Problem
@Action1 // <---------------------------------------- This action is executed
@Action2(value = "someValue") // <------------------- This action is executed
public CompletionStage<Result> doSomething() {
...
}
aber sobald ich versuche, eine dieser Aktionen zu wiederholen, dass konkrete Maßnahmen nicht ausgeführt:
@Action1 // <---------------------------------------- This action is executed
@Action2(value = "someValue") // <------------------- This action is not executed
@Action2(value = "someOtherValue") // <-------------- This action is not executed
public CompletionStage<Result> doSomething() {
...
}
Meine Action1
Anmerkung sieht aus wie die VerboseAnnotation
der Play Framework example also ich denke nicht, dass es wert ist, es hier zu schreiben. Da meine Action2
Anmerkung wiederholt werden kann, habe ich eine RepeatableAction2
Anmerkung wie folgt erklärt:
@With(Action2Impl.class)
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Repeatable(value = RepeatableAction2.class)
public @interface Action2 {
String value();
}
Das Verfahren ist korrekt kommentiert:
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface RepeatableAction2 {
Action2[] value() default {};
}
und Action2
sieht wie folgt aus. Als ich hinzufügen:
for (Method m : Application.class.getDeclaredMethods()) {
RequiredJsonValues reqs = m.getAnnotation(RequiredJsonValues.class);
for (RequiredJsonValue req : reqs.value()) {
System.out.println("Method: " + m + " annotation: " + req);
}
}
zu Beginn des Verfahrens erhalte ich
Method: public java.util.concurrent.CompletionStage controllers.SomeController.doSomething() annotation: @util.Action2(value=someValue)
Method: public java.util.concurrent.CompletionStage controllers.SomeController.doSomething() annotation: @util.Action2(value=someOtherValue)
Also, was mache ich falsch? Gibt es eine andere Möglichkeit, dieselbe Aktion mehrmals mit unterschiedlichen Werten zu verketten?