Основная проблема с этим понятием является тот факт, что PARAMS аннотацию должен быть постоянной, @see topic about this так что вы будете не можете использовать userId
, как показано в коде. Вместо этого вы можете создать аннотацию, которая читает сам контекст, а затем проанализировать URI, чтобы получить идентификатор пользователя. то есть:
приложение/myannotations/MyAnnotations.class
package myannotations;
import play.mvc.With;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
public class MyAnnotations {
@With(ValidateUserIdAction.class)
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface ValidateUserId {
String patternToReplace();
String redirectTo();
}
}
приложение/myannotations/ValidateUserIdAction.class
package myannotations;
import play.mvc.Action;
import play.mvc.Http;
import play.mvc.Result;
import static play.libs.F.Promise;
public class ValidateUserIdAction extends Action<MyAnnotations.ValidateUserId> {
public Promise<Result> call(Http.Context ctx) throws Throwable {
boolean isValid = false;
// This gets the GET path from request
String path = ctx.request().path();
try {
// Here we try to 'extract' id value by simple String replacement (basing on the annotation's param)
Long userId = Long.valueOf(path.replace(configuration.patternToReplace(), ""));
// Here you can put your additional checks - i.e. to verify if user can be found in DB
if (userId > 0) isValid = true;
} catch (Exception e) {
// Handle the exceptions as you want i.e. log it to the logfile
}
// Here, if ID isValid we continue the request, or redirect to other URL otherwise (also based on annotation's param)
return isValid
? delegate.call(ctx)
: Promise.<Result>pure(redirect(configuration.redirectTo()));
}
}
так что вы можете использовать его с действием, как:
@MyAnnotations.ValidateUserId(
patternToReplace = "/user/",
redirectTo = "/redirect/to/url/if/invalid"
)
public static Result getUser(userId){
....
}
Конечно, это очень простой пример, и вам может понадобиться/нужно сделать условие в вашем классе validationAction более сложным или добавить дополнительные параметры, чтобы сделать его еще более общим, все зависит от вас.
Hi @biesior Спасибо, да, он работает. но я хотел, чтобы я мог прочитать параметр, который будет передан в методах, так что мне не нужно разбирать строку пути. Но все равно спасибо. :) –