Почему сбой проекта Play с неявным значением здесь неприменим после обновления до Slick 3.0?

После обновления до Slick 3.0 и Play! 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))
  }

}

Я не нашел никакой информации в Интернете по этой проблеме. Нашел вопросы, но никаких ответов.


person green-creeper    schedule 15.08.2015    source источник


Ответы (2)


Я предполагаю, что нужно переместить implicit val PostWrites в объект-компаньон Posts или ближе к DI-библиотеке (не знаю, как много играть, чтобы предложить дополнительную помощь).

Происходит это из-за того, как вообще работает DI — сначала инстанс, а потом уже доступны все плюшки, которые внутри инстанса.

person Jacek Laskowski    schedule 17.08.2015

У меня была точно такая же проблема при обновлении моего приложения до Play! 2.4. Если вы используете генератор кода для своих сущностей, вам нужно создать собственный генератор, подобный тому, что в этом ответе https://stackoverflow.com/a/32070115

person Fabrizio Fortino    schedule 01.12.2015