播放框架 - 绑定路由中的枚举 [英] play framework - bind enum in routes
问题描述
我有一个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
andQueryStringBindable
I found that play framework requires the Bindable to provide a No Argument public constructor. Which by definition is no possible withenum
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屋!