Play Framework [2.4.x] 如何在子模块的路由文件中处理公共资产
Posted
技术标签:
【中文标题】Play Framework [2.4.x] 如何在子模块的路由文件中处理公共资产【英文标题】:Play Framework [2.4.x] how to address public assets in a sub module's routing file 【发布时间】:2015-09-15 20:46:11 【问题描述】:上一个问题可以作为当前讨论的“子模块”含义的基线:Play Framework [2.4.x] Working with Sub Modules
如果您了解 Play 子模块,那么在给定上下文的情况下,如何在子模块上输入路由条目以公开“公共”文件夹中的资产?
每当我尝试创建一个基本条目(如下所示)时,我的整个根模块都无法编译单个路由,但我没有收到“可用”错误或其他指示可能发生的情况。
GET /assets/*file controllers.Assets.at(path="/public", file)
即使我注释掉根项目中的条目,也会出现编译器错误。
因为我所有的子模块控制器都有一个前缀,所以我尝试了(当然)
GET /assets/*file controllers.submodule.Assets.at(path="/public", file)
唉,这也不起作用,但至少我收到一个有用的错误,告诉我type Assets is not a member of package controllers.submodule
有什么建议吗?
PS:是的,我也尝试从根的路由文件中取出条目,以防它只是名称空间冲突......
【问题讨论】:
【参考方案1】:你必须在你的子模块控制器包中创建一个 Assets 控制器:
package controllers.submodule
class Assets extends AssetsBuilder(DefaultHttpErrorHandler)
然后在你的子模块的路由文件(应该命名为 submodule.routes)中为这个控制器声明一个路由:
GET /submodule/public/*file controllers.submodule.Assets.versioned(path="/public", file: Asset)
最好在路由前加上子模块的名称,以避免路由冲突,以防您有其他子模块名称与静态路由条目。
还有一件事:所有静态文件都托管在根模块的“lib”文件夹中:
lib/submodule/css...
lib/submodule/js...
所以你必须像这样更新你的观点:
<script type="text/javascript" src="@controllers.submodule.routes.Assets.versioned("lib/submodule/js/your-submodule-script.js")"></script>
编辑:不要忘记将此添加到根模块的路由文件(命名路由)中
-> / submodule.routes
【讨论】:
在主路由文件(主项目的路由感觉)中,我有一个小宝石:-> /submoduleNAME submodule.Routes
,它基本上从外部角度给出了子模块的别名。好奇这是否适用,但大声思考我怀疑这甚至不重要......
在哪里可以找到错误处理程序? not enough arguments for constructor AssetsBuilder: (errorHandler: play.api.http.HttpErrorHandler)controllers.AssetsBuilder.
我没有提到它,但是是的,您必须将此行添加到根模块的路由文件中。我刚刚编辑了我的答案
您的回答对我很有帮助。但是,我建议研究两个细节:a)最后的路线缺少斜线,对吗?应该是“->/submodule.routes”。 b) 'object Assets ...' 暗示不使用 InjectedRoutesGenerator 设置,现在(Play 2.4)推荐。使用 InjectedRoutesGenerator 它需要是 'class Assets ...' 才能编译。
@akauppi point b) 您的评论帮助我解决了***.com/questions/33985108/… 中所述的问题,请随意将其作为我问题的答案,我很乐意承认。以上是关于Play Framework [2.4.x] 如何在子模块的路由文件中处理公共资产的主要内容,如果未能解决你的问题,请参考以下文章
Play Framework 2.4.x - 覆盖默认的 Actor 系统创建
迁移到 2.4.x (Java) 后在 Play Framework 中运行测试时出错
Play Framework [2.4.x] - 模块路由特定名称因“资产不是包的成员”而失败