首页 > 解决方案 > 在scala中结合mongodb编解码器注册表

问题描述

对于一组案例类,我有两个 CodecRegistry 实现。它们中的大多数是用宏创建的。现在,如果我使用RegistryOne唯一的,它适用于 set "One" - 来自 package 的类one

object RegistryOne {
  lazy val registry: CodecRegistry =
    fromRegistries(
      fromCodecs(..),
      fromProviders(..),
      DEFAULT_CODEC_REGISTRY
    )
}

object RegistryTwo {
  lazy val registry: CodecRegistry =
    fromRegistries(
      fromCodecs(..),
      fromProviders(..),
      RegistryOne.registry,
      DEFAULT_CODEC_REGISTRY
    )
}

中实现的一些类RegistryTwo取决于 package one。所以我只是将其包含在RegistryOne其中。现在所有序列化仍然适用RegistryTwo.registry于 set "One"。但是对于包的类,two我得到一个运行时异常“找不到类 scala.Option 的编解码器”。似乎DEFAULT_CODEC_REGISTRY没有包含在结果注册表中?!

我也有RegistryThreeRegistryFour。至少为了清楚起见和未来的重构,我会将它们分开保存。

如何正确组合编解码器注册表?

标签: javamongodbscalascala-macros

解决方案


原来错误消息具有误导性。ADT 主类的宏还为每个子类创建编解码器。如果您还为其中一个添加了宏创建的编解码器,那么注册表会混淆并且无法反序列化原始内容,例如scala.Option.


推荐阅读