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

时间:2015-09-04 18:50:08

标签: web-services scala playframework-2.0

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

的NoSuchMethodException

AsyncHttpClientConfig $ Builder.setConnectionTimeoutInMs(I)AsyncHttpClientConfig $生成器;

完整堆栈跟踪:

[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$2.call(ForkMain.java:294)
  at sbt.ForkMain$Run$2.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)

...

项目/ plugins.sbt

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

测试/应用/控制器/ 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

1 个答案:

答案 0 :(得分:2)

由于AsyncHttpClient版本存在冲突,因此无法在同一项目中使用Play 2.3和Gatling 2.1。

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

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