Play框架Scala教程中WS.url()无法使用问题求助
Hey there, let's work through this WS problem you're facing—this is super common when starting out with Play, so we'll get it sorted quickly!
1. Fix the Dependency in build.sbt
First, the WS module isn't included by default in all Play projects, so you need to explicitly add it to your dependencies. Open your build.sbt and make sure you have this line (match the playVersion to your project's Play version):
libraryDependencies += "com.typesafe.play" %% "play-ws" % playVersion
If you're using Play's Guice dependency injection (the default setup), keep the guice dependency too—WS relies on it for injection:
libraryDependencies += guice
After updating, run sbt reload and sbt compile to pull in the new dependency.
2. Correct Your Import Statement
You mentioned importing play.api.libs._, but the WS classes live in a subpackage. Replace that import with:
import play.api.libs.ws._
This properly imports WSClient (the main class you'll use for HTTP calls) and related utilities. The old static WS class was deprecated in Play 2.6+, so we use WSClient now.
3. Use Dependency Injection for WSClient
The ws.url(...) error you're seeing is because ws needs to be an instance of WSClient, not a static reference. In Play, you get this instance via dependency injection. Here's how to implement it in a controller:
import play.api.mvc._ import play.api.libs.ws._ import javax.inject.Inject class MyController @Inject()( private val ws: WSClient, val controllerComponents: ControllerComponents ) extends BaseController { def fetchExternalData() = Action.async { implicit request => // Use the injected WSClient instance to make calls ws.url("https://your-target-url.com") .get() .map { response => Ok(s"Response status: ${response.status}, body: ${response.body}") } } }
- The
@Inject()annotation tells Play to pass in aWSClientinstance when creating your controller. - Calling
.url()on this injectedwsinstance will resolve the "无法解析符号‘url’" error.
4. Verify Application Configuration
Double-check your conf/application.conf to ensure WS is enabled (it's on by default, but it never hurts to confirm):
play.ws.enabled = true
If this was set to false, it would block WS functionality entirely.
Quick Note About Old Tutorials
If the tutorial you're following is for Play 2.5 or earlier, it might use the old static WS.url() syntax. Newer Play versions (2.6+) moved to dependency injection for WS, so you'll need to adjust the code to match current best practices.
内容的提问来源于stack exchange,提问作者mox_mox

