81

私はそのようなクラスを持っています:

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();
...

ただし、次のようにスローされます。

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ではなくオブジェクトとして受け入れます。したがって、LinkedHashMapになります。あなたはそれからここで読むことができますそれはそれがマーシャルするものから説明するときそれは言う:

JSONタイプ| Javaタイプ

オブジェクト| LinkedHashMap

4

3 に答える 3

151

この問題を回避するために、ParameterizedTypeReference が 3.2 M2 で導入されました。

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

ただし、postForObject/getForObject バリアントは導入されていません。

于 2014-01-16T09:44:59.020 に答える
10

あなたができると思う唯一のことは、Wrapper を拡張し、モデルをジェネリックとして使用する新しいクラスを作成することです。

class WrapperWithModel extends Wrapper<Model>{};

WrapperWithModel response = restTemplate.getForObject(URL, WrapperWithModel.class);

これは最善の解決策ではありませんが、少なくとも応答を手動でアンマーシャリングする必要はありません。

于 2014-01-22T16:53:00.333 に答える
2

RestTemplate でジェネリックを使用しないでください。ジェネリックを隠すラッパーオブジェクトでリクエストとレスポンスオブジェクトをラップします。

于 2012-07-19T13:17:53.260 に答える