在Play Framework 2.0中路由重载函数

在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) 

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

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

首先是使用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中的整数的最佳方法是什么?