Вопрос по playframework-2.0, java, double, routes, parameters – Как связать параметр Double с маршрутизацией Play 2.0
Я изучаю сам Play 2.0 (используется Java API) и хотел бы иметь параметр double / float (для координат местоположения), что-то вродеhttp://myfooapp.com/events/find?latitude=25.123456&longitude=60.251253.
Я могу сделать это, получив параметры в виде String и проанализировав их на контроллере и т. Д., Но можно ли здесь использовать автоматическое связывание?
Теперь я сначала попробовал просто иметь одно двойное значение:
<code>GET /events/foo controllers.Application.foo(doublevalue: Double) </code>
с
<code>public static Result foo(Double doublevalue) { return ok(index.render("Foo:" + doublevalue)); } </code>
То, что я получил, было"No QueryString binder found for type Double. Try to implement an implicit QueryStringBindable for this type."
Я пропустил что-то уже предоставлено или я должен сделать пользовательский QueryStringBindable, который анализирует Double?
Я нашел несколько инструкций по созданию пользовательского связывателя строк в Scala вhttp://julien.richard-foy.fr/blog/2012/04/09/how-to-implement-a-custom-pathbindable-with-play-2/
What I tried:Я реализовал DoubleBinder в пакетных папках:
<code>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; } } </code>
И попытался добавить его в основной файл проекта / Build.scala:
<code>routesImport += "binders._" </code>
но результат тот же: & quot; Связыватель QueryString не найден для типа Double .... & quot;
I also changed the routing signature to java.lang.Double but that didn't help either I also changed the DoubleBinder to implement play.api.mvc.QueryStringBindable (instead of play.mvc.QueryStringBindable) both with Double & java.lang.Double at the routing signature but no help stillQueryStringBindable
, Пожалуйста, подайте заявку вtracker, КСТАТИ,Double
а такжеFloat
должны быть поддержаны из коробки в Play 2.1.
Julien Richard-Foy
рекурсивными типами. То есть типы выглядят следующим образом:
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) {
…
}