在另一个代码库中使用基于模块的序列化,我无法控制 ObjectMapper 构造

Use module-based serialization in another codebase where I don't control ObjectMapper construction

提问人:Alex Cruise 提问时间:11/3/2023 最后编辑:Alex Cruise 更新时间:11/4/2023 访问量:38

问:

我维护着一个 Scala 库,该库在自己的主上下文中成功地使用了所有自动功能,在那里我控制了 s 的构造。jackson-module-scalaObjectMapper

现在,我正在尝试使用相同的库作为现成代码库中的依赖项,该代码库以自己的方式构造 s,因此我无法以通常的方式引入 Scala 模块——该模块位于类路径上但未使用。ObjectMapper

是否有某种方法可以显式调用 Scala 模块提供的 ser/des 功能,例如使用注释?

例如:

Scala 库

我有这样的 DTO 类:

@JsonNaming(classOf[SnakeCaseStrategy])
case class Foo(
  bar: String,
  @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "UTC", lenient = OptBoolean.TRUE)
  timestamp: Instant,
  bazId: Option[UUID]
)

这是我的 ObjectMapper:

object JSON {
  val objectMapper: JsonMapper with ClassTagExtensions = JsonMapper.builder()
    .addModule(DefaultScalaModule)
    .addModule(new JavaTimeModule())
    .enable(MapperFeature.ACCEPT_CASE_INSENSITIVE_ENUMS)
    .build() :: ClassTagExtensions
}

它们的用法如下:

val s: String = ???

val foo: Foo = JSON.objectMapper.readValue[Foo](s)

运行时上下文

在运行时上下文中,ObjectMappers 是使用依赖注入和硬编码的混合创建的,我看不到任何自定义方法。

我希望能够做的是这样的事情,它委托给 Scala 模块

val scalaModule = ???

class ScalaModuleSerializer[T] extends JsonSerializer[T] {
  override def serialize(value: T, gen: JsonGenerator, serializers: SerializerProvider): Unit = {
    scalaModule.serialize(value, gen, serializers)
  }
}

class FooSerializer extends ScalaModuleSerializer[Foo]

...然后以某种方式在运行时注入。FooSerializer

Java Scala Jackson 反序列化

评论

0赞 Gastón Schabas 11/3/2023
我不明白你到底想做什么,问题到底是什么。你有自己的依赖于 jackson 的库,然后你有一个依赖于你的库的项目。我想你创建的库涵盖了项目的需求。你能澄清一下问题吗?也许展示一些你所拥有的和你无法实现的代码可能会有所帮助
0赞 Alex Cruise 11/4/2023
添加了一些上下文,谢谢!

答: 暂无答案