2012-05-09 9 views
3

Playでは、コントローラーメソッドがオーバーロードされると、それらの個々のメソッドを複数回ルーティングすることはできません。Play Framework 2.0でオーバーロードされた関数のルーティング

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

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

そして、私はroutesで宣言され、これらの機能のための2つの異なる経路いた:私は別の経路について、「同じ」機能を使用したい

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

を、これは可能ですか?

答えて

3

いいえ、可能ではありません.2つの解決策があります。

まず2名を使用することです:そうあなたが得るでしょう、また、あなたはそれのために別のルートを使用する必要があります

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

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

を、1つを使用しているタイプの不一致

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

第二の溶液文字列引数を持つメソッドで、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) 

私は、あなたの質問に適合していないが、少なくともあなたの時間を節約できます知っています。また、文字列を数値型に変換できるかどうかを判断するためのより良い方法があることにも留意してください。What's the best way to check to see if a String represents an integer in Java?

+0

2番目の解決策は私には十分です。ありがとう。 – snnth

+1

なぜそれは許されないのですか? – user2601010

関連する問題