5

Play ProjectのApplication.javaでオーバーロードメソッドを設定するにはどうすればよいですか?

これが私が現在行っていることのいくつかの例です:

Application.java

public class Application extends Controller {

    public static void index() {
        render();
    }

    public static void getData() {
        renderText("Without Parameter");
    }

    public static void getData(String name) {
        renderText("With Parameter name = " + name);
    }
}

ルート

# Routes
# This file defines all application routes (Higher priority routes first)
# ~~~~

# Home page
GET     /                                       Application.index
GET     /data                                   Application.getData

# Ignore favicon requests
GET     /favicon.ico                            404

# Map static resources from the /app/public folder to the /public path
GET     /public/                                staticDir:public

# Catch all
*       /{controller}/{action}                  {controller}.{action}

テスト:

  1. getDataパラメータなしで呼び出すhttp://localhost:9000/data
  2. getDataパラメータを使用して呼び出すhttp://localhost:9000/data?name=test

結果:

  1. パラメータ名=nullの場合
  2. パラメータ名=テスト

結果に欲しいもの:

  1. パラメータなし
  2. パラメータ名=テスト

私はあなたの助けにとても感謝しています。ありがとうございました...


ソリューションの更新

DanielAlexiucの提案に基づいて私が行っていることは次のとおりです。

Application.java

public class Application extends Controller {

    public static void index() {
        render();
    }

    public static void getData() {
        /** 
         *  Do some process before call getDataName method 
         *  and send the result of the process as the parameter.
         *  That's why I do this way that look like redundancy process.
        **/
        getDataName(null);
    }

    public static void getDataName(String name) {
        // Didn't use ternary operation here because will become error 'not a statement'
        if(name == null)
            renderText("Without Parameter");
        else
            renderText("With Parameter name = " + name);
    }

}

ルート

GET     /                                       Application.index
GET     /default                                Application.getData
GET     /dataString                             Application.getDataName

ソリューションの更新(26/07)

Application.java

public class Application extends Controller {

    public static void index() {
        render();
    }

    public static void getData(String name, Integer age) {
        if (name == null && age == null) {
            renderText("Data null");
        } else if (name != null && age == null) {
            renderText("Name: " + name);
        } else if (name != null && age != null) {
            renderText("Name: " + name + "\n" + "Age: " + age);
        }
    }
}

ルート

GET     /data                                   Application.getData
GET     /data/{name}                            Application.getData
GET     /data/{name}/{age}                      Application.getData

そして、電話のために:

 1. http://localhost:9000/data                -> Display "Data null"
 2. http://localhost:9000/data/Crazenezz      -> Display "Name: Crazenezz"
 3. http://localhost:9000/data/Crazenezz/24   -> Display "Name: Crazenezz
                                                          Age: 24"
4

2 に答える 2

2

私はあなたが望むようにルートファイルでそれをオーバーロードすることは可能ではないと思います。

しかし、あなたはこのようなことをすることができます:

public static void getData(String name) {
  if (name == null) {
    renderText("Without Parameter");
  } else {
    renderText("With Parameter name = " + name);
  }
}
于 2012-05-02T07:42:13.863 に答える
1

私はあなたと同じことを達成したかったと思います、Crazenezz、それで最初に私は次のルート定義で試しました:

GET     /terms.json                 controllers.exposedjson.TermServiceJSON.findTermsByQuery(langId:Long ?= null)

...引数がnullかどうかをチェックするコントローラーのメソッドと一緒にnull、ルート定義の有効なオプション値ではなかったため、失敗しました。したがって、代わりに、次のソリューション(これまでのところ機能します)を使用して、コントローラーでlongにキャストしたJSONサービスインターフェイスで文字列値を公開すると思います。

GET     /terms.json                 controllers.exposedjson.TermServiceJSON.findTermsByQuery(langId:String ?= "")


@Transactional(readOnly=true)
public static Result findTermsByQuery(String languageId) {
    Result result;
    if (languageId == "")
        result = ok(toJson(TermService.getTerms()));
    else
        result = ok(toJson(TermService.findTermsByLanguageId(Long.parseLong(languageId.trim()))));
    return result;
}

あまりきれいではありませんが、サービスクライアントの観点からは、2つの別々のパスを使用するよりも優れている場合があります。

于 2012-07-25T13:36:56.177 に答える