2017-11-10 14 views
0

を無視している:は、なぜ私は、次のGroovyコードを持ってRestTemplateがrootUri

def test(){ 
    RequestEntity request=RequestEntity.method(HttpMethod.GET,new URI("/some/resource")) 
     .accept("text/plain") 
     .build() 

    def template=new RestTemplateBuilder() 
     .rootUri("http://example.com/api") 
     .build() 
    def response=template.exchange(request,String) 
    assert response.statusCode.value()==200 
} 

それはこのようなものを返します。

org.springframework.web.client.ResourceAccessException: I/O error on GET request for "/some/resource": null; nested exception is org.apache.http.client.ClientProtocolException 
    at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:666) 
    at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:628) 
    at org.springframework.web.client.RestTemplate.exchange(RestTemplate.java:590) 
    … 
Caused by: org.apache.http.client.ClientProtocolException 
    at org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:187) 
    at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:83) 
    at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:56) 
    at org.springframework.http.client.HttpComponentsClientHttpRequest.executeInternal(HttpComponentsClientHttpRequest.java:89) 
    at org.springframework.http.client.AbstractBufferingClientHttpRequest.executeInternal(AbstractBufferingClientHttpRequest.java:48) 
    … 
Caused by: org.apache.http.ProtocolException: Target host is not specified 
    at org.apache.http.impl.conn.DefaultRoutePlanner.determineRoute(DefaultRoutePlanner.java:71) 
    at org.apache.http.impl.client.InternalHttpClient.determineRoute(InternalHttpClient.java:125) 
    at org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:184) 
... 15 more 

rootUriがRestTemplateBuilderによって無視されているように見えます。すべてのリクエストを「/」で始める方法はありますか?「http://example.com/api」を追加しますか?

+0

ことは可能ですか? – ajc

+0

@ajc良いアイデア。リファクタリングやその他のクリエイティブな変更がなければ、私の場合はそうではありません。 – User1

答えて

1

同様の問題がありました。

restTemplate.postForEntity("/foo", request, SomeClass.class) 

そこで、基本的に

restTemplate.postForEntity(URI.create("/foo", request, SomeClass.class) 

を変更することによってそれを解決し、文字列としてパスを指定しようとしませURIとして。それ以降はrootUriを尊重すべきです。お役に立てれば。

行動は、ここで説明:あなたはリクエストオブジェクトを構築する前に、そのチェックをするのhttps://github.com/spring-projects/spring-boot/issues/7891

+0

参照されている問題は、 'TestRestTemplate'について語っています。実際の 'RestTemplate'動作は変更されていません。文字列を渡すと、RootUriハンドラが呼び出されます。あなたがURIを渡すなら、そうではありません。 – Andreas

関連する問題