1. ホーム
  2. java

Spring RESTTemplateを使ったジェネリック

2023-08-01 12:11:58

質問

そんなクラスがあるんだ。

public class Wrapper<T> {

 private String message;
 private T data;

 public String getMessage() {
    return message;
 }

 public void setMessage(String message) {
    this.message = message;
 }

 public T getData() {
    return data;
 }

 public void setData(T data) {
    this.data = data;
 }

}

で、以下のようにresttemplateを使っています。

...
Wrapper<Model> response = restTemplate.getForObject(URL, Wrapper.class, myMap);
Model model = response.getData();
...

しかし、それはaを投げます。

ClassCastException

と読みます。 javaでJacksonを使用しようとした場合の問題点 を読みましたが、役に立ちませんでした。私の問題などに関連するトピックがいくつかあります。 https://jira.springsource.org/browse/SPR-7002 https://jira.springsource.org/browse/SPR-7023

何かアイデアはありますか?

PSです。 私のエラーは

java.lang.ClassCastException: java.util.LinkedHashMap cannot be cast to a.b.c.d.Model

resttemplateが私のジェネリック変数を理解できていないようで、ジェネリックTの代わりにオブジェクトとして受け入れているようです。あなたはそれから読み取ることができます ここで マーシャルするものから説明すると、こう書いてあります。

JSON型|Java型

オブジェクト|LinkedHashMap

どのように解決するのですか?

3.2 M2 で ParameterizedTypeReference が導入され、この問題を回避できるようになりました。

Wrapper<Model> response = restClient.exchange(loginUrl, 
                          HttpMethod.GET, 
                          null, 
                          new ParameterizedTypeReference<Wrapper<Model>>() {}).getBody();

しかし、postForObject/getForObjectのバリアントは導入されませんでした。