如何使用播放2.0双路由绑定参数(How to bind Double parameter with

2019-06-23 21:33发布

我正在学习自己玩2.0(使用的Java API),并希望有一个双/浮点参数(位置坐标),像http://myfooapp.com/events/find?latitude=25.123456&longitude=60.251253 。

我可以通过获取的参数字符串和控制器等解析他们这样做,但我可以用自动绑定吗?

现在,我第一次尝试仅仅拥有一个双重价值:

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

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

我得到的是“未找到型双查询字符串粘合剂。试图实现一个隐含的QueryStringBindable这种类型。”

难道我错过了一些东西已经提供或做我不得不做出这样的解析双定制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;
    }
}

并试图将其添加到项目/ Build.scala主营:

routesImport += "binders._"

但同样的结果:“没有查询字符串粘结剂发现型双......”

  • 我也改变了路由签名java.lang.Double中,但没有任何帮助
  • 我也改变来实现play.api.mvc.QueryStringBindable(而不是play.mvc.QueryStringBindable)的DoubleBinder都与双人床和java.lang.Double中的路由签名,但没有帮助仍

Answer 1:

目前(在播放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) {
      …
}


文章来源: How to bind Double parameter with Play 2.0 routing