我有两个用于一组案例类的 CodecRegistry 实现。它们大多数是用宏创建的。现在,如果我仅使用 RegistryOne
,它适用于集合“One” - 包 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 中实现的一些类依赖于包 one
。所以我只是将 RegistryOne
添加到其中。现在,所有序列化仍然适用于设置“One”的 RegistryTwo.registry
。但是对于包 two
的类,我收到运行时异常“找不到类 scala.Option 的编解码器”。似乎 DEFAULT_CODEC_REGISTRY
未包含在结果注册表中?!
我还有 RegistryThree
和 RegistryFour
。至少为了清楚起见和将来的重构,我会将它们分开保存。
如何正确组合编解码器注册表?
最佳答案
事实证明错误消息具有误导性。 ADT 主类的宏还为每个子类创建编解码器。如果您还为其中之一添加了宏创建的编解码器,那么注册表会变得困惑,并且无法反序列化诸如 scala.Option
这样的原始内容。
关于java - 在 scala 中组合 mongodb 编解码器注册表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52551846/