Scala Play 2.3 WS.url(...) 配置错误

Scala Play 2.3 WS.url(...) Configuration Error

我正在尝试对另一台服务器进行简单的、未经身份验证的 WS 调用 我们的内部网络,但如果没有 得到关于

的 NoSuchMethodException

AsyncHttpClientConfig$Builder.setConnectionTimeoutInMs(I)AsyncHttpClientConfig$Builder;

完整堆栈跟踪:

[error] Uncaught exception when running app.controllers.WSSuite:
java.lang.NoSuchMethodError: com.ning.http.client.AsyncHttpClientConfig$Builder.setConnectionTimeoutInMs(I)Lcom/ning/http/client/AsyncHttpClientConfig$Builder;
sbt.ForkMain$ForkError: com.ning.http.client.AsyncHttpClientConfig$Builder.setConnectionTimeoutInMs(I)Lcom/ning/http/client/AsyncHttpClientConfig$Builder;
  at play.api.libs.ws.ning.NingAsyncHttpClientConfigBuilder.configureWS(NingAsyncHttpClientConfigBuilder.scala:45)
  at play.api.libs.ws.ning.NingAsyncHttpClientConfigBuilder.build(NingAsyncHttpClientConfigBuilder.scala:28)
  at app.controllers.WSSuite.<init>(NotificationActionsSuite.scala:110)
  at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
  at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) 
  at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
  at java.lang.reflect.Constructor.newInstance(Constructor.java:422)
  at java.lang.Class.newInstance(Class.java:442)
  at org.scalatest.tools.Framework$ScalaTestTask.execute(Framework.scala:641)
  at sbt.ForkMain$Run.call(ForkMain.java:294)
  at sbt.ForkMain$Run.call(ForkMain.java:284)
  at java.util.concurrent.FutureTask.run(FutureTask.java:266)
  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
  at java.lang.Thread.run(Thread.java:745)

build.sbt

...

libraryDependencies ++= Seq(
  "org.postgresql" % "postgresql" % "9.3-1100-jdbc4",
  "org.flywaydb" % "flyway-sbt" % "3.0",
  "org.dbunit" % "dbunit" % "2.5.0" % "test",
  "org.scalatest" %% "scalatest" % "2.2.1" % "test",
  "org.scalatestplus" %% "play" % "1.2.0" % "test",
  "org.jdom" % "jdom" % "1.1.2"  notTransitive(),
  "org.pac4j" % "play-pac4j_scala2.11"  % "1.4.0",
  "org.pac4j" % "pac4j-http" % "1.7.0",
  "jp.t2v" %% "play2-auth"      % "0.13.2",
  "jp.t2v" %% "play2-auth-test" % "0.13.2" % "test",
  "javax.jms" % "javax.jms-api" % "2.0.1",
  "org.apache.activemq" % "activemq-all" % "5.11.1",
  "io.gatling.highcharts" % "gatling-charts-highcharts" % "2.1.7" % "test",
  "io.gatling"            % "gatling-test-framework"    % "2.1.7" % "test",
  jdbc,
  anorm,
  ws
)

lazy val root = (project in file("."))
  .enablePlugins(PlayScala)

...

project/plugins.sbt

...
addSbtPlugin("com.typesafe.play" % "sbt-plugin" % "2.3.10") // It works from Play 2.3.2
...

test/app/controllers/WSSuite.scala

import play.api.libs.ws.WS
import scala.concurrent.ExecutionContext.Implicits.global 
import org.scalatestplus.play.{OneAppPerSuite, PlaySpec}
import play.api.Play.current
class WSSuite extends PlaySpec with OneAppPerSuite 
{
  "WS library" should {
    "Hit an external web service" in {
      WS.url("http://www.google.com").get().map { response =>
        println("Body: " + response.body)
      }
    }
  }
}

我不知道如何解决这个问题,因为 Play Docs 指出这个 应该可以正常工作。

相关文档:https://www.playframework.com/documentation/2.3.x/ScalaWS

您不能在同一项目中使用 Play 2.3 和 Gatling 2.1,因为 AsyncHttpClient 的版本存在冲突。

Play 2.3 需要 AHC 1.8,而 Gatling 2.1 需要 AHC 1.9。

要么升级到 Play 2.4,其中 AHC 依赖项已升级,要么将 Gatling 测试移至类路径不会冲突的单独项目或模块。