gpt4 book ai didi

java - play framework - 在路由中绑定(bind)枚举

转载 作者:搜寻专家 更新时间:2023-10-31 19:33:27 24 4
gpt4 key购买 nike

我正在 play 2.2 上用 java 构建一个应用程序。

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

这是我的枚举类。我四处搜索,发现我需要实现 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;
}
}

然而我在我的 route 尝试过:

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

但它会返回错误的请求,错误消息如下:

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

我用谷歌搜索,但没有找到适合我的案例的答案。我错过了什么或者游戏不支持绑定(bind)枚举吗?

最佳答案

我遇到了同样的问题,最后我发现它无法按原样解决。

通过阅读 PathBindableQueryStringBindable 的文档,我发现 play 框架要求 Bindable 提供无参数公共(public)构造函数。根据定义,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>

关于java - play framework - 在路由中绑定(bind)枚举,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21468483/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com