我在 Jackson 的自定义反序列化程序中出现了问题。我想访问默认的序列化程序来填充要反序列化的对象。在填充之后,我将执行一些自定义操作,但首先我想用默认的 Jackson 行为反序列化对象。
这是我现在的代码。
public class UserEventDeserializer extends StdDeserializer<User> {
private static final long serialVersionUID = 7923585097068641765L;
public UserEventDeserializer() {
super(User.class);
}
@Override
@Transactional
public User deserialize(JsonParser jp, DeserializationContext ctxt)
throws IOException, JsonProcessingException {
ObjectCodec oc = jp.getCodec();
JsonNode node = oc.readTree(jp);
User deserializedUser = null;
deserializedUser = super.deserialize(jp, ctxt, new User());
// The previous line generates an exception java.lang.UnsupportedOperationException
// Because there is no implementation of the deserializer.
// I want a way to access the default spring deserializer for my User class.
// How can I do that?
//Special logic
return deserializedUser;
}
}
我需要的是一种初始化默认反序列化器的方法,这样我就可以在开始我的特殊逻辑之前预先填充我的 POJO。
当从自定义反序列化器中调用反序列化时,似乎不管我如何构造序列化器类,该方法都是从当前上下文中调用的。因为我的 POJO 中有注释。由于显而易见的原因,这会导致 Stack Overflow 异常。
我曾经尝试过初始化 BeanDeserializer
,但是这个过程非常复杂,我还没有找到正确的方法。我还尝试过重载 AnnotationIntrospector
,但没有用,认为它可能有助于我忽略 DeserializerContext
中的注释。最后,我似乎在使用 JsonDeserializerBuilders
方面取得了一些成功,尽管这需要我做一些神奇的工作来从 Spring 获得应用程序上下文。如果有任何东西能够引导我找到一个更清晰的解决方案,我将非常感激,例如,我可以在不阅读 JsonDeserializer
注释的情况下构建一个反序列化上下文吗。