私のサーバは、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キロバイト」
動作しません。同じ無限ループ。 –
@ JohnnyDepp彼に 'SearchResultsDeserializer'が登録されていないと競合するマッパーが100%確実であれば、残りのコードを表示する必要があります。この100%は私のために働くので、ここではデモですhttps://gist.github.com/varren/38b76c4a62fc5024caedcdc469606649私はあなたのデシリアライザにアノテーションを登録して、あなたに役立つnothngがあると思います。アノテーションを使用する場合は、 'jp.readValueAs(SearchResultDTO.class);' – varren
@ JohnnyDeppのカスタム実装を記述する必要がありますが、なぜ最初にデシリアライザが必要ですか?文字列argを使用してコンストラクタにエラーが発生するだけです。そしてジャクソンはそれを理解することができます。 jsonにobjectの代わりにstringを指定すると、デフォルトの動作としてString argsコンストラクタを使用することになります。 – varren