【问题标题】:scala slick does not persist datascala slick 不持久化数据
【发布时间】:2017-06-08 22:49:04
【问题描述】:

我有以下代码不起作用...不起作用意味着在这种情况下它不会持久存在于数据库中......

DTO/DAO

  def createChangelogEntry(changeLog: ChangelogModel): Future[ChangelogModel] = {
    println("..........................................")
    println(changeLog)

    val entry =
      (changelogs returning changelogs.map(_.id)
        into ((log,id) => log.copy(id=Some(id)))
        ) += ChangelogModel(None, changeLog.createdat, changeLog.text)

    db.run(entry)
  }

在这种情况下可能会出现什么问题?模型上的匹配效果很好......

U更新:

SQL:

CREATE TABLE Changelog (
  id BIGINT(255) NOT NULL,
  createdat DATETIME NOT NULL,
  text text NOT NULL
)ENGINE=InnoDB DEFAULT CHARSET=utf8;

我的模特:

package models

import java.sql.Date

import play.api.libs.json.{JsValue, Json, Writes}

/**
  * Created by Felix Hohlwegler on 08.06.2017.
  */
case class ChangelogModel(
                           id: Option[Int] = None,
                           createdat: String,
                           text: String
                         )

object ChangelogModel {
  implicit val changelogFormat = Json.format[ChangelogModel]
}

控制器功能:

package controllers

import javax.inject.{Inject, Singleton}

import dto.changelogDTO
import models.{ChangelogModel, ProcessTemplatesModel}
import play.api.libs.json.{JsError, JsSuccess, Json}
import play.api.mvc.{Action, AnyContent, Controller, Request}

import scala.concurrent.Future

/**
  * Created by Felix Hohlwegler on 08.06.2017.
  */
@Singleton
class Changelogs @Inject()(changelogDTO: changelogDTO) extends Controller {

  def createChangelogEntry = Action { implicit request =>
    request.body.asJson.map(_.validate[ChangelogModel] match {
      case JsSuccess(process, _) =>
        changelogDTO.createChangelogEntry(process)
      case err@JsError(_) => BadRequest("TEST")
      case _ => BadRequest("fail to create Counter")
    }).getOrElse(BadRequest("Failure tu create Counter"))
    Ok("s")
  }
}

【问题讨论】:

  • 并且没有抛出异常?
  • 没有绝对没有什么看起来像它可以正常工作...但是数据库是空的...
  • 你能发布你的配置吗?
  • 更新上面的代码
  • 在您的控制器函数中的第一个案例语句中,您无需等待 changelogDTO.createChangelogEntry 完成

标签: scala playframework slick


【解决方案1】:

一个问题是您没有等待从控制器完成插入:

// Problem
case JsSuccess(process, _) => changelogDTO.createChangelogEntry(process)

您应该像这样映射未来并异步返回其结果:

// Do this
case JsSuccess(process, _) => changelogDTO.createChangelogEntry(process).map(model => Ok(Json.toJson(model))

但是,这意味着您还需要所有其他情况来返回期货,并且您必须将结果操作更改为异步操作。我会这样做:

def createChangelogEntry = Action.async(parse.json) { implicit request =>
  request.body.validate[ChangelogModel].fold(
    errors => Future(BadRequest(JsError.toJson(errors))),
    changelogModel => changelogDTO.createChangelogEntry(changelogModel).map(model => Ok(Json.toJson(model))
  )
}

与此同时,您可能会发现只需将当前插入内容包装在 Await.result 中即可更轻松地进行调试,如下所示:

import scala.concurrent.duration._

case JsSuccess(process, _) => 
  val model = Await.result(changelogDTO.createChangelogEntry(process), 5 seconds)
  Ok("We inserted the thing")

【讨论】:

  • Await 是不推荐使用的旧样式 .... 有许多其他插件无需等待即可完美运行 ...
  • "在此期间,您可能会发现只需将当前插入包装在 Await 中即可更容易调试"
  • 没有其他解决办法吗?
  • 代码的所有分支都需要有一个共同的返回类型。如果您的代码的一个分支返回Future,那么您将必须使所有其他分支也返回期货。在您的原始控制器函数中,您没有收到编译器警告,因为您将 Ok("s") 放在最后,这将是返回,同时您正在尝试调用您的 DAO 函数但完全忽略了异步结果
  • 错误告诉你如何修复它import scala.concurrent.ExecutionContext.Implicits.global
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多