【发布时间】:2019-02-20 01:44:25
【问题描述】:
我想为某些字符串类型的字段启用自定义杰克逊反序列化器。反序列化器还需要注入一个基于 guice 的依赖 bean。示例代码如下:
public class CustomDeserializer extends StdDeserializer<String> {
private SomeDependecy dependency;
public StringDeserializer() {
this(null);
}
public StringDeserializer(Class<?> vc) {
super(vc);
}
@Override
public String deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JsonProcessingException {
return dependency.perform(p.getValueAsString());
}
}
我无法注册基于类类型的模块,因为它是通用的(String.class、复杂数据类型(但不是每个都需要自定义反序列化器))。有没有办法在不使用静态方法的情况下实现上述目标?
PS:我确实搜索过网络,但如果不使用 statics 就找不到更清洁的解决方案。使用一些静态方法获取上下文和 bean 的所有建议。
【问题讨论】:
-
我觉得这个问题有两个部分。首先,如何注入依赖。可以通过使用
ObjectMapper mapper = new ObjectMapper(); SimpleModule module = new SimpleModule(); module.addDeserializer(String.class, new CustomDeserializer()); mapper.registerModule(module);注册这个反序列化器来解决这个问题但是,有选择地将此反序列化器应用于某些字符串字段,这是一个不同的问题。你如何定义这个反序列化器应该应用于你的类中的哪些字符串字段? -
加密的字符串将在反序列化器将应用到的字符串字段列表中失败。
-
JSON反序列化后能否进行解密。您可以创建一个可以简单地使用 Object mapper 解析并表示加密数据的中间模型,然后调用一些不同的 API 来解密加密模型。在某些情况下,当您希望针对 JSON 解析异常或依赖项失败异常以不同方式处理故障时,这也可能是有益的
-
也有适用于复杂对象的用例。因此,我试图以某种方式在反序列化中注入解密逻辑。否则,我将不得不写两层 Transformation JSONStringWithEncryptedBlobs -> JSONStringWithPlainData -> JavaPojo
-
似乎您应该在要使用此反序列化程序的特定位置围绕 String 使用包装器类型。这将允许您显式地绑定到该包装器类型。
module.addDeserializer(StringWrapper.class, new CustomDeserializer(dependency))
标签: java jackson guice json-deserialization