为什么 Play 项目在升级到 Slick 3.0 后失败并显示 "implicit value ... is not applicable here"?
Why does Play project fail with "implicit value ... is not applicable here" after upgrading to Slick 3.0?
升级到 Slick 3.0 后开始玩吧! 2.4,我得到了这个漂亮的依赖注入特性,但是我遇到了序列化问题。
我的应用程序是简单的休息服务器。
这是我得到的异常
type mismatch;
found : play.api.libs.json.OWrites[ReportsDatabase.this.PostEntity]
required: play.api.libs.json.Writes[ApiRoot.this.noiseModel.PostEntity]
Note: implicit value PostWrites is not applicable here because it comes after the application point and it lacks an explicit result type
这是我的实体
val posts = TableQuery[Posts]
case class PostEntity(id: Long, user: Long, text: String, date: LocalDate, lat: Double, lon: Double, pictureID: Long, soundId: Long)
class Posts(tag: Tag) extends Table[PostEntity](tag, "post") {
implicit val dateColumnType = MappedColumnType.base[LocalDate, String](dateFormatter.print(_), dateFormatter.parseLocalDate)
def id = column[Long]("id", O.AutoInc, O.PrimaryKey)
def userId = column[Long]("userId")
def text = column[String]("text")
def date = column[LocalDate]("date_post")
def lat = column[Double]("lat")
def lon = column[Double]("lon")
def pictureId = column[Long]("pictureID")
def soundId = column[Long]("soundId")
def * = (id, userId, text, date, lat, lon, pictureId, soundId) <>(PostEntity.tupled, PostEntity.unapply)
def user = foreignKey("post_user_FK", userId, users)(_.id)
}
这是获取帖子列表的方法
def getPostList: Future[Seq[PostEntity]] = db.run(posts.result)
我的控制器是这样启动的
class ApiRoot @Inject() (noiseDao: NoiseModel, noiseModel: ReportsDatabase) extends Controller {
import noiseModel._
implicit val PostWrites = Json.writes[noiseModel.PostEntity]
def getPostStream = Action.async { implicit request =>
noiseDao.getPostList.map{posts =>
Ok(toJson(posts))
}
}
def getPost(id: Long) = Action.async { implicit request =>
noiseDao.getPost(id).map{ post =>
Ok(toJson(post))
}
}
我尚未在 Internet 上找到有关此问题的任何信息。找到问题,但没有答案。
我的猜测是将 implicit val PostWrites
移动到伴随对象 Posts
或更靠近 DI 库(不太了解 Play 以提供更多帮助)。
它的发生是因为 DI 的一般工作方式 - 首先是一个实例,然后实例中的所有好东西都可用。
我在将我的应用程序升级到 Play 时遇到了完全相同的问题! 2.4.如果您为您的实体使用灵活的代码生成器,您需要创建一个自定义生成器,就像这个答案中的那样
升级到 Slick 3.0 后开始玩吧! 2.4,我得到了这个漂亮的依赖注入特性,但是我遇到了序列化问题。 我的应用程序是简单的休息服务器。
这是我得到的异常
type mismatch;
found : play.api.libs.json.OWrites[ReportsDatabase.this.PostEntity]
required: play.api.libs.json.Writes[ApiRoot.this.noiseModel.PostEntity]
Note: implicit value PostWrites is not applicable here because it comes after the application point and it lacks an explicit result type
这是我的实体
val posts = TableQuery[Posts]
case class PostEntity(id: Long, user: Long, text: String, date: LocalDate, lat: Double, lon: Double, pictureID: Long, soundId: Long)
class Posts(tag: Tag) extends Table[PostEntity](tag, "post") {
implicit val dateColumnType = MappedColumnType.base[LocalDate, String](dateFormatter.print(_), dateFormatter.parseLocalDate)
def id = column[Long]("id", O.AutoInc, O.PrimaryKey)
def userId = column[Long]("userId")
def text = column[String]("text")
def date = column[LocalDate]("date_post")
def lat = column[Double]("lat")
def lon = column[Double]("lon")
def pictureId = column[Long]("pictureID")
def soundId = column[Long]("soundId")
def * = (id, userId, text, date, lat, lon, pictureId, soundId) <>(PostEntity.tupled, PostEntity.unapply)
def user = foreignKey("post_user_FK", userId, users)(_.id)
}
这是获取帖子列表的方法
def getPostList: Future[Seq[PostEntity]] = db.run(posts.result)
我的控制器是这样启动的
class ApiRoot @Inject() (noiseDao: NoiseModel, noiseModel: ReportsDatabase) extends Controller {
import noiseModel._
implicit val PostWrites = Json.writes[noiseModel.PostEntity]
def getPostStream = Action.async { implicit request =>
noiseDao.getPostList.map{posts =>
Ok(toJson(posts))
}
}
def getPost(id: Long) = Action.async { implicit request =>
noiseDao.getPost(id).map{ post =>
Ok(toJson(post))
}
}
我尚未在 Internet 上找到有关此问题的任何信息。找到问题,但没有答案。
我的猜测是将 implicit val PostWrites
移动到伴随对象 Posts
或更靠近 DI 库(不太了解 Play 以提供更多帮助)。
它的发生是因为 DI 的一般工作方式 - 首先是一个实例,然后实例中的所有好东西都可用。
我在将我的应用程序升级到 Play 时遇到了完全相同的问题! 2.4.如果您为您的实体使用灵活的代码生成器,您需要创建一个自定义生成器,就像这个答案中的那样