播放框架 - 绑定路由中的枚举 [英] play framework - bind enum in routes

查看:96
本文介绍了播放框架 - 绑定路由中的枚举的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在玩java 2.2中构建一个应用程序。



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



这是我的枚举类。我搜索到,发现我需要实现QueryStringBindable在路由中使用它。

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

@Override
public F.Option< ClientStatus> bind(String key,Map< String,String []¶m){
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)
pre>

但是它返回错误的请求,并显示以下错误消息:


'GET / someurl'[util.enums.Something]


我在Google上找不到任何答案。我有没有想过的东西或播放不支持绑定枚举?

解决方案

我有同样的问题,我终于发现它不可解决。



通过阅读 PathBindable QueryStringBindable 我发现play framework 要求 Bindable提供一个无参数的公共构造函数。根据定义,Java中的枚举是不可能的。



所以我必须包装我的枚举来解决这个问题。在你的例子中,我们会有一些类似的东西:

  public enum Something {
a,
b,$ b $公元前;

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

@Override
public F.Option< ClientStatus> bind(String key,Map< String,String []¶m){
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;
}
}
}

然后你必须使用



编辑:使用它在一个模板稍微更棘手一点。而你必须知道一点scala。
跟随@ Aleksei的评论

 < a href =@ routes.MyController.showStuff(myEnumVar)> ; LINK< / A> 

应该成为

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


I am building an app in java on play 2.2.

I have a java enum as a parameter in a function that I use in routes.

This is my enum class. I searched around and found out I need to implements QueryStringBindable to use it in routes.

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;
    }
}

Yet I tried in my routes:

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

But it returns bad request with error message as:

For request 'GET /someurl' [util.enums.Something]

I googled and didn't find any answer working in my case. Did I miss something or play doesn't support binding enums?

解决方案

I had the same problem and I finally found out that it is not solvable as is.

By reading the documentation for PathBindable and QueryStringBindable I found that play framework requires the Bindable to provide a No Argument public constructor. Which by definition is no possible with enum in Java.

So I had to wrap my enum to solve this. In your example we would have something like:

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;
       }
    }
}

and then you have to use the type some.package.Something.Bound as a type in your routes file.

EDIT: using that in a template is slightly more tricky. And you have to know a bit of scala. To follow @Aleksei's comment

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

should become

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

这篇关于播放框架 - 绑定路由中的枚举的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆