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

Java 播放框架-在路由中绑定枚举,java,playframework,enums,playframework-2.0,Java,Playframework,Enums,Playframework 2.0,我正在Play2.2上用java构建一个应用程序 我在路由中使用的函数中有一个java枚举作为参数 public enum Something implements QueryStringBindable<Something> { a, b, c; @Override public F.Option<ClientStatus> bind(String key, Map<String, String[]> params)

我正在Play2.2上用java构建一个应用程序

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

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;
    }
}
这是我的枚举类。我四处搜索,发现我需要实现QueryStringBindable,以便在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;
    }
}
但它返回错误请求,错误消息如下:

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


我在谷歌上搜索了一下,没有发现任何关于我的问题的答案。我错过了什么或者play不支持绑定枚举吗?

我也遇到了同样的问题,我最终发现它无法解决

通过阅读
PathBindable
QueryStringBindable
的文档,我发现play framework要求绑定表提供无参数公共构造函数。根据定义,在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;
       }
    }
}
应该成为

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

我想对答案做一个小小的更正: (返回类型不是ClientStatus,unbind函数应该使用key参数,它用于url生成)

公共枚举某物{
A.
B
C
公共静态类绑定实现QueryStringBindable{
私人价值;
@凌驾
公共F.选项绑定(字符串键、映射参数){
字符串[]arr=params.get(键);
如果(arr!=null&&arr.lenght>0){
this.value=Something.valueOf(arr[0]);
返回F.Option.Some(这个);
}否则{
返回F.Option.None();
}
}
@凌驾
公共字符串解除绑定(字符串键){
返回键+“=”+this.value.name();
}
@凌驾
公共字符串javascriptUnbind(){
返回此.value.name();
}
公共价值{
返回此.value;
}
}

}

我也考虑过同样的解决方案,但对我来说,这听起来太老套了。因此,我最终将字段绑定到一个字符串,并在控制器中解析该字符串以获取枚举。不过,这种黑客解决方案与play 2最接近。这种方法似乎需要更多的工作,但至少play framework会在有人拼写错误时为您返回正确的http错误代码。您的解决方案不太清楚何时需要从模板调用操作。我的意思是这样的代码:
我需要放置什么而不是
myEnumVar
?欢迎使用堆栈溢出!这实际上是对现有答案的评论。再重复一点。如果你想提供一个不同的答案,请解释为什么你认为这是正确的或比现有答案更好。
<a href="@{
   routes.MyController.showStuff(new MyEnumVarWrapper(myEnumVar)).url
}">link</a>
public enum Something {
a,
b,
c;

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

    @Override
    public F.Option<Bound> 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 key + "=" + this.value.name();
    }

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

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