[英]How to inject dependency into Jackson Custom serializer
在這個問題中,我看到了一種有趣的方法,用於將對象注入 Jackson 映射框架的自定義反序列化器(我目前使用的是2.10.x 版)。 本質上,在ObjectMapper
注冊一個依賴項 MyService
jsonMapper.setInjectableValues(new InjectableValues
.Std()
.addValue(MyService.class.getName(), myServiceInstance));
然后在擴展StdDeserializer
的類中,可以通過具有findInjectableValue
方法的DeserializationContext
訪問它。
現在,我希望圖書館提供一種對稱的序列化方法,但老實說找不到它。 具體來說,如果您有一個擴展StdSerializer
的類,您將需要實現一個方法serialize(ProjectSerializable value, JsonGenerator jsonGenerator, SerializerProvider provider)
,該方法似乎沒有具有與DeserializationContext
類似功能的類。
那么,如何使用自定義序列化程序實現相同的“注入”,而無需求助於基於對實例提供程序或其他不可測試事物的靜態訪問的丑陋解決方案。
在我看來,實現這一點的唯一方法是為自定義序列SerializerProvider
程序將使用的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
的實例。
我不喜歡與反序列化顯示的其他方法的不對稱性,但它有效。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.