我的服务器返回结果有两种不同的类型:成功时的SearchResultDTO和错误时的String。我需要处理这两种类型,并始终返回SearchResultDTO类型。这是我的解串器:
public class SearchResultsDeserializer extends JsonDeserializer<SearchResultDTO> {
@Override
public SearchResultDTO deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException {
JsonToken t = jp.getCurrentToken();
if (t == JsonToken.VALUE_STRING){
return new SearchResultDTO(jp.getText());
} else {
return jp.readValueAs(SearchResultDTO.class);
}
}
}
当我运行此代码并且服务器发送SearchResultDTO对象时,jackson通过调用此函数进入无限循环并返回错误:“java.lang.StackOverflowError:stack size 1036KB”
答案 0 :(得分:0)
轻松修复将在SearchResultsDeserializer
中创建ObjectMapper的新实例,并使用它代替JsonParser
public static class SearchResultsDeserializer extends JsonDeserializer<SearchResultDTO> {
private static ObjectMapper mapper = new ObjectMapper();
@Override
public SearchResultDTO deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException {
JsonToken t = jp.getCurrentToken();
if (t == JsonToken.VALUE_STRING){
return new SearchResultDTO(jp.getText());
} else {
return mapper.readValue(jp, SearchResultDTO.class);
}
}
}
困难的方法是在自定义反序列化器中保存默认的反序列化器。 以下是更多信息:How do I call the default deserializer from a custom deserializer in Jackson