9

私は Play 2.0 (Java API を使用) を学んでおり、 http://myfooapp.com/events/find?latitude=25.123456&longitude=60.251253のような double/float パラメーター (位置座標用) が必要です。

パラメーターを文字列として取得し、コントローラーなどで解析することでこれを行うことができますが、ここで自動バインドを使用できますか?

ここで、最初に double 値を 1 つだけ持つようにしました。

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 を作成する必要がありますか?

http://julien.richard-foy.fr/blog/2012/04/09/how-to-implement-a-custom-pathbindable-with-playで、Scala を使用してカスタム文字列クエリ文字列バインダーを作成する手順をいくつか見つけました。-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 のメインに追加しようとしました:

routesImport += "binders._"

しかし、同じ結果:「Double型のQueryStringバインダーが見つかりません....」

  • ルーティング署名も java.lang.Double に変更しましたが、どちらも役に立ちませんでした
  • また、DoubleBinder を変更して、(play.mvc.QueryStringBindable の代わりに) play.api.mvc.QueryStringBindable を実装するように変更しましたが、ルーティング署名で Double と java.lang.Double の両方を使用しましたが、まだ助けにはなりません
4

1 に答える 1

12

現在 (Play 2.0 では)、Java バインダーは自己再帰型でのみ動作します。つまり、次のような型です。

class Foo extends QueryStringBindable<Foo> {
  …
}

したがって、java.lang.DoubleJava の既存の型である のバインダーを定義する場合は、自己再帰型でラップする必要があります。例えば:

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) {
      …
}
于 2012-04-25T00:42:52.417 に答える