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

Java 如何使用Play 2.0路由绑定双参数,java,parameters,routes,double,playframework-2.0,Java,Parameters,Routes,Double,Playframework 2.0,我正在学习Play2.0(使用JavaAPI),希望有一个double/float参数(用于位置坐标),比如 我可以通过获取字符串形式的参数并在控制器等处解析它们来实现这一点,但是我可以在这里使用自动绑定吗 现在,我首先尝试使用一个双值: GET /events/foo controllers.Application.foo(doublevalue: Double) 与 我得到的是“没有为Double类型找到QueryString绑定器。请尝试为该类型实

我正在学习Play2.0(使用JavaAPI),希望有一个double/float参数(用于位置坐标),比如

我可以通过获取字符串形式的参数并在控制器等处解析它们来实现这一点,但是我可以在这里使用自动绑定吗

现在,我首先尝试使用一个双值:

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

我得到的是“没有为Double类型找到QueryString绑定器。请尝试为该类型实现隐式QueryString绑定器。”

我是否错过了已经提供的东西 我是否必须使自定义QueryStringBindable解析为双精度

我在上找到了一些关于使用Scala制作自定义字符串查询字符串绑定器的说明

我尝试的是: 我在package binders上实现了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;
    }
}
但同样的结果是:“没有为Double类型找到QueryString绑定器…”

  • 我还将路由签名更改为java.lang.Double,但这也没有帮助
  • 我还更改了DoubleBinder以实现play.api.mvc.QueryStringBindable(而不是play.mvc.QueryStringBindable),在路由签名处使用Double和java.lang.Double,但仍然没有帮助
目前(在Play 2.0中),Java绑定器仅适用于自递归类型。也就是说,类型如下所示:

class Foo扩展了QueryStringBindable{
…
}
因此,如果您想为
java.lang.Double
定义一个活页夹,它是一种现有的java类型,那么您需要将它包装成一个自递归类型。例如:

package-util;
公共类DoubleW实现QueryStringBindable{
公共双值=null;
@凌驾
公共选项绑定(字符串键、地图数据){
字符串[]vs=data.get(键);
如果(vs!=null&&vs.length>0){
字符串v=vs[0];
值=Double.parseDouble(v);
返回F.Some(这个);
}
返回F.None();
}
@凌驾
公共字符串解除绑定(字符串键){
返回键+“=”+值;
}
@凌驾
公共字符串javascriptUnbind(){
返回值.toString();
}
}
然后,您可以在应用程序中使用它,如下所示:

GET    /foo     controllers.Application.action(d: util.DoubleW)
公共静态结果操作(DoubleW d){
…
}

我认为这是支持Java
QueryStringBindable
的一个缺陷。请在售票处登记一张票。顺便说一句,
Double
Float
应该在Play 2.1中得到开箱即用的支持。在github上似乎有一个拉取请求。好的,我找到了问题的根源和解决方案。请看下面我的答案:)好的,我让这个工作,谢谢!遗憾的是,绑定不适用于标准类型,希望通过Play2.1更好地实现这一点?当然,Play2.1内置了标准类型支持。请参见2.1中针对非标准类型的修正,还是我们仍然需要一个包装器来创建自递归类型?仍然需要自递归类型您可以将
DoubleW
类放入项目中您想要的任何包中。关键是您必须在路由定义中完全限定它(除非在构建文件中使用
routesImport
技巧)。
routesImport += "binders._"
GET    /foo     controllers.Application.action(d: util.DoubleW)