6

私は play 2.0 を使用していて、ビューからコントローラー アプリケーションに double を渡そうとしていますが、次のエラーが発生します:タイプ Double の QueryString バインダーが見つかりません。このタイプの暗黙的な QueryStringBindable を実装してみてくださいこのスレッドを見つけたところ、Java バインダーは play 2.0 の自己再帰型でのみ機能することがわかりましたが、play 2.1 ではサポートされる予定です。残念ながら、私は自分のプロジェクトを 2.1 に移行する立場にないので、リンクされた質問への回答に従おうとしました。プロジェクトに util パッケージを作成しました。その中には DoubleW クラスがあります。

package util;

import java.util.Map;

import play.libs.F;
import play.libs.F.Option;
import play.mvc.QueryStringBindable;

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();
    }

}

これを、コントローラー/アプリケーションで必要な場所と、doubles を使用する必要があるモデル クラスの 1 つにインポートしました。関連するアプリケーション メソッドとモデル メソッドで double データ型を新しい DoubleW に置き換えました。最後に、ルーティング テーブルを変更して、新しいパラメーターが必要になるようにしました。

GET /findMatch controllers.Application.matcher(sLat: util.DoubleW、sLon: util.DoubleW、eLat: util.DoubleW、eLon: util.DoubleW)

アプリケーション マッチャー メソッドが使用するモデル メソッド内で、演算を実行する必要があります。ただし、プロジェクトを実行すると、次のエラーが表示されます:エラー: 二項演算子 '<=' のオペランド型が正しくありません。double を処理するこの新しい型 (DoubleW) は文字列と見なされているようです。その値に対して算術演算を実行できず、標準の Java double にその値を割り当てることができません。前回の投稿で手順を見逃したかどうかはわかりませんが、何をすべきか迷っています。

4

1 に答える 1

6

Play 2.0 では、最も簡単な解決策は Scala を使用することであることがわかりました (Java プロジェクトであっても) (これについては、私の Play Basics ブログ投稿の 1 つで説明しました。

Scala がわからない場合は、以下を というファイルに貼り付けBinders.scalaroutesImport += "util.Binders._"Build.scala.

package util

object Binders {

  implicit object DoubleQueryBindable extends QueryStringBindable[Double] {
    def bind(key: String, params: Map[String, Seq[String]]) = params.get(key).flatMap(_.headOption).map { value =>
      try {
        Right(value.toDouble)
      } catch {
        case e: Exception =>  Left("Cannot parse parameter " + key + " as Double")
      }
    }
    def unbind(key: String, value: Double) = key + "=" + value.toString
  }

  implicit object DoublePathBindable extends PathBindable[Double] {
    def bind(key: String, value: String) = try {
      Right(value.toDouble)
    } catch {
      case e: Exception => Left("Cannot parse parameter '" + key + "' as Double")
    }

    def unbind(key: String, value: Double): String = value.toString
  }
}
于 2013-03-29T21:22:50.153 に答える