4

在 Play 中,当重载控制器方法时,这些单独的方法不能被多次路由,导致编译器不喜欢它。

有没有办法解决这个问题?

假设我的Product控制器中有两个功能:getBy(String name)getBy(long id).

对于在以下声明的这些函数,我有两条不同的路线routes

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

我想对不同的路线使用“相同”的功能,这可能吗?

4

1 回答 1

4

不,这是不可能的,有两种解决方案。

首先是使用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)

第二种解决方案是使用带有 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)

我知道这不适合您的问题,但至少可以节省您的时间。还要记住,可能有更好的方法来确定 String 是否可以转换为数字类型,即在这个问题中:检查 String 是否表示 Java 中的整数的最佳方法是什么?

于 2012-05-09T22:02:29.523 回答