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

Play Framework [2.4.x] how to address public assets in a sub module's routing file

前一个问题可以作为 "submodules" 对当前讨论的意义的基线:

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

每当我尝试进行基本输入(如下所示)时,我的整个根模块都无法编译单个路由,但我没有收到任何 "usable" 错误或其他关于可能发生的事情的指示。

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: 是的,我也试过从 root 的路由文件中取出条目,以防它只是一个名称 space 冲突...

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

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