Я сделал общий DynamoFormat для Scanamo, который поместил бы любой объект, который имеет Encoder и Decoder Circe, определенные в базу данных, как строку 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. Похоже, что второй из них в значительной степени лишний. - person Haspemulator   schedule 25.08.2017scalacOptions ++= Seq("-Xlog-implicits"), чтобы получить журнал неявного разрешения (может быть много выходных данных), и дополнительноlibraryDependencies ++= Seq(compilerPlugin("io.tryp" %% "splain" % "0.2.4")), чтобы сделать этот вывод более приятным. Это может помочь в объяснении, почему неявное не найдено. - person Haspemulator   schedule 25.08.2017forTypeвimplicit defне удалось скомпилировать из-за конфликта имени с методом, импортированным из другого класса. После разрешения конфликта имен произошел сбой во время выполнения с бесконечной рекурсией :) Это привело меня к поиску других имплицитов, и я обнаружил, чтоcoercedXmapпринимает неявный параметр типаDynamoFormat[String], который, конечно же, разрешается вforType. После предоставления правильного средства форматирования строк все работает так, как ожидалось. Еще раз спасибо за ваши ценные предложения относительно неявной отладки. Если вы хотите предоставить их в качестве ответа, я буду рад принять его. - person Vasiliy Ivashin   schedule 28.08.2017