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レスポンスをマッピングする方法について提案があれば、それは大いに役立ちます。ありがとう
次のメソッド呼び出しで
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();
必要に応じて、ジェネリックでList
をパラメーター化する場合は、この回答をご覧ください Spring RestTemplateおよびList <T>