如何在play 2.3中尝试修改anorm代码

时间:2015-03-10 02:13:23

标签: playframework anorm

我正在从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()方法。

1 个答案:

答案 0 :(得分:0)

因此,您的代码似乎会引发与issue #14相同的误用:永远不应在没有参数的情况下调用批处理。

下一个版本将阻止此类通话。