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

Posted

技术标签:

【中文标题】Play Framework [2.4.x] - 模块路由特定名称因“资产不是包的成员”而失败【英文标题】:Play Framework [2.4.x] - Module route specific name fails with `Assets is not a member of package` 【发布时间】:2015-11-29 16:31:38 【问题描述】:

我尝试使用标准路由文件conf/routes 提供可包含在 Play 应用程序中的模块特定路由:

-> /psmod1 com.escalesoft.psmod1.ctrl.Routes

得到编译错误:

类型 Psmod1Assets 不是包的成员 com.escalesoft.psmod1.ctrl

为了做到这一点,我按照Assets and controller classes should be all defined in the controllers.admin package官方文档中的说明执行了两个步骤

1.在自己的包中定义资产和控制器类

将资产类 Psmod1Assets.scala 定义为:

包 com.escalesoft.psmod1.ctrl 导入 play.api.http.LazyHttpErrorHandler object class Psmod1Assets 扩展了 controllers.AssetsBuilder(LazyHttpErrorHandler)

上述用类替换对象定义解决了问题

2。拆分路由文件

将模块特定的路由文件/conf/com.escalesoft.psmod1.ctrl.routes定义为:

# Routes
# Home page
GET   /                com.escalesoft.psmod1.ctrl.Application.index

# Map static resources from the /public folder to the /assets URL path    
GET   /assets/*file    com.escalesoft.psmod1.ctrl.Psmod1Assets.versioned(path="/public", file: Asset)

如果你喜欢你可以在github上查看或克隆我的小测试项目的代码:

在线:https://github.com/refond/psmod1/tree/routing_issue 使用 git:git clone -b routing_issue https://github.com/refond/psmod1.git

项目使用标准controllers.Assets配置为工作。 转到/conf/com.escalesoft.psmod1.ctrl.routes文件(在com.escalesoft.psmod1.ctrl.routes查看),将controllers.Assets行替换为com.escalesoft.psmod1.ctrl.Psmod1Assets行,重现编译错误。

我已经检查了以下资源:

看起来像重复,但批准的答案不能解决当前问题Play Framework [2.4.x] how to address public assets in a sub module's routing file 有趣但已过时:http://www.objectify.be/wordpress/?p=363 一般https://www.playframework.com/documentation/2.4.x/Modules

【问题讨论】:

Psmod1Assets 定义中的对象而不是类是罪魁祸首!正如***.com/questions/32595309/…中akauppi的评论所指出的那样 【参考方案1】:

Assets class Psmod1Assets.scala 定义必须是......一个类而不是一个对象:

包 com.escalesoft.psmod1.ctrl 导入 play.api.http.LazyHttpErrorHandler Psmod1Assets 类扩展了 controllers.AssetsBuilder(LazyHttpErrorHandler)

这与 Play 2.4 推荐的 InjectedRoutesGenerator 设置有关,该设置要求构建的资产是一个从依赖注入中受益的类。请参阅ScalaRouting#Dependency-Injection的官方文档

请注意,官方文档似乎与此更改不完全一致,但仍可能声明 object 而不是 class: https://www.playframework.com/documentation/2.4.x/SBTSubProjects#Assets-and-controller-classes-should-be-all-defined-in-the-controllers.admin-package

我在问题描述中提到的 github 上的小型测试项目未更新为使用自定义 com.escalesoft.psmod1.ctrl.Psmod1Assets

【讨论】:

以上是关于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 2.4.x - 资产复制

Play 2.4.x 中是不是有一个方便的助手可以从 play.api.mvc.Request.queryString 构建一个 uri