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
定义为:
上述用类替换对象定义解决了问题
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 系统创建
迁移到 2.4.x (Java) 后在 Play Framework 中运行测试时出错
Play Framework [2.4.x] - 模块路由特定名称因“资产不是包的成员”而失败
Play 2.4.x 中是不是有一个方便的助手可以从 play.api.mvc.Request.queryString 构建一个 uri