2016-05-16 16 views
0

私のサーバは、2つの異なるタイプの結果を返します:Successfulfullの場合はSearchResultDTO、エラーの場合はString。私はこれらの2つの型を処理し、常にSearchResultDTO型を返す必要があります。ここに私のデシリアライザは、次のとおりです。2つのタイプを1つとして扱うジャーマンデシリアライザ

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:スタックサイズ1036キロバイト」

答えて

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彼に 'SearchResultsDeserializer'が登録されていないと競合するマッパーが100%確実であれば、残りのコードを表示する必要があります。この100%は私のために働くので、ここではデモですhttps://gist.github.com/varren/38b76c4a62fc5024caedcdc469606649私はあなたのデシリアライザにアノテーションを登録して、あなたに役立つnothngがあると思います。アノテーションを使用する場合は、 'jp.readValueAs(SearchResultDTO.class);' – varren

+1

@ JohnnyDeppのカスタム実装を記述する必要がありますが、なぜ最初にデシリアライザが必要ですか?文字列argを使用してコンストラクタにエラーが発生するだけです。そしてジャクソンはそれを理解することができます。 jsonにobjectの代わりにstringを指定すると、デフォルトの動作としてString argsコンストラクタを使用することになります。 – varren

関連する問題