首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用circe实现对StackOverflowError的编码

用circe实现对StackOverflowError的编码
EN

Stack Overflow用户
提问于 2020-03-27 02:16:17
回答 1查看 435关注 0票数 2

我正在为我的case类编写测试,在下面的测试中我有一个StackOverflowError:

代码语言:javascript
复制
  test("ValuationRequest - Conversion between case object and Json works") {
    val caseObject = ValuationRequest(TIME_SERIES_INTRADAY, "", IntraDayIntervals.MIN_5)
    val jsonString = caseObject
      .asJson
      .printWith(Printer.noSpaces)

    decode[ValuationRequest](jsonString) must be(Right(caseObject))
  }

下面是堆栈跟踪:

代码语言:javascript
复制
An exception or error caused a run to abort. 
java.lang.StackOverflowError
    at io.circe.syntax.package$EncoderOps$.asJson$extension(package.scala:10)
    at eventbus.ValuationRequest$.$anonfun$encodeRequest$1(ValuationRequestCases.scala:14)
....

这是案例代码:

代码语言:javascript
复制
import AV_Enums.TimeSeriesFunctions.TIME_SERIES_INTRADAY
import AV_Enums.{IntraDayInterval, IntraDayIntervals, TimeSeriesType}
import cats.syntax.functor._
import io.circe.generic.auto._
import io.circe.generic.semiauto._
import io.circe.syntax._
import io.circe.{Decoder, Encoder}

case class ValuationRequest(function: TimeSeriesType = TIME_SERIES_INTRADAY, symbol: String, interval: IntraDayInterval = IntraDayIntervals.MIN_5)

object ValuationRequest {
  implicit val encodeRequest: Encoder[ValuationRequest] = Encoder.instance { case response@ValuationRequest(_, _, _) => response.asJson }
  implicit val decodeRequest: Decoder[ValuationRequest] = deriveDecoder[ValuationRequest].widen
}

下面是它使用的枚举:

代码语言:javascript
复制
sealed abstract class TimeSeriesType(val text: String) extends EnumEntry {}

sealed abstract class IntraDayInterval(val text: String) extends EnumEntry {}

object TimeSeriesFunctions extends Enum[TimeSeriesType] with CirceEnum[TimeSeriesType] {
  val values: immutable.IndexedSeq[TimeSeriesType] = findValues

  case object TIME_SERIES_INTRADAY extends TimeSeriesType("TIME_SERIES_INTRADAY")

  case object TIME_SERIES_DAILY extends TimeSeriesType("TIME_SERIES_DAILY")

  case object TIME_SERIES_WEEKLY extends TimeSeriesType("TIME_SERIES_WEEKLY")

  case object TIME_SERIES_MONTHLY extends TimeSeriesType("TIME_SERIES_MONTHLY")

}

object IntraDayIntervals extends Enum[IntraDayInterval] with CirceEnum[IntraDayInterval] {
  val values: immutable.IndexedSeq[IntraDayInterval] = findValues

  case object MIN_1 extends IntraDayInterval("1min")

  case object MIN_5 extends IntraDayInterval("5min")

  case object MIN_15 extends IntraDayInterval("15min")

  case object MIN_30 extends IntraDayInterval("30min")

  case object MIN_60 extends IntraDayInterval("60min")

}

我不明白这个例子是怎么回事,其他的都工作得很好,而且都是以同样的方式实现的。有人能帮上忙吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-03-27 02:54:37

有问题的线

代码语言:javascript
复制
Encoder.instance { case response@ValuationRequest(_, _, _) => response.asJson }

这里的.asJson需要Encoder[ValuationRequest],这是一个递归调用。您不能使用deriveEncoder[ValuationRequest]的任何原因

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60873677

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档