Опция типа [java.sql.Timestamp] не может использоваться в качестве значения по умолчанию - PullRequest
1 голос
/ 14 марта 2019

Попытка получить производный объект ввода из класса case.

val UserInputType = deriveInputObjectType[UserRow]()
case class UserRow(id: Int, name: String, lastModifiedTime: Option[java.sql.Timestamp] = None) 

но получаю следующую ошибку

Type Option[java.sql.Timestamp] cannot be used as a default value. Please consider defining an implicit instance of `ToInput` for it.

Я также определил тип метки времени:

  case object DateTimeCoerceViolation extends Violation {
    override def errorMessage: String = "Error during parsing DateTime"
  }

  def parseTime(s: String) = Try(Timestamp.valueOf(s)) match {
    case Success(date) ⇒ Right(date)
    case Failure(_) ⇒ Left(DateTimeCoerceViolation)
  }

  implicit val TimestampType = ScalarType[Timestamp](
    "Timestamp",
    coerceOutput = (ts, _) => ts.getTime,
    coerceInput = {
      case StringValue(ts, _, _, _,_) => parseTime(ts)
      case _ => Left(DateTimeCoerceViolation)
    },
    coerceUserInput = {
      case s: String => parseTime(s)
      case _ => Left(DateTimeCoerceViolation)
    }
  )

Как можно решить эту проблему?

1 Ответ

0 голосов
/ 29 марта 2019

Как говорит ошибка - Пожалуйста, рассмотрите возможность определения неявного экземпляра ToInput для него , вы должны предоставить ToInput для Timestamp неявно.Потому что без него sangria не сможет сериализовать необработанные данные в Timestamp.

  implicit val toInput = new ToInput[Option[java.sql.Timestamp], Json] {
    override def toInput(value: Option[Timestamp]): (Json, InputUnmarshaller[Json]) = value match {
      case Some(time) => (Json.fromString(time.toString), sangria.marshalling.circe.CirceInputUnmarshaller)
      case None => (Json.Null, sangria.marshalling.circe.CirceInputUnmarshaller)
    }
  }

С другой стороны, если вы используете библиотеку play-json, вам не нужно явно определять ииспользуйте toInput.

Например, в play json вы можете определить неявный формат для TimeStamp.

implicit val timeStampFormat: Format = ???

Вышеупомянутый формат будет неявно использоваться Сангрией Джсон-Маршаллер для сериализации от Json до Timestamp.

...