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

【讨论】:

在主路由文件(主项目的路由感觉)中,我有一个小宝石:-&gt; /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 系统创建

Play Framework 2.4.x 自定义部署脚本

迁移到 2.4.x (Java) 后在 Play Framework 中运行测试时出错

Play Framework [2.4.x] - 模块路由特定名称因“资产不是包的成员”而失败

Play Framework:如何不查看文件夹以了解 Play Framework 中的更改

如何构建版本独立的 Play!Framework 2 模块?