我正在从Play迁移我的应用程序! 2.1至2.3。
编译错误消失了,几乎没有失败的测试。
其中一个是Anorm相关的。
[error] NullPointerException: (BatchSql.scala:100)
[error] anorm.BatchSql$class.execute(BatchSql.scala:100)
[error] anorm.BatchSql$Copy.execute(BatchSql.scala:193)
[error] models.StoreUser$.insertByCsv(User.scala:314)
听起来我需要破解Anorm代码。我查阅以下页面来编译Play!来自消息来源:
https://www.playframework.com/documentation/2.3.x/BuildingFromSource
$ git clone git://github.com/playframework/playframework.git
$ cd playframework
$ git checkout remotes/origin/2.3.x
作为一个起点,我试图更改playframework / framework / src / anorm / src / main / scala / anorm / BatchSql.scala
def execute()(implicit connection: Connection): Array[Int] = {
val s = getFilledStatement(connection)
println("*** statement = " + s)
Thread.sleep(30000)
s.executeBatch()
}
在本地编译和发布:
$ PLAY_OPTS=-Dscala.version=2.11.6 ./build clean publish-local
删除我的常春藤缓存:
$ rm -rf ~/.ivy2/cache
更改项目的项目/ plugins.sbt:
//addSbtPlugin("com.typesafe.play" % "sbt-plugin" % "2.3.8")
addSbtPlugin("com.typesafe.play" % "sbt-plugin" % "2.3-SNAPSHOT")
Build.sbt文件:
libraryDependencies ++= Seq(
"postgresql" % "postgresql" % "9.1-901.jdbc4",
"com.typesafe.play" %% "play-mailer" % "2.4.0",
...
jdbc,
// anorm,
"com.typesafe.play" %% "anorm" % "2.3-SNAPSHOT",
cache,
ws,
filters
)
重新加载我的项目并再次测试我的失败测试。
但是没有显示打印信息('*** statement = xxx'“)。
如何使用我修改的Anorm代码?
更新
我git只从https://github.com/playframework/anorm克隆了anorm并调用了publish-local。这样,现在我可以在Play中使用我自己编译的anorm!根本原因是最新版本的anorm在调用批量查询时需要至少一个参数列表(https://github.com/playframework/anorm/blob/master/docs/manual/working/scalaGuide/main/sql/ScalaAnorm.md)。
Batch update must be called with at least one list of parameter. If a batch is executed with the mandatory first list of parameter being empty (e.g. Nil), only one statement will be executed (without parameter), which is equivalent to SQL(statement).executeUpdate().
如果没有提供参数,将抛出NPE。如果参数列表为空,我修复了我的应用程序不调用execute()方法。