玩! Java的。将请求参数传递给@With注释

时间:2014-05-16 14:51:19

标签: java playframework annotations playframework-2.2

我有以下路线:

  GET     /job$id<[0-9]+>/        controllers.Jobs.index(id)
  POST    /job$id<[0-9]+>/done    controllers.Jobs.done(id)
  POST    /job$id<[0-9]+>/update  controllers.Jobs.update(id)
  DELETE  /job$id<[0-9]+>/remove  controllers.Jobs.remove(id)

和我&#39;喜欢保护它。每个工作都有一个所有者。所以我做了

public class Secured extends Security.Authenticator {
...
}

然后我尝试通过&#34; @With()&#34;来保护我的所有动作。 annotatian,但我需要通过&#34; Id &#34;我的安全方法的参数,所以我写了像:

@With(IsOwner.class)
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface Owner {
    long value() default 0;
}

public static class IsOwner extends Action<Owner>{
    @Override
    public Promise<SimpleResult> call(Context ctx) throws Throwable {

        if(!isOwner(configuration.value())){
            return Promise.pure(redirect(..));
        }
        return delegate.call(ctx);
    }
}

但是我无法将我的动作参数传递给注释。

@Security.Authenticated(Secured.class)

@Owner(id) //**this part I want to work**
public class Jobs extends Controller {

  //@Owner(id) - or at list there
  public static Result index(Long Id){
    //I have too many Actions and don't want to do every time this
    /*if(!Secured.isOwnerMethod(Id)){
      return forbidden();
    }*/         
    return ok();        
  }

我看到的其他方式是从 IsOwner.call()方法上下文获取参数...

请为这种情况给我一个推荐或良好做法。

感谢。

1 个答案:

答案 0 :(得分:0)

我遇到了这个问题并提出了一个Play扩展,它将所有url参数公开为常见请求参数...你可以在这里查看=&gt; https://github.com/asouza/reverse-route-plugin

基本上你必须从我的Global类扩展。

干杯,

阿尔贝托