4

Play では、コントローラ メソッドをオーバーロードする場合、それらの個々のメソッドを複数回ルーティングすることはできません。これは、コンパイラが気に入らないためです。

これを回避する方法はありますか?

Productコントローラーに との 2 つの関数があるgetBy(String name)としgetBy(long id)ます。

で宣言されたこれらの関数には、次の 2 つの異なるルートがありましたroutes

GET /p/:id            controllers.Product.getBy(id: Long)
GET /p/:name          controllers.Product.getBy(name: String)

異なるルートで「同じ」機能を使用したいのですが、可能ですか?

4

1 に答える 1

4

いいえ、それは不可能です。2 つの解決策があります。

まず、2 つの名前を使用します。

public static Result getByLong(Long id) {
    return ok("Long value: " + id);
}

public static Result getByString(String name) {
    return ok("String value: " + name);
}

また、別のルートを使用する必要があります。そうしないと、タイプの不一致が発生します

GET   /p-by-long/:id         controllers.Monitor.getByLong(id: Long)
GET   /p-by-string/:name     controllers.Monitor.getByString(name: String)

2番目の解決策は、String引数を持つ1つのメソッドを使用し、Longに変換できるかどうかを内部的にチェックすることです

public static Result getByArgOfAnyType(String arg) {
    try {
        Long.parseLong(arg);
        return ok("Long: " + arg);
    } catch (Exception e) {
        return ok("String: " + arg);
    }
}

ルート:

GET   /p/:arg     controllers.Monitor.getByArgOfAnyType(arg : String)

それがあなたの質問に合わないことはわかっていますが、少なくとも時間を節約できます。また、String を数値型に変換できるかどうかを判断するためのより良い方法がある可能性があることにも注意してください。つまり、この質問では、String が Java で整数を表しているかどうかを確認する最良の方法は何ですか?

于 2012-05-09T22:02:29.523 に答える