我的Scanamo
將放有任何對象進行通用DynamoFormat
Circe
的Encoder
和Decoder
定義到數據庫作爲一個JSON字符串。堆棧溢出類型類與隱式轉換
import com.gu.scanamo.DynamoFormat
import io.circe.parser.parse
import io.circe.syntax._
import io.circe.{Decoder, Encoder}
object JsonDynamoFormat {
def forType[T: Encoder: Decoder]: DynamoFormat[T] = DynamoFormat.coercedXmap[T, String, Exception] {
s => parse(s).flatMap(_.as[T]).fold(err => throw err, obj => obj)
} {
obj => obj.asJson.noSpaces
}
}
然後我添加了一個隱式轉換(與object JsonDynamoFormat
相同)以自動提供這些格式化程序。
implicit def jsonToFormat[T: Encoder: Decoder]: DynamoFormat[T] = JsonDynamoFormat.forType[T]
當我將其導入,編譯器將解析格式化成功,但在運行時我得到了JsonDynamoFormat
堆棧溢出,其中調用jsonToFormat
和forType
備用無限:
Exception in thread "main" java.lang.StackOverflowError
at JsonDynamoFormat$.forType(JsonDynamoFormat.scala:12)
at JsonDynamoFormat$.jsonToFormat(JsonDynamoFormat.scala:9)
at JsonDynamoFormat$.forType(JsonDynamoFormat.scala:13)
at JsonDynamoFormat$.jsonToFormat(JsonDynamoFormat.scala:9)
...
我真的不能明白這裏發生了什麼。任何人都可以闡明這一點嗎?
我不知道會發生什麼,如果你讓'def forType'隱式並移除'implicit def jsonToFormat'。看起來第二個是非常多餘的。 – Haspemulator
@Haspemulator,有趣的是它無法編譯,雖然函數簽名確實看起來是一樣的。奇怪的。 –
我認爲這種失敗是解決問題根源的關鍵。啓用'scalacOptions ++ = Seq(「 - Xlog-implicits」)'獲得隱式解析日誌(可能是很多輸出),並且可以選擇'libraryDependencies ++ = Seq(compilerPlugin(「io.tryp」%%「 splain「%」0.2.4「))'使輸出更好。這可能有助於解釋爲什麼隱式未找到。 – Haspemulator