在 Play 中,当重载 Controller 方法时,这些单独的方法不能被多次路由导致编译器不喜欢它。
有没有办法解决这个问题?
假设我的 Product
Controller 中有两个函数:getBy(String name)
和 getBy(long id)
。
对于在 routes
中声明的这些函数,我有两个不同的路由:
GET /p/:id controllers.Product.getBy(id: Long)
GET /p/:name controllers.Product.getBy(name: String)
我想对不同的路由使用“相同”的功能,这可能吗?
最佳答案
不,这不可能,有两个解决方案。
首先是使用两个名字:
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 是否可以转换为数字类型,即在这个问题中:What's the best way to check to see if a String represents an integer in Java?
关于java - Play Framework 2.0 中的路由重载函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10524047/