Akka, Package JacksonJsonSerializer

wlwcrazw  于 2023-05-17  发布在  其他
关注(0)|答案(1)|浏览(130)

我想在清单和我的序列化对象的JSON表示中添加一些信息。但是,我不想处理所有的微妙情况和迁移,akka.serialization.jackson.JacksonJsonSerializer已经很好地处理了这些情况和迁移。
这就是为什么我想从我自己的序列化器中获取对JacksonJsonSerializer的引用,这样我就可以轻松地修饰输出,而不必重新实现所有内容。
我尝试从他的FQN中检索序列化器:

private lazy val jackson = {
    SerializationExtension(system)
      .serializerOf("akka.serialization.jackson.JacksonJsonSerializer")
      .map(_.asInstanceOf[SerializerWithStringManifest])
      .get
  }

但是,这会引发异常:
java.lang.NoSuchMethodException:akka.serialization.jackson.JacksonJsonSerializer.()
引发此异常的原因是JacksonJsonSerializer构造函数需要扩展的actor系统和一个String,该String应该是绑定名称。而且,当绑定名为空时,方法akka.serialization.Serialization#serializerOf(应该使用该构造函数)会重新抛出异常。不幸的是,我无法传递绑定名称。
所以我的问题是
我可以从ExtendedSystemakka.serialization.Serializer可用的任何其他方式获取现有的串行化器吗?
谢谢

vjrehmav

vjrehmav1#

您可以通过以下方式访问JacksonJsonSerializer示例:
1.可以使用Serialization.serializer来传递绑定的类作为参数。Akka将查找相应的序列化器,并返回JacksonJsonSerializer示例(如果已配置)。
1.使用ExtendedSystem和绑定名称自行构建。但是要注意,应该在配置的akka.actor.serialization-identifiers.{bindingName}中为给定的绑定名称定义相应的序列化器id。
1.[不推荐]使用反射机制访问Serialization类的私有方法serializerOf,其中可以定义绑定名称:

var serialization = SerializationExtension.get(system);
var method = Serialization.class.getDeclaredMethod("serializerOf", String.class, String.class);
method.trySetAccessible();
var serializerTry = (Try<Serializer>) method.invoke(
    serialization,
    "jackson-json",
    "akka.serialization.jackson.JacksonJsonSerializer"
);
assert serializerTry.isSuccess();
var serializer = serializerTry.get();

相关问题