Java 如何将依赖项注入Jackson自定义序列化程序

Java 如何将依赖项注入Jackson自定义序列化程序,java,jackson,jackson2,Java,Jackson,Jackson2,在这个问题上,我看到了一种将对象注入Jackson映射框架的自定义反序列化程序的有趣方法(我目前使用的是版本2.10.x)。 本质上,在ObjectMapper jsonMapper.setInjectableValues(新的InjectableValues .Std() .addValue(MyService.class.getName(),myServiceInstance)); 然后在扩展StdDeserializer的类中,可以通过反序列化上下文访问它,该上下文具有findInjec

在这个问题上,我看到了一种将对象注入Jackson映射框架的自定义反序列化程序的有趣方法(我目前使用的是版本2.10.x)。 本质上,在
ObjectMapper

jsonMapper.setInjectableValues(新的InjectableValues
.Std()
.addValue(MyService.class.getName(),myServiceInstance));
然后在扩展StdDeserializer的类中,可以通过
反序列化上下文
访问它,该上下文具有
findInjectableValue
方法

现在,我希望该库提供了一种对称的序列化方法,但老实说,它找不到。具体地说,如果您有一个扩展了StdSerializer的类,那么您将需要实现一个方法
序列化(ProjectSerializable值、JsonGenerator、JsonGenerator、SerializerProvider提供程序)
,该类似乎没有类似于
反序列化上下文的特性


那么,如何才能实现同样的“注入”使用自定义序列化程序,而无需求助于基于对实例提供程序的静态访问或其他不稳定内容的丑陋解决方案。

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

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

ObjectMapper ObjectMapper=…//在这里,您创建的ObjectMapper将用于所有配置
//然后注入服务。
SerializationConfig InitializationConfig=objectMapper.getSerializationConfig();
ContextAttributes=initialSerializationConfig.getAttributes();
//这里我们用我们想要的类创建一个新的ContextAttributes
//为每个序列化程序共享
ContextAttributes attributesWithInjectedValue=
attributes.withSharedAttribute(MyService.class.getName(),myServiceInstance);
SerializationConfig serializationConfigWithInjectedValue=
initialSerializationConfig.with(attributesWithInjectedValue);
返回jsonMapper.setConfig(serializationConfigWithInjectedValue);
然后在
JsonSerializer
的实例中,您只需执行以下操作:

MyService MyService=(MyService)serializerProvider
.getAttribute(MyService.class.getName());
其中,
serializerProvider
是用
serialize
方法给出的
serializerProvider
的实例


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

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

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

ObjectMapper ObjectMapper=…//在这里,您创建的ObjectMapper将用于所有配置
//然后注入服务。
SerializationConfig InitializationConfig=objectMapper.getSerializationConfig();
ContextAttributes=initialSerializationConfig.getAttributes();
//这里我们用我们想要的类创建一个新的ContextAttributes
//为每个序列化程序共享
ContextAttributes attributesWithInjectedValue=
attributes.withSharedAttribute(MyService.class.getName(),myServiceInstance);
SerializationConfig serializationConfigWithInjectedValue=
initialSerializationConfig.with(attributesWithInjectedValue);
返回jsonMapper.setConfig(serializationConfigWithInjectedValue);
然后在
JsonSerializer
的实例中,您只需执行以下操作:

MyService MyService=(MyService)serializerProvider
.getAttribute(MyService.class.getName());
其中,
serializerProvider
是用
serialize
方法给出的
serializerProvider
的实例

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