web-dev-qa-db-ja.com

ResponseEntity <List>によって返されたList <myObj>を返します

My RESTクライアントはRestTemplateを使用してオブジェクトのリストを取得します。

ResponseEntitiy<List> res = restTemplate.postForEntity(getUrl(), myDTO, List.class);

次に、返されたリストを使用して、呼び出し元のクラスにListとして返します。文字列の場合、toStringを使用できますが、リストの回避策は何ですか?

11
ND_27

まず、リストの要素のタイプがわかっている場合は、ParameterizedTypeReferenceクラスをそのように使用できます。

ResponseEntity<List<MyObj>> res = restTemplate.postForEntity(getUrl(), myDTO, new ParameterizedTypeReference<List<MyObj>>() {});

次に、リストを返すだけの場合は、次のことができます。

return res.getBody();

そして、あなたが気にするのがリストだけなら、あなたはただ行うことができます:

// postForEntity returns a ResponseEntity, postForObject returns the body directly.
return restTemplate.postForObject(getUrl(), myDTO, new ParameterizedTypeReference<List<MyObj>>() {});
18
Christophe L

受け入れられた答えが機能しませんでした。 postForEntityにはこのメソッドシグネチャがなくなったようです。代わりにrestTemplate.exchange()を使用する必要がありました:

ResponseEntity<List<MyObj>> res = restTemplate.exchange(getUrl(), HttpMethod.POST, myDTO, new ParameterizedTypeReference<List<MyObj>>() {});

次に、上記のようにリストを返します。

return res.getBody();
11
kaybee99

最新バージョン(Spring Framework 5.1.6)では、両方の回答が機能しません。 kaybee99が彼の answerpostForEntityで言及したように、メソッドシグネチャが変更されました。また、restTemplate.exchange()メソッドとそのオーバーロードには、RequestEntity<T>またはその親HttpEntity<T>オブジェクトが必要です。前述のとおり、DTOオブジェクトを渡すことができません。

RestTemplateクラスのドキュメントをチェックアウト

これは私のために働いたコードです

List<Shinobi> shinobis = new ArrayList<>();
shinobis.add(new Shinobi(1, "Naruto", "Uzumaki"));
shinobis.add(new Shinobi(2, "Sasuke", "Uchiha");
RequestEntity<List<Shinobi>> request = RequestEntity
            .post(new URI(getUrl()))
            .accept(MediaType.APPLICATION_JSON)
            .contentType(MediaType.APPLICATION_JSON)
            .body(shinobis);
ResponseEntity<List<Shinobi>> response = restTemplate.exchange(
            getUrl(), 
            HttpMethod.POST, 
            request, 
            new ParameterizedTypeReference<List<Shinobi>>() {}
            );
List<Shinobi> result = response.getBody();

それが誰かを助けることを願っています。

3
RikudouSennin

ResponseEntityのラップを解除し、オブジェクト(リスト)を取得できます

 res.getBody()
0
kris