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

时间:2012-04-23 19:10:43

标签: java parameters routes double playframework-2.0

我正在学习自己的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));
}

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

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

我找到了一些关于使用Scala在http://julien.richard-foy.fr/blog/2012/04/09/how-to-implement-a-custom-pathbindable-with-play-2/

创建自定义字符串查询字符串绑定器的说明

我尝试了什么:

我在包装夹上实施了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;
    }
}

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

routesImport += "binders._"

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

  • 我还将路由签名更改为java.lang.Double但这对
  • 没有任何帮助
  • 我还改变了DoubleBinder来实现play.api.mvc.QueryStringBindable(而不是play.mvc.QueryStringBindable)和Double&amp;路由签名上的java.lang.Double但仍然没有帮助

1 个答案:

答案 0 :(得分:12)

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

class Foo extends QueryStringBindable<Foo> {
  …
}

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

package util;

public class DoubleW implements QueryStringBindable<DoubleW> {

    public Double value = null;

    @Override
    public Option<DoubleW> bind(String key, Map<String, 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) {
      …
}