0

I am doing a tutorial for Play framework with Scala. I am quite early into the tutorial and i am having a problem with ws. In my class WS is not recognized although that says to use WS.url("url-here") and to import play.api.libs._ which i have done both. I have also tried using ws.url("url-here") as well... and here wsis recognized but after that i get a "can't resolve symbol 'url'". Here is my build.sbt:

name := """play_hello"""
organization := "x.x"

version := "1.0-SNAPSHOT"

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

scalaVersion := "2.12.3"

libraryDependencies ++= Seq(
"org.scalatestplus.play" %% "scalatestplus-play" % "3.1.2" % Test,
"com.ning" % "async-http-client" % "1.9.29",
guice,
ws
)

And here is the code for my class:

package controllers

import javax.inject.Inject

import com.ning.http.client.oauth.{ConsumerKey, RequestToken}
import play.api.Play.current
import play.api.libs._
import play.api.mvc._

import scala.concurrent.Future

class Application @Inject()(cc: ControllerComponents) extends 
AbstractController(cc){
 def tweets = Action.async{
credentials.map { case (consumerKey, requestToken) =>
  WS.url("http://stream.twitter.com")
  Future.successful{
    Ok
  }
}getOrElse{
  Future.successful{
    InternalServerError("Twitter credentials are missing!")
  }
}
}

def credentials: Option[(ConsumerKey, RequestToken)] = for{
apiKey <- current.configuration.getString("twitter.apiKey")
apiSecret <- current.configuration.getString("twitter.apiSecret")
token <- current.configuration.getString("twitter.token")
tokenSecret <- current.configuration.getString("twitter.tokenSecret")
}yield (
new ConsumerKey(apiKey, apiSecret),
new RequestToken(token, tokenSecret)
)
}

I Figure that most likely this is some type of problem with a dependency conflict. Here is a screenshot of ws related libraries in project structure. I would appreciate any help in finding a solution to this. Thank you.

mox_mox
  • 111
  • 2
  • 10

1 Answers1

1

The solution was to add ws: WSClient to the parameters of Application class constructor. Apperently standalone WS object has been removed in more recent versions of ws library.

class Application @Inject()(cc: ControllerComponents, ws: WSClient) extends AbstractController(cc)

Now i can use:

ws.url("https://stream.twitter.com/1.1/statuses/filter.json")

Also according to the documentation on play website if you for some reason can not use an injected WSClient, then you can create an instance of one and use that.

mox_mox
  • 111
  • 2
  • 10