我有一个Play 2.5.3应用程序,它使用Slick从DB读取对象。 服务类按以下方式构建:
class SomeModelRepo @Inject()(protected val dbConfigProvider: DatabaseConfigProvider) {
val dbConfig = dbConfigProvider.get[JdbcProfile]
import dbConfig.driver.api._
val db = dbConfig.db
...
现在我需要一些独立的Scala脚本来在后台执行某些操作。我需要连接到其中的数据库,我想重用我现有的服务类来从DB中读取对象。
要实例化SomeModelRepo类'对象,我需要传递一些DatabaseConfigProvider作为参数。我试着跑:
object SomeParser extends App {
object testDbProvider extends DatabaseConfigProvider {
def get[P <: BasicProfile]: DatabaseConfig[P] = {
DatabaseConfigProvider.get("default")(Play.current)
}
}
...
val someRepo = new SomeModelRepo(testDbProvider)
但是我在“(Play.current)”行中有一个错误:“没有启动的应用程序”。此外,对象Play中的当前方法已被弃用,应替换为DI。
有没有办法在独立对象SomeParser中初始化我的SomeModelRepo类'对象?
祝你好运
答案 0 :(得分:0)
当您启动Play应用程序时,PlaySlick模块会为您处理Slick配置。有了它,你有two choices:
DatabaseConfigProvider
并从那里获取驱动程序,或DatabaseConfigProvider.get[JdbcProfile](Play.current)
进行全局查询,这不是首选。无论哪种方式,您都必须运行Play应用!由于您的独立脚本不是这种情况,您会收到错误:“没有启动的应用程序”。
因此,您必须使用Slick的默认方法,直接从config实例化db
:
val db = Database.forConfig("default")
你在Lightbend's templates有很多例子。
编辑:抱歉,我没有看完整个问题。你真的需要将它作为另一个应用程序吗?您可以在应用启动时运行后台操作,例如here。在此示例中,InitialData
类被实例化为eager singleton,因此在应用启动时会立即运行insert()方法。