【问题标题】:How to inject dependency into Jackson Custom serializer如何将依赖项注入 Jackson Custom 序列化程序
【发布时间】:2020-02-15 13:35:37
【问题描述】:

this 问题中,我看到了一种有趣的方法,可以将对象注入到杰克逊映射框架的自定义反序列化器中(我目前使用的是版本 2.10.x)。 本质上,在ObjectMapper中注册了一个依赖项 MyService

 jsonMapper.setInjectableValues(new InjectableValues
                .Std()
                .addValue(MyService.class.getName(), myServiceInstance));

然后在扩展StdDeserializer 的类中,可以通过DeserializationContext 访问它,该findInjectableValue 方法具有findInjectableValue

现在,我希望库提供一种对称的序列化方法,但老实说找不到。具体来说,如果你有一个扩展 StdSerializer 的类,你将需要实现一个方法 serialize(ProjectSerializable value, JsonGenerator jsonGenerator, SerializerProvider provider),它似乎没有一个类具有类似 DeserializationContext 的特性。

那么,如何使用自定义序列化程序实现相同的“注入”,而不采用基于对实例提供程序的静态访问或其他无法测试的东西的丑陋解决方案。

【问题讨论】:

    标签: java jackson jackson2


    【解决方案1】:

    在我看来,实现这一点的唯一方法是通过设置将由自定义序列化程序使用的 SerializerProvider 的属性。

    当您创建ObjectMapper 时,您必须通过创建一个新的来破解它

    ObjectMapper objectMapper = ...// here you create the ObjectMapper will all your configs
    
    // Then you inject the service.
    
    SerializationConfig initialSerializationConfig = objectMapper.getSerializationConfig();
    ContextAttributes attributes = initialSerializationConfig.getAttributes();
    // Here we create a new ContextAttributes with the class we want 
    //   to have shared for each serializer
    ContextAttributes attributesWithInjectedValue =
             attributes.withSharedAttribute(MyService.class.getName(), myServiceInstance);
    SerializationConfig serializationConfigWithInjectedValue =
             initialSerializationConfig.with(attributesWithInjectedValue);
    
    return jsonMapper.setConfig(serializationConfigWithInjectedValue);
    

    然后在 JsonSerializer 的实例中,您只需执行以下操作:

    MyService myService = (MyService) serializerProvider
            .getAttribute(MyService.class.getName());
    

    其中serializerProvider 是使用serialize 方法给出的SerializerProvider 的实例。

    我不喜欢反序列化显示的其他方法的不对称性,但它有效。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多