2016-05-16 20 views
0

我的服務器返回結果有兩種不同的類型:SearchResultDTO時successefull和String時出現錯誤。我需要處理這兩種類型,並總是返回SearchResultDTO類型。這裏是我的解串器:Jackson解串器將兩種類型作爲一個處理

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對象,傑克遜進入無限循環通過調用該函數返回錯誤:「java.lang.StackOverflowError的:堆棧大小1036KB」

回答

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

+0

不起作用。同樣的無限循環。 –

+0

@JohnnyDepp如果你100%確定你有沒有'SearchResultsDeserializer'註冊的競爭性不同的映射器,你可能不得不向我們展示你的其他代碼。因爲這100%爲我工作,這裏是演示https://gist.github.com/varren/38b76c4a62fc5024caedcdc469606649我認爲你註冊你的反序列化器註釋和這種方式,我認爲沒有可以幫助你。如果使用註解,則必須爲'jp.readValueAs(SearchResultDTO.class);' – varren

+1

@JohnnyDepp編寫自定義實現,但爲什麼首先需要解串器?你只要在你的構造函數中用字符串arg給出錯誤sting。傑克遜可以理解這一點。如果你在json中給出字符串而不是對象,那麼默認行爲就是使用String args構造函數。 – varren

相關問題