我正在尝试创建一个控制器,该控制器从存档中提取文件,然后将其呈现为带有默认资产控制器的静态资产
import play.api.Play.current
// import controllers.Assets
import play.api.Logger
import myextract.Extract
import scala.concurrent.{ExecutionContext, Future}
import play.api.libs.concurrent.Execution.Implicits.defaultContext
object MyAssets extends Controller {
// drop the version and serve the asset
def at(path: String, file: String): Action[AnyContent] = Action.async {
Logger.info("looking for file = %s" format file)
val ret = Future {
Extract.getFile(path, file) // extracts file from an archive
// throws exception if file cannot be extracted
}
ret.map {
v => Assets.at(path, file)
}
}
}
我在compile
得到这些错误 ./activator compile
[info] Loading project definition from /home/sylvain/yo-scala/project
[info] Set current project to play-slick-advanced (in build file:/home /sylvain/yo-scala/)
[info] Compiling 1 Scala source and 1 Java source to /home/sylvain/yo-scala/target/scala-2.11/classes...
[error] /home/sylvain/yo-scala/app/controllers/MyAssets.scala:14: overloaded method value async with alternatives:
[error] (block: play.api.mvc.Request[play.api.mvc.AnyContent] => scala.concurrent.Future[play.api.mvc.Result])play.api.mvc.Action[play.api.mvc.AnyContent] <and>
[error] (block: => scala.concurrent.Future[play.api.mvc.Result])play.api.mvc.Action[play.api.mvc.AnyContent]
[error] cannot be applied to (scala.concurrent.Future[play.api.mvc.Action[play.api.mvc.AnyContent]])
[error] def at(path: String, file: String): Action[AnyContent] = Action.async {
[error]
[error] one error found
[error] (compile:compile) Compilation failed
您必须确保您的操作返回Future
:
import play.api.Play.current
// import controllers.Assets
import play.api.Logger
import myextract.Extract
import scala.concurrent.{ExecutionContext, Future}
import play.api.libs.concurrent.Execution.Implicits.defaultContext
object MyAssets extends Controller {
// drop the version and serve the asset
def at(path: String, file: String): Action[AnyContent] = Action.async {
Logger.info("looking for file = %s" format file)
val ret = Future {
Extract.getFile(path, file) // extracts file from an archive
// throws exception if file cannot be extracted
}
ret.map {
v => scala.concurrent.Future {Assets.at(path, file)}
}
}
}
或者将其更改为不再是async
:
import play.api.Play.current
// import controllers.Assets
import play.api.Logger
import myextract.Extract
import scala.concurrent.{ExecutionContext, Future}
import play.api.libs.concurrent.Execution.Implicits.defaultContext
object MyAssets extends Controller {
// drop the version and serve the asset
def at(path: String, file: String): Action[AnyContent] = Action {
Logger.info("looking for file = %s" format file)
val ret = Future {
Extract.getFile(path, file) // extracts file from an archive
// throws exception if file cannot be extracted
}
ret.map {
v => Assets.at(path, file)
}
}
}