У меня проблема в моем обычном десериализаторе в Джексоне. Я хочу получить доступ к сериализатору по умолчанию, чтобы заполнить объект, который я десериализую. После популяции я сделаю некоторые пользовательские вещи, но сначала хочу десериализовать объект с поведением джексона по умолчанию.Как я могу назвать десериализатор по умолчанию из пользовательского десериализатора в 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. Это приводит к исключению переполнения стека по очевидным причинам. Я попытался инициализировать beandeserializer, но процесс чрезвычайно сложный, и мне не удалось найти правильный способ сделать это. Я также попытался перегрузить интроспектор аннотации, но ничего не понял, подумав, что это может помочь мне игнорировать аннотацию в DeserializerContext. Наконец, это швы, я, возможно, имел некоторый успех, используя JsonDeserializerBuilders, хотя это потребовало от меня сделать некоторые волшебные вещи, чтобы получить контекст приложения с весны. Я был бы признателен за любую вещь, которая могла бы привести меня к более чистому решению, например, как я могу создать контекст десериализации, не читая аннотацию JsonDeserializer.
No. Эти подходы не помогут: проблема в том, что вам понадобится полностью сконструированный десериализатор по умолчанию; и для этого требуется, чтобы он строился, а затем ваш десериализатор получает к нему доступ. 'DeserializationContext' - это не то, что вы должны либо создавать, либо изменять; он будет предоставлен 'ObjectMapper'. 'AnnotationIntrospector', также не будет помогать в получении доступа. – StaxMan
Как вы в конечном итоге сделали это в конце? – khituras
Хороший вопрос. Я не уверен, но я уверен, что ответ ниже помог мне. В настоящее время я не владею кодом, который мы написали, если вы найдете решение, разместите его здесь для других. –