5

如何在 Play Project 的 Application.java 中设置重载方法?

这是我目前正在做的一些例子:

应用程序.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. 使用参数名称 = 测试

我非常感谢您的帮助。谢谢...


更新解决方案

这是我根据Daniel Alexiuc的建议正在做的事情:

应用程序.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)

应用程序.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在路由定义中不是有效的可选值而失败。因此,我相信我将采用以下解决方案(到目前为止有效),在我在控制器中转换为 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;
}

它不是很漂亮,但从服务客户端的角度来看,它可能比使用两个单独的路径更好。

于 2012-07-25T13:36:56.177 回答