Java 播放框架-在路由中绑定枚举
我正在Play2.2上用java构建一个应用程序 我在路由中使用的函数中有一个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)
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;
}
}