Play Framework [2.4.x]如何在子模块的路由文件中处理公共资产

Tec*_*mag 5 playframework playframework-2.4

此前一个问题可以作为"子模块"对于当前讨论的意义的基线:Play Framework [2.4.x]使用子模块

如果您了解Play子模块,那么给定该上下文如何进入子模块上的路由条目以公开"public"文件夹中的资产?

每当我尝试创建一个基本条目(如下所示)时,我的整个根模块都无法编译单个路由,但我没有得到"可用"错误或其他可能发生的指示.

GET   /assets/*file  controllers.Assets.at(path="/public", file)
Run Code Online (Sandbox Code Playgroud)

即使我注释掉根项目中的条目,也会发生编译器错误.

由于我所有的子模块控制器都有一个前缀我试过(当然)

GET   /assets/*file  controllers.submodule.Assets.at(path="/public", file)
Run Code Online (Sandbox Code Playgroud)

唉,这也不起作用,但至少我得到一个有用的错误告诉我 type Assets is not a member of package controllers.submodule

有什么建议?

PS:是的我还尝试从root的路由文件中取出条目,以防它只是一个名称空间冲突...

Max*_*ime 4

您必须在子模块控制器包中创建资产控制器:

package controllers.submodule

class Assets extends AssetsBuilder(DefaultHttpErrorHandler)
Run Code Online (Sandbox Code Playgroud)

然后在子模块的路由器文件(应命名为 submodule.routes)中声明此控制器的路由:

GET    /submodule/public/*file    controllers.submodule.Assets.versioned(path="/public", file: Asset)
Run Code Online (Sandbox Code Playgroud)

最好在路由中添加子模块的名称前缀,以避免路由冲突,以防万一您有其他带有静态路由条目的子模块名称。

另一件事:所有静态文件都托管在根模块的“lib”文件夹中:

lib/submodule/css...
lib/submodule/js...
Run Code Online (Sandbox Code Playgroud)

所以你必须像这样更新你的观点:

<script type="text/javascript" src="@controllers.submodule.routes.Assets.versioned("lib/submodule/js/your-submodule-script.js")"></script>
Run Code Online (Sandbox Code Playgroud)

编辑:不要忘记将其添加到根模块的路由文件(命名路由)中

-> / submodule.routes
Run Code Online (Sandbox Code Playgroud)

  • 你的回答对我很有帮助。但是,我建议检查两个细节:a)最后的路线缺少斜杠,对吧?应该是“-&gt;/submodule.routes”。b) “object Assets ...”意味着不使用 InjectedRoutesGenerator 设置,现在推荐使用该设置(Play 2.4)。对于 InjectedRoutesGenerator,它需要“class Assets ...”才能编译。 (2认同)
  • @akauppi 你的评论的b)点帮助我解决了我的问题,如http://stackoverflow.com/questions/33985108/play-framework-2-4-x-module-route-specific-name-fails-with-中所述asset-is-not-a 请随意将其作为我问题的答案,我会很高兴承认这一点。 (2认同)