【问题标题】:Play framework - make form validation async - compilation error播放框架 - 使表单验证异步 - 编译错误
【发布时间】:2020-06-22 17:07:05
【问题描述】:

尝试使用 map(第 6 行)而不是使用 Await(第 3-4 行)会导致编译显示无法解析重载方法“Action”标记第一行。 我认为问题出在使用 fold 的函数的最后一行,它现在有另一个从 errorFunction 返回的值类型。 有人可以帮助了解正在发生的事情以及如何使创建用户完全异步吗?

def createUser = Action { implicit request: MessagesRequest[AnyContent] =>
    val errorFunction = { formWithErrors: Form[Data] =>
      val readAllResponse = Await.result(usersDao.readAll(), Duration.Inf)
      BadRequest(views.html.listUsers(readAllResponse, formWithErrors, postUrl))
      // TODO - try to make it async.
      // usersDao.readAll().map(allUsersList => BadRequest(views.html.listUsers(allUsersList, formWithErrors, postUrl)))
    }

    val successFunction = { data: Data =>
      val user = User(id = data.id, firstName = data.firstName, lastName = data.lastName)
      // call to DAO
      val createUsers: Future[User] = usersDao.create(user)
      Redirect(routes.UserController.listUsers()).flashing("Info" -> "user added!")
    }

    val formValidationResult = form.bindFromRequest
    formValidationResult.fold(errorFunction, successFunction)
  }

readAll() 的代码:

def readAll()(implicit transaction: Transaction[User]): Future[List[User]] = Future {
        println(s"Reading all users...")
        Thread.sleep(500)
        transaction.modelObjectsList.toList
      }

错误(取消注释第 6 行时):

编译错误[类型不匹配; 找到:play.api.data.Form[controllers.UserForm.Data] => scala.concurrent.Future[play.api.mvc.Result] 必需:play.api.data.Form[controllers.UserForm.Data] => play.api.mvc.Result]

【问题讨论】:

  • 建议先阅读文档

标签: scala playframework


【解决方案1】:

编译失败,因为您使用的是同步操作,并传递了一个 Future。要使该行正常工作,您需要将 Action 更改为 async Action,它应该像这样简单:

Action.async {/*your code here*/}

【讨论】:

  • 现在有:类型不匹配;找到:controllers.UserForm.Data => play.api.mvc.Result 需要:controllers.UserForm.Data => scala.concurrent.Future[play.api.mvc.Result]
  • 您是否更改为 Action.async 并取消注释该行?
  • 啊,我明白了,你还需要在你的成功函数中返回一个 Future,尝试用一个 Future 包装 Redirect 部分
  • 谢谢,工作。更一般的问题:操作本质上不应该是异步的?
  • 我现在在successFunction中有以下内容:usersDao.create(user).map(_ => Redirect(routes.UserController.listUsers()).flashing("Info" -> "user added!")) create 可能会抛出异常,你将如何处理(保持所需的返回值类型)?
猜你喜欢
  • 1970-01-01
  • 2015-08-14
  • 2012-04-16
  • 1970-01-01
  • 1970-01-01
  • 2014-07-29
  • 2014-03-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多