首页 > 解决方案 > scala.Option[java.sql.Timestamp] 在隐式范围内没有可用的 play.api.libs.json.Format 实例

问题描述

我对 scala 和 play.api.libs.json.Format 完全陌生。

这是我的代码,我不知道我在哪里做错了。



import java.sql.Timestamp
import shapeless._
import slickless._
import play.api.libs.json._


case class AnnotationDto(
                          sequence: Int,
                          tagName: String,
                          value: String,
                        ) {
  require(!tagName.isEmpty, "annotation tagName must not be empty")
}

case class CommentDto(
                       commentText: String,
                     ) {
  require(!commentText.isEmpty, "commentText must not be empty")
}

case class LoanConditionDto(
                             conditionGuid: String,
                             sourceSystemId: String,
                             sourceType: String,
                             name: String,
                             descriptionTemplate: String,
                             description: String,
                             status: String,
                             priorTo: String,
                             owner: String,
                             category: String,
                             borrowerFacingName: Option[String] = None,
                             borrowerFacingDescriptionTemplate: Option[String] = None,
                             borrowerFacingDescription: Option[String] = None,
                             encompassGuid: Option[String] = None,
                             conditionStatusDateTime: Option[java.sql.Timestamp] = None,
                             ignoreRecoveryFlag: Option[Boolean] = Some(false),
                             annotations: Option[List[AnnotationDto]] = None,
                             comments: Option[List[CommentDto]] = None,
                           ) {
  require(!conditionGuid.trim.isEmpty, "conditionGuid must not be empty")
  require(!sourceType.trim.isEmpty, "condition sourceType must not be empty")
  require(!name.trim.isEmpty, "condition name must not be empty")
  require(!description.trim.isEmpty, "condition description must not be empty")
  require(!status.trim.isEmpty, "condition status must not be empty")
  require(!priorTo.trim.isEmpty, "condition priorTo must not be empty")
  require(!owner.trim.isEmpty, "condition owner must not be empty")
  require(!category.trim.isEmpty, "condition category must not be empty")
}

case class LoanConditionUpdateDto (
  conditionGuid: String,
  encompassGuid: Option[String] = None,
  conditionStatusDateTime: Option[java.sql.Timestamp] = None,
  ignoreRecoveryFlag: Option[Boolean] = Some(false),
) {
    require(!conditionGuid.trim.isEmpty, "conditionGuid must not be empty")

}

case class LoanConditionsDto(loanNumber: Option[String] = None, conditions: List[LoanConditionDto], userId: String)

case class LoanConditionsUpdateDto(loanNumber: Option[String] = None, conditions: List[LoanConditionUpdateDto], userId: String)

object AnnotationDto {

  implicit val annotationFormat = Json.format[AnnotationDto]
}

object CommentDto {
  implicit val commentFormat = Json.format[CommentDto]
}

object LoanConditionDto {

  implicit val loanConditionFormat = Json.format[LoanConditionDto]
}

object LoanConditionUpdateDto {
  implicit val loanConditionUpdateFormat = Json.format[LoanConditionUpdateDto]
}

object LoanConditionsDto {
  implicit val loanConditionsFormat = Json.format[LoanConditionsDto]
}

object LoanConditionsUpdateDto {
  implicit val loanConditionsUpdateFormat = Json.format[LoanConditionsUpdateDto]
}

我正在尝试将项目对象序列化为 JSON 字符串。我在这个地方收到错误

object LoanConditionDto {

  implicit val loanConditionFormat = Json.format[LoanConditionDto]
}

错误:

No instance of play.api.libs.json.Format is available  for scala.Option[java.sql.Timestamp] in the implicit scope (Hint: if declared in the same file, make sure it's declared before)

谁能帮我解决错误。

提前致谢

标签: jsonscala

解决方案


正如评论部分正确建议的那样,您需要为 JSON定义FormatorWrites和,例如将其呈现为表示 unix 时间的长值。你可以这样做:Readsjava.sql.Timestamp

import play.api.libs.json._
import java.sql.Timestamp
import play.api.libs.functional.syntax._

object LoanConditionDto {
  implicit val timestampReads: Reads[Timestamp] = {
      implicitly[Reads[Long]].map(new Timestamp(_))
  }

  implicit val timestampWrites: Writes[Timestamp] = {
    implicitly[Writes[Long]].contramap(_.getTime)
  }

  implicit val loanConditionFormat = Json.format[LoanConditionDto]
}

Scatie 工作示例:https ://scastie.scala-lang.org/Ko07Oa8iScW0i4vzE76K7w


推荐阅读