web-dev-qa-db-ja.com

ClassCastException:リスト<MymodelClass>の代わりにリスト<LinkedHashMap>を返すRestTemplate

MyModelClassのgetterメソッドにアクセスしようとしていますが、コードがList<LinkedHashMap>ではなくList<MyModelClass>を返しています。これは私のコードです。

List<MyModelClass> myModelClass=(List<MyModelClass>) restTemplate.postForObject(url,mvm,List.class);

System.out.println("Response= " +  myModelClass);

応答を印刷しようとしましたが、期待したJSON応答を取得しました。しかし、私がこのコードを実行しようとしたとき。

System.out.println("Response= " +  myModelClass.get(0).getMessage());

このエラーが生成されます。

Java.lang.ClassCastException: Java.util.LinkedHashMap cannot be cast to com.XXX.XXX.MyModelClass 

不一致です。このエラーで誰かが私を取り除くのを手伝ってもらえますか?ありがとう。

MyModelClass

public class MyModelClass{

    /**
     * 
     */
    @JsonProperty("id")
    public String id;

    @JsonProperty("type")
    public String type;

    @JsonProperty("user")
    public String user;

    @JsonProperty("message")
    public String message;

    //getters

のエラー

MyModelClass[] myModelClass= restTemplate.postForObject(url,mvm, myModelClass[].class);

org.springframework.http.converter.HttpMessageNotReadableException:JSONを読み取ることができませんでした:START_OBJECTトークンからJava.util.ArrayListのインスタンスをデシリアライズできません

JSON応答構造

    [{"key1":"value1","key2":"value2","parameters":{"key1":"value1","key2":"value2","key3":"value3","key4":"value4","key5":"value5"}},
{"key12":"value12","key22":"value22","parameters":{"key12":"value12","key22":"value22","key32":"value32","key42":"value42","key52":"value52"}}]

RestTemplateでこの種のJSONレスポンスをマッピングする方法について提案があれば、それは大いに役立ちます。ありがとう

28
Erick

次のメソッド呼び出しで

List<MyModelClass> myModelClass=(List<MyModelClass>) restTemplate.postForObject(url,mvm,List.class);

ジャクソンが知っているのは、Listが欲しいということだけですが、タイプに制限はありません。デフォルトでは、JacksonはJSONオブジェクトをLinkedHashMapにデシリアライズします。そのため、ClassCastExceptionを取得しています。

返されたJSONが配列の場合、それを取得する1つの方法は配列を使用することです

MyModelClass[] myModelClasses = restTemplate.postForObject(url,mvm, MyModelClass[].class);

その配列の要素をいつでもListに追加できます。

どのバージョン以降覚えていないが、 RestTemplate#exchange には、 ParameterizedTypeReference 引数を受け入れるオーバーロードがあります。 ParameterizedTypeReferenceは、逆シリアル化のターゲットとしてパラメーター化された型を提案するための型トークンハックです。

上記のコードをリファクタリングして、exchangeの代わりにpostForObjectを使用し、ParameterizedTypeReferenceを使用してList<MyModelClass>。例えば

ParameterizedTypeReference<List<MyModelClass>> typeRef = new ParameterizedTypeReference<List<MyModelClass>>() {
};
ResponseEntity<List<MyModelClass>> responseEntity = restTemplate.exchange(url, HttpMethod.POST, new HttpEntity<>(mvm), typeRef);
List<MyModelClass> myModelClasses = responseEntity.getBody();
44

必要に応じて、ジェネリックでListをパラメーター化する場合は、この回答をご覧ください Spring RestTemplateおよびList <T>

0
Moesio