如何使用Play 2.0路由绑定Double参数

我正在学习自己的Play 2.0(使用的是Java API),并希望有一个double / float参数(用于位置坐标),例如http://myfooapp.com/events/find?latitude=25.123456&longitude=60.251253 。

我可以通过将参数作为String并在控制器等处解析它来做到这一点,但我可以在这里使用自动绑定吗?

现在,我首先尝试简单地使用一个double值:

GET /events/foo controllers.Application.foo(doublevalue: Double) 

 public static Result foo(Double doublevalue) { return ok(index.render("Foo:" + doublevalue)); } 

我得到的是“找不到类型为Double的QueryString绑定器。尝试为此类型实现隐式QueryStringBindable。”

我是否遗漏了已经提供的内容,或者我是否需要创建一个解析Double的自定义QueryStringBindable?

我在http://julien.richard-foy.fr/blog/2012/04/09/how-to-implement-a-custom-pathbindable-with-play上找到了一些关于使用Scala创建自定义字符串查询字符串绑定器的说明-2 /

我尝试了什么:

我在包装粘合剂上实现了DoubleBinder:

 import java.util.Map; import play.libs.F.Option; import play.mvc.QueryStringBindable; public class DoubleBinder implements QueryStringBindable{ @Override public Option bind(String key, Map 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; } } 

并尝试将其添加到project / Build.scala的main:

 routesImport += "binders._" 

但结果相同:“找不到类型为Double的QueryString绑定器….”

  • 我还将路由签名更改为java.lang.Double,但这也没有帮助
  • 我还改变了DoubleBinder来实现play.api.mvc.QueryStringBindable(而不是play.mvc.QueryStringBindable)在路由签名上使用Double和java.lang.Double但是仍然没有帮助

目前(在Play 2.0中),Java绑定器仅适用于自递归类型。 也就是说,类似如下的类型:

 class Foo extends QueryStringBindable { … } 

因此,如果要为java.lang.Double定义一个绑定程序(现有类型的Java),则需要将其包装为自递归类型。 例如:

 package util; public class DoubleW implements QueryStringBindable { public Double value = null; @Override public Option bind(String key, Map 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) { … }