【问题标题】:How to get path variable in an intercepter如何在拦截器中获取路径变量
【发布时间】:2015-04-06 08:15:21
【问题描述】:

我正在使用 play framework 2.0,它有一个非常简单的流程...路由 -> 控制器 -> 服务 -> 模型 -> 控制器 -> 结果。

好吧,接下来我有一个控制器,它从路由接收路径变量。

GET /user/:userId controller.user.getUser(userId : String)

正如你所看到的,这实际上是一个 userId,我想验证这个 userId(检查它是否存在于我们的数据库中)但不是在控制器中而是使用一些注释,就像这样..

//My annotation for validating userId
@ValidateUserId(userId)
public static Result getUser(userId)

【问题讨论】:

    标签: java playframework annotations playframework-2.2


    【解决方案1】:

    这个概念的主要问题是注释的参数必须是一个常量,@see topic about this 所以你将不能像代码中显示的那样使用userId。相反,您可以创建一个读取上下文本身的注释,然后解析 URI 以获取用户的 ID。即:

    app/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();
        }
    
    }
    

    app/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 类中的条件更加复杂,或者添加更多参数以使其更加通用,一切都取决于您。

    【讨论】:

    • 嗨@biesior 谢谢,是的,它正在工作。但我想要某种方式来读取将要在方法中传递的参数,这样我就不必解析路径字符串。但还是谢谢你。 :)
    猜你喜欢
    • 2012-08-28
    • 2020-03-11
    • 2012-04-06
    • 2013-09-21
    • 1970-01-01
    • 2018-06-13
    • 1970-01-01
    • 2021-08-09
    • 1970-01-01
    相关资源
    最近更新 更多