播放框架 - 绑定路由中的枚举

时间:2014-01-30 22:10:36

标签: java playframework enums playframework-2.0

我正在使用java on play 2.2构建应用程序。

我有一个java enum作为我在路由中使用的函数中的参数。

这是我的枚举课程。我四处搜索,发现我需要实现QueryStringBindable才能在路由中使用它。

public enum Something implements QueryStringBindable<Something> {
    a,
    b,
    c;

    @Override
    public F.Option<ClientStatus> bind(String key, Map<String, String[]> params) {
        String[] arr = params.get(key);
        if (arr == null || arr.length == 0) {
            return F.Option.None();
        } else {
            Something status = Something.valueOf(arr[0]);
            return F.Option.Some(status);
        }
    }

    @Override
    public String unbind(String key) {
        return null;
    }

    @Override
    public String javascriptUnbind() {
        return null;
    }
}

然而我尝试了我的路线:

GET    /someurl     controllers.Application.function(status: util.enums.Something)

但它返回错误消息的错误请求:

  

对于请求'GET / someurl'[util.enums.Something]

我用谷歌搜索,并没有找到任何答案在我的情况下工作。我错过了什么或者游戏不支持绑定枚举?

2 个答案:

答案 0 :(得分:9)

我遇到了同样的问题,我终于发现它不能解决。

通过阅读PathBindableQueryStringBindable的文档,我发现播放框架需要 Bindable提供No Argument公共构造函数。根据定义,Java中的enum无法实现。

所以我不得不用我的枚举来解决这个问题。在你的例子中,我们会有类似的东西:

public enum Something {
    a,
    b,
    c;

    public static class Bound implements QueryStringBindable<Bound>{
       private Something value;

        @Override
        public F.Option<ClientStatus> bind(String key, Map<String, String[]> params) {
            String[] arr = params.get(key);
            if (arr != null && arr.lenght > 0) {
                this.value = Something.valueOf(arr[0]);
                return F.Option.Some(this);
            } else {
                return F.Option.None();
            }
        }

        @Override
        public String unbind(String key) {
            return this.value.name();
        }

        @Override
       public String javascriptUnbind() {
            return this.value.name();
       }

       public Something value(){
           return this.value;
       }
    }
}

然后你必须在路由文件中使用类型some.package.Something.Bound作为类型。

编辑:在模板中使用它稍微有些棘手。你必须知道一点scala。 关注@Aleksei的评论

<a href="@routes.MyController.showStuff(myEnumVar)">link</a>

应该成为

<a href="@{
   routes.MyController.showStuff(new MyEnumVarWrapper(myEnumVar)).url
}">link</a>

答案 1 :(得分:0)

我想对答案进行一次小修正: (返回类型不是ClientStatus,unbind函数应该使用key参数,它是url generatiion)

var newlist = from m in movies
              where (m.Name == "Troy" || m.Name == "Noah")
              select m;

}