如何使这个play scala控制器工作



我正在尝试创建一个控制器,该控制器从存档中提取文件,然后将其呈现为带有默认资产控制器的静态资产

    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) 
            }
          }
        }

最新更新