Play Framework 2.5.12 - 从Call中获取方法

时间:2017-02-27 14:49:29

标签: java playframework

我需要从 play.api.mvc.Call 实例中获取调用的方法。 我已经注意到我的控制器的方法和使用反向路由我需要检查那些注释。

我正在使用Play Framework 2.5.12

示例:

注释:

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD, ElementType.TYPE})
public @interface MyAnnotation{
}

控制器:

public class MyController extends Controller {

    @MyAnnotation
    public Result home(int index){
      return ok(index);
    }
}

类别:

public class MyClass{

    private Call call;

    public MyClass(Call call){
      this.call = call;
    }

    public boolean hasAnnotation(){
      //TODO
      return call.getControllerMethod().isAnnotationPresent(MyAnnotation.class);
    }
}

使用:

MyClass obj = new MyClass(routes.MyController.home(1));
if(obj.hasAnnotation()){
  //do something
}

显然call.getControllerMethod()不存在,但我需要一些解决方案来从URL或呼叫实例中获取控制器的方法。

感谢您的支持。

2 个答案:

答案 0 :(得分:1)

OP解决方案。

不幸的是我决定创建一个这样的Call包装器:

public class CallRef extends Call {

    private Class<? extends Controller> controllerClass;
    private Method controllerMethod;

    public CallRef(Call call, Class<? extends Controller> controllerClass,
                   String controllerMethodName, Class<?>... methodArgs) throws NoSuchMethodException {

        this(call, controllerClass, controllerClass.getMethod(controllerMethodName, methodArgs));
    }

    public CallRef(Call call, Class<? extends Controller> controllerClass, Method controllerMethod) {
        this(call.method(), call.url(), call.fragment(), controllerClass, controllerMethod);
    }

    public CallRef(String method, String url, String fragment, Class<? extends Controller> controllerClass, Method controllerMethod) {
        super(method, url, fragment);
        this.controllerClass = controllerClass;
        this.controllerMethod = controllerMethod;
    }

    public CallRef(CallRef callRef){
            this(callRef, callRef.getControllerClass(), callRef.getControllerMethod());
    }

    public Class<? extends Controller> getControllerClass() {
        return controllerClass;
    }

    public Method getControllerMethod() {
        return controllerMethod;
    }
}

所以我需要在我的类CallRef上手动创建实例,指定控制器,方法和参数。

答案 1 :(得分:0)

1。 play.api.mvc.Call适用于Scala,Java使用play.mvc.Call

2。 Call描述了HTTP请求。您无法使用它从控制器方法获取注释。只需在任何其他情况下使用简单反射来获取注释。

更新

您可以获取路线,然后查看哪种模式代表您的网址,然后按反射检查注释

import com.google.inject.Provider;
import play.routing.Router;
import play.routing.Router.RouteDocumentation;

...

@Inject 
private Provider<Router> router;

...

List<RouteDocumentation> docs = router.get().documentation();
for(RouteDocumentation doc: docs){
    String protocol = doc.getHttpMethod();
    Sting pathPattern =  doc.getPathPattern();
    String methodStrign = doc.getControllerMethodInvocation());

    // Check the pathPattern against url
    // Get the annotation from the methodStrign by reflection.
}