我正在学习Play 2.0(使用
Java API),并希望有一个double / float参数(位置坐标),像
http://myfooapp.com/events/find?latitude=25.123456&longitude=60.251253.
我可以通过获取参数为String并在控制器解析它们,但可以在这里使用自动绑定吗?
现在,我首先尝试一个双重值:
GET /events/foo controllers.Application.foo(doublevalue: Double)
同
public static Result foo(Double doublevalue) {
return ok(index.render("Foo:" + doublevalue));
}
我得到的是“没有QueryType绑定找到类型Double.尝试实现隐式QueryStringBindable为此类型.
我错过了已经提供的东西
我需要自定义QueryStringBindable来分析Double吗?
我发现一些关于在http://julien.richard-foy.fr/blog/2012/04/09/how-to-implement-a-custom-pathbindable-with-play-2/上使用Scala制作自定义字符串查询字符串绑定器的说明
我试过的
我在包装机上实现了DoubleBinder:
import java.util.Map;
import play.libs.F.Option;
import play.mvc.QueryStringBindable;
public class DoubleBinder implements QueryStringBindable<Double>{
@Override
public Option<Double> bind(String key,Map<String,String[]> data) {
String[] value = data.get(key);
if(value == null || value.length == 0) {
return Option.None();
} else {
return Option.some(Double.parseDouble(value[0]));
}
}
@Override
public String javascriptUnbind() {
// Todo Auto-generated method stub
return null;
}
@Override
public String unbind(String key) {
// Todo Auto-generated method stub
return null;
}
}
并试图添加到项目/ Build.scala的主要:
routesImport += "binders._"
但结果相同:“找不到类型为Double ….的QueryString绑定”
>我还将路由签名更改为java.lang.Double,但这也没有帮助
>我还更改了DoubleBinder来实现play.api.mvc.QueryStringBindable(而不是play.mvc.QueryStringBindable),双重和& java.lang.Double在路由签名,但没有帮助
解决方法
目前(在2.0版)中,Java绑定只适用于自递归类型.也就是说,类似于以下内容:
class Foo extends QueryStringBindable<Foo> {
…
}
因此,如果要定义java.lang.Double(它是现有类型的Java)的binder,则需要将其包装为自递归类型.例如:
package util;
public class DoubleW implements QueryStringBindable<DoubleW> {
public Double value = null;
@Override
public Option<DoubleW> bind(String key,String[]> data) {
String[] vs = data.get(key);
if (vs != null && vs.length > 0) {
String v = vs[0];
value = Double.parseDouble(v);
return F.some(this);
}
return F.None();
}
@Override
public String unbind(String key) {
return key + "=" + value;
}
@Override
public String javascriptUnbind() {
return value.toString();
}
}
那么你可以在你的应用程序中使用它:
GET /foo controllers.Application.action(d: util.DoubleW)
public static Result action(DoubleW d) {
…
}