Java 按播放中的参数数据类型进行路由

Java 按播放中的参数数据类型进行路由,java,playframework,Java,Playframework,在游戏中,根据提供的数据类型处理端点路由的最佳方法是什么 GET /my/:id controllers.MyController.getById(id: Long) GET /my/:name controllers.MyController.getByName(name: String) 应为GET/my/1调用getById 应为GET/my/bob调用getByName(因为bob不会强制转换为Long) 这可能并不总是最好的端点设计,但如果需要

在游戏中,根据提供的数据类型处理端点路由的最佳方法是什么

GET /my/:id            controllers.MyController.getById(id: Long)
GET /my/:name          controllers.MyController.getByName(name: String)
应为
GET/my/1
调用
getById

应为
GET/my/bob
调用
getByName
(因为
bob
不会强制转换为
Long

这可能并不总是最好的端点设计,但如果需要,实现这一点的最佳方法是什么

中提到的一个解决方法是创建单控制器方法,尝试为您进行转换

GET /my/:arg            controllers.MyController.getByAny(arg: String)

Result getByAny(String arg) {
    try {
        getById( Long.parseLong(arg)) ;
    } catch (Exception e) {
        return getByName(arg)
    }
}
这样做的一个缺点是,如果使用招摇过市的文档,您将不再为每条路线提供单独的文档。
您还必须为每个冲突的路由组单独执行此操作

有没有一种方法可以在不破坏文档的情况下向所有端点添加类似的功能,而不是逐个添加?

尝试使用

当多条路线匹配时,应选择第一条要匹配的路线

GET   /items/$id<[0-9]+>    controllers.Items.getById(id: Long)
GET   /items/$name<[a-zA-Z]+>    controllers.Items.getByName(name)
GET   /items/:name    controllers.Items.getByName(name)