Вопрос по playframework-2.0, java, double, routes, parameters – Как связать параметр Double с маршрутизацией Play 2.0

9

Я изучаю сам 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 still
Хорошо, я нашел источник проблемы и решение. Смотрите мой ответ ниже :) Julien Richard-Foy
Кажется, на github есть запрос на удалениеgithub.com/playframework/Play20/pull/235 Leon Radley
Я думаю, что это ошибка в поддержке JavaQueryStringBindable, Пожалуйста, подайте заявку вtracker, КСТАТИ,Double а такжеFloat должны быть поддержаны из коробки в Play 2.1. Julien Richard-Foy

Ваш Ответ

1   ответ
12

рекурсивными типами. То есть типы выглядят следующим образом:

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) {
      …
}
Вы можете поставитьDoubleW класс в любом пакете, который вы хотите, в вашем проекте. Дело в том, что вы должны полностью квалифицировать его в своих определениях маршрутов (если вы не используетеroutesImport трюк в вашем файле сборки).
Конечно, поддержка стандартных типов будет встроена в Play 2.1. Увидетьthis pull request
Исправлено ли это в 2.1 для нестандартных типов или нам все еще нужна оболочка для создания саморекурсивных типов?
Хорошо, я получил это на работу, спасибо! Жаль, что привязка не работает для стандартных типов, надеетесь улучшить это с помощью Play 2.1? Touko
Саморекурсивный тип все еще необходим

Похожие вопросы