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