2017-03-04 10 views
2

は私がオブジェクト春のリクエストリクエストでレスポンスHTTPヘッダーを変更するにはRestTemplate?

RestTemplate restTemplate = new RestTemplate(); 
Address address = restTemplate.getForObject(url, Address.class); 

を作成するための単純なJava春の方法を持っていますが、サーバーは私に間違ったのContent-TypeでJSON文字列を応答します。text/plainの代わりアプリケーションの/ JSON(ポストマンでチェック) 。そして、私は例外を取得:

は、応答を抽出できませんでした :いいえ、適切なHttpMessageConverter応答タイプ[クラスAddress]およびコンテンツタイプが見つかり、[テキスト/平野;のcharset = UTF-8]

だから私は私は変更応答ヘッダContent-Typeから右application/jsonが必要です、そのMappingJackson2HttpMessageConverterはJSON文字列を見つけてコードを実行すると思います。あなたのような何かを行うことができあなたの要求のコンテンツタイプを設定するには

答えて

2

1時間を試した後、私は短くて簡単な方法を見つけました。

デフォルトでは、Jsonコンバータは "application/json"のみをサポートしています。 "text/plain"をサポートするようにオーバーライドします。

MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter(); 

// support "text/plain" 
converter.setSupportedMediaTypes(Arrays.asList(TEXT_PLAIN, APPLICATION_JSON)); 

RestTemplate template = new RestTemplate(); 
template.getMessageConverters().add(converter); 

// It's ok now 
MyResult result = tmp.postForObject("http://url:8080/api", 
      new MyRequest("param value"), MyResult.class); 
0

HttpHeaders headers = new HttpHeaders(); 
    headers.setContentType(MediaType.APPLICATION_JSON); 
    HttpEntity entity = new HttpEntity(headers); 
    ResponseEntity<Address> response = restTemplate.exchange(url, HttpMethod.GET, entity, Address.class); 
    Address address = response.getBody(); 
+1

いいえ、動作しません。要求のヘッダーを変更するだけで、応答は変更しません。 –

+0

レスポンスのヘッダを変更することはできません。これらのヘッダはサーバによって送信されるため、サーバのコードを記述している場合を除き、必要な処理を行う方法はありません。 –

+0

この類似の質問を確認するhttp://stackoverflow.com/questions/24723394/could-not-extract-response-no-suuitable-httpmessageconverter-found-for-response –

1

は助けてくれてありがとう! 応答のヘッダーを変更できない場合があります。私は右のヘッダーで新しい応答オブジェクトを作成します。

  ClientHttpRequest clientHttpRequest = new SimpleClientHttpRequestFactory().createRequest(URI.create(str), org.springframework.http.HttpMethod.GET); 
      final ClientHttpResponse clientHttpResponse = clientHttpRequest.execute(); 
      MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter(); 
      Address address = new Address(); 
      //It always true, because service always returns 200 OK 
      if (clientHttpResponse.getStatusCode() == HttpStatus.OK) { 
       address = (Address) converter.read(address.getClass(), new HttpInputMessage() { 
        public InputStream getBody() throws IOException { 
         return clientHttpResponse.getBody(); 
        } 

        public HttpHeaders getHeaders() { 
         HttpHeaders httpHeaders = new HttpHeaders(); 
         httpHeaders.putAll(clientHttpResponse.getHeaders()); 
         httpHeaders.put("Content-Type", Collections.singletonList(MediaType.APPLICATION_JSON_VALUE)); 
         return httpHeaders; 
        } 
       }); 
       busStop.setNearestAddress(address.toString()); 
      } 

私はそれが簡単で、良い解決策ではないと確信しているが、それは動作します。

関連する問題