我知道Play的早期版本曾用于支持路由文件中的路由和条件(如果是块),但我找不到Play 2.2.x的任何此类文档,而HTTP routing对此类功能一无所知。
我想替换它:
GET /api/users/:id com.corporate.project.controllers.UserController.get(id)
使用import
的较短版本,如下所示:
import com.corporate.project.controllers._
GET /api/users/:id UserController.get(id)
此外,路由文件中是否可以有条件? e.g。
if Play.isDev(Play.current())
GET /displayConfig DebugController.displayServerConfigs()
答案 0 :(得分:5)
过去可以通过SBT设置导入包:routesImport += "com.corporate.project.controllers._"
。不确定是否仍然如此。
此外,是否可以在路线文件中包含条件?
它可能不是一个理想的解决方案,但我们使用routes标签来处理这种条件路由。您需要一个过滤器来检查路由是否已注释并运行条件逻辑。
路线:
# @devmode
GET /displayConfig DebugController.displayServerConfigs()
过滤器:
object DevmodeRouteFilter extends Filter {
private val DevmodeAnnotation = "@devmode"
override def apply(next: RequestHeader => Future[SimpleResult])(request: RequestHeader): Future[SimpleResult] = {
if(isDevRoute(request) && !Play.isDev(Play.current()) {
Play.current.global.onHandlerNotFound(request)
} else {
next(request)
}
}
private def isDevRoute(request: RequestHeader): Boolean = {
val comments = request.tags.getOrElse(Routes.ROUTE_COMMENTS, "")
comments.lines.exists { comment =>
comment.trim == DevmodeAnnotation
}
}
}
不要忘记将过滤器添加到过滤器链中。
答案 1 :(得分:2)
感谢您提出的问题,这是一个有趣的想法,所以我去了Play2的源代码,发现我在Play.core.Router.scala中的Play 2.2.3结账:对象HandlerInvoker将控制器构造为< / p>
handlerDef.ref.getClass.getClassLoader.loadClass(handlerDef.controller)
所以我担心2.2.x中没有实现对部分类名(存储在handlerDef.controller中)的支持。
在2.3.x中有提交https://github.com/playframework/playframework/commit/ba98dabd7ba374ed98f14f721835b898d27dd55b 这带来了路由的包/命名空间的概念。
请参阅该提交中Routes.scala和RoutesCompiler.scala的更改。
但我无法在文档中找到该功能的描述,而且我现在还没有播放Play 2.3.x.
P.S。:http://java.dzone.com/articles/advanced-routing-play中描述的2.3.x高级路由的示例魔术。