Circe: Nutzloser Kompilierfehler bei fehlendem Encoder/Decoder

Erstellt am 15. Aug. 2015  ·  3Kommentare  ·  Quelle: circe/circe

Wenn das Datum nicht codiert ist, beschwert sich der Compiler

 [error] /home/jilen/workspace/jfc-test/src/main/scala/Foo.scala:26: diverging implicit expansion for type io.circe.Encoder.Secondary[this.Out]
[error] starting with method encodeCaseClass in trait GenericInstances

Gibt es eine Möglichkeit, die Fehlerberichterstattung zu verbessern?

import io.circe._
import io.circe.generic.auto._
import io.circe.syntax._

import java.util.Date
case class Foo(
  date: Date,
  number: Int,
  str: String)

object App {

  def encodesDate(fmt: String): Encoder[Date] = new Encoder[Date] {
    def apply(a: Date) = {
      val sdf = new java.text.SimpleDateFormat(fmt)
      Json.string(sdf.format(a))
    }
  }



  def main(args: Array[String])  {
    //implicit val DateEncodes = encodesDate("yyyy-MM-dd HH:mm:ss")
    val f = Foo(new Date, 1, "fff")
    println(f.asJson.noSpaces)
  }
}

Hilfreichster Kommentar

+1 um implizitNotFound zu verwenden!
Um Daten zu decodieren und zu codieren, nur implizit

  implicit val dateTimeEncoder: Encoder[DateTime] = Encoder.instance(a => a.getMillis.asJson)
  implicit val dateTimeDecoder: Decoder[DateTime] = Decoder.instance(a => a.as[Long].map(new DateTime(_)))

Da das Datum viele Formate hat, schlage ich vor, es in der Dokumentation zu definieren und kein Standardformat in jfc hinzuzufügen.

Alle 3 Kommentare

Ja, das ist eine ziemlich schreckliche Fehlermeldung – danke für den Hinweis.

Die Implementierung des generischen Ableitungsmechanismus wird sich mit #30 ändern, was ich hoffentlich morgen erledigen werde, also werde ich, nachdem sich der Staub gelegt hat, dies und #34 noch einmal durchgehen, da die Dinge bis dahin etwas anders sein könnten. Wir sollten in der Lage sein, @implicitNotFound an einigen Stellen zu verwenden, um diese Nachrichten stark zu verbessern (siehe zum Beispiel diese Nachricht in Finch).

+1 um implizitNotFound zu verwenden!
Um Daten zu decodieren und zu codieren, nur implizit

  implicit val dateTimeEncoder: Encoder[DateTime] = Encoder.instance(a => a.getMillis.asJson)
  implicit val dateTimeDecoder: Decoder[DateTime] = Decoder.instance(a => a.as[Long].map(new DateTime(_)))

Da das Datum viele Formate hat, schlage ich vor, es in der Dokumentation zu definieren und kein Standardformat in jfc hinzuzufügen.

Ich werde fortfahren und dies schließen, da das Folgende eine enorme Verbesserung darstellt:

<console>:59: error: could not find implicit value for parameter e: io.circe.Encoder[Foo]
           println(f.asJson.noSpaces)
                     ^

Ich bin mir nicht sicher, ob es in diesem Fall viele zusätzliche nützliche Informationen gibt, die wir mit @implicitNotFound hinzufügen könnten, abgesehen vielleicht von einem Verweis auf die Dokumentation.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen