REST サービスの呼び出し
Spring Boot は、リモート REST サービスを呼び出すためのさまざまな便利な方法を提供します。ノンブロッキングリアクティブアプリケーションを開発していて、Spring WebFlux を使用している場合は、WebClient
(Javadoc) を使用できます。ブロッキング API を使用する場合は、RestClient
(Javadoc) または RestTemplate
(Javadoc) を使用できます。
WebClient
クラスパスに Spring または WebFlux がある場合は、WebClient
(Javadoc) を使用して リモート REST サービスを呼び出すことをお勧めします。WebClient
(Javadoc) インターフェースは関数型 API を提供し、完全にリアクティブです。WebClient
(Javadoc) の詳細については、Spring Framework ドキュメントの専用セクションを参照してください。
リアクティブ Spring WebFlux アプリケーションを作成していない場合は、WebClient (Javadoc) の代わりに RestClient を使用できます。これにより、同様の機能 API が提供されますが、リアクティブではなくブロッキングになります。 |
Spring Boot は、プロトタイプ WebClient.Builder
(Javadoc) Bean を作成し、事前構成します。これをコンポーネントに挿入し、WebClient
(Javadoc) インスタンスの作成に使用することを強くお勧めします。Spring Boot は、HTTP リソースを共有し、サーバーのものと同じ方法でコーデックの設定を反映するようにビルダーを構成します (WebFlux HTTP コーデックの自動構成を参照)。
次のコードは典型的な例を示しています。
Java
Kotlin
import reactor.core.publisher.Mono;
import org.springframework.stereotype.Service;
import org.springframework.web.reactive.function.client.WebClient;
@Service
public class MyService {
private final WebClient webClient;
public MyService(WebClient.Builder webClientBuilder) {
this.webClient = webClientBuilder.baseUrl("https://example.org").build();
}
public Mono<Details> someRestCall(String name) {
return this.webClient.get().uri("/{name}/details", name).retrieve().bodyToMono(Details.class);
}
}
import org.springframework.stereotype.Service
import org.springframework.web.reactive.function.client.WebClient
import reactor.core.publisher.Mono
@Service
class MyService(webClientBuilder: WebClient.Builder) {
private val webClient: WebClient
init {
webClient = webClientBuilder.baseUrl("https://example.org").build()
}
fun someRestCall(name: String?): Mono<Details> {
return webClient.get().uri("/{name}/details", name)
.retrieve().bodyToMono(Details::class.java)
}
}
WebClient ランタイム
Spring Boot は、アプリケーションクラスパスで使用可能なライブラリに応じて、WebClient
(Javadoc) を駆動するために使用する ClientHttpConnector
(Javadoc) を自動検出します。優先順位に従って、次のクライアントがサポートされます。
Reactor Netty
Jetty RS クライアント
Apache HttpClient
JDK HttpClient
クラスパス上で複数のクライアントが使用可能な場合は、最も優先されるクライアントが使用されます。
spring-boot-starter-webflux
スターターは、デフォルトで io.projectreactor.netty:reactor-netty
に依存しており、サーバーとクライアントの両方の実装をもたらします。代わりにリアクティブサーバーとして Jetty を使用することを選択した場合は、Jetty リアクティブ HTTP クライアントライブラリ org.eclipse.jetty:jetty-reactive-httpclient
への依存関係を追加する必要があります。サーバーとクライアントに同じテクノロジーを使用すると、クライアントとサーバー間で HTTP リソースが自動的に共有されるため、利点があります。
開発者は、カスタム ReactorResourceFactory
(Javadoc) または JettyResourceFactory
(Javadoc) Bean を提供することで、Jetty および Reactor Netty のリソース構成をオーバーライドできます。これは、クライアントとサーバーの両方に適用されます。
クライアントの選択を上書きする場合は、独自の ClientHttpConnector
(Javadoc) Bean を定義して、クライアント構成を完全に制御できます。
Spring Framework リファレンスドキュメントの WebClient
構成オプションについて詳しく知ることができます。
WebClient のカスタマイズ
WebClient
(Javadoc) のカスタマイズには、カスタマイズをどの程度広範囲に適用するかに応じて、主に 3 つのアプローチがあります。
カスタマイズの範囲をできるだけ狭くするには、自動構成された WebClient.Builder
(Javadoc) を挿入し、必要に応じてそのメソッドを呼び出します。WebClient.Builder
(Javadoc) インスタンスはステートフルです。つまり、ビルダーの変更は、その後に作成されるすべてのクライアントに反映されます。同じビルダーで複数のクライアントを作成する場合は、WebClient.Builder other = builder.clone();
を使用してビルダーを複製することも検討できます。
アプリケーション全体ですべての WebClient.Builder
(Javadoc) インスタンスに追加のカスタマイズを行うには、WebClientCustomizer
(Javadoc) Bean を宣言し、注入時点で WebClient.Builder
(Javadoc) をローカルに変更できます。
最後に、元の API にフォールバックして WebClient.create()
を使用することもできます。その場合、自動構成や WebClientCustomizer
(Javadoc) は適用されません。
WebClient SSL サポート
WebClient
(Javadoc) で使用される ClientHttpConnector
(Javadoc) でカスタム SSL 構成が必要な場合は、ビルダーの apply
メソッドで使用できる WebClientSsl
(Javadoc) インスタンスを挿入できます。
WebClientSsl
(Javadoc) インターフェースは、application.properties
または application.yaml
ファイルで定義した任意の SSL バンドルへのアクセスを提供します。
次のコードは典型的な例を示しています。
Java
Kotlin
import reactor.core.publisher.Mono;
import org.springframework.boot.autoconfigure.web.reactive.function.client.WebClientSsl;
import org.springframework.stereotype.Service;
import org.springframework.web.reactive.function.client.WebClient;
@Service
public class MyService {
private final WebClient webClient;
public MyService(WebClient.Builder webClientBuilder, WebClientSsl ssl) {
this.webClient = webClientBuilder.baseUrl("https://example.org").apply(ssl.fromBundle("mybundle")).build();
}
public Mono<Details> someRestCall(String name) {
return this.webClient.get().uri("/{name}/details", name).retrieve().bodyToMono(Details.class);
}
}
import org.springframework.boot.autoconfigure.web.reactive.function.client.WebClientSsl
import org.springframework.stereotype.Service
import org.springframework.web.reactive.function.client.WebClient
import reactor.core.publisher.Mono
@Service
class MyService(webClientBuilder: WebClient.Builder, ssl: WebClientSsl) {
private val webClient: WebClient
init {
webClient = webClientBuilder.baseUrl("https://example.org")
.apply(ssl.fromBundle("mybundle")).build()
}
fun someRestCall(name: String?): Mono<Details> {
return webClient.get().uri("/{name}/details", name)
.retrieve().bodyToMono(Details::class.java)
}
}
RestClient
アプリケーションで Spring、WebFlux、プロジェクト Reactor を使用していない場合は、RestClient
(Javadoc) を使用して リモート REST サービスを呼び出すことをお勧めします。
RestClient
(Javadoc) インターフェースは、関数型のブロッキング API を提供します。
Spring Boot は、プロトタイプ RestClient.Builder
(Javadoc) Bean を作成し、事前構成します。これをコンポーネントに挿入し、それを使用して RestClient
(Javadoc) インスタンスを作成することを強くお勧めします。Spring Boot は、そのビルダーを HttpMessageConverters
(Javadoc) と適切な ClientHttpRequestFactory
(Javadoc) で構成しています。
次のコードは典型的な例を示しています。
Java
Kotlin
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestClient;
@Service
public class MyService {
private final RestClient restClient;
public MyService(RestClient.Builder restClientBuilder) {
this.restClient = restClientBuilder.baseUrl("https://example.org").build();
}
public Details someRestCall(String name) {
return this.restClient.get().uri("/{name}/details", name).retrieve().body(Details.class);
}
}
import org.springframework.boot.docs.io.restclient.restclient.ssl.Details
import org.springframework.stereotype.Service
import org.springframework.web.client.RestClient
@Service
class MyService(restClientBuilder: RestClient.Builder) {
private val restClient: RestClient
init {
restClient = restClientBuilder.baseUrl("https://example.org").build()
}
fun someRestCall(name: String?): Details {
return restClient.get().uri("/{name}/details", name)
.retrieve().body(Details::class.java)!!
}
}
RestClient のカスタマイズ
RestClient
(Javadoc) のカスタマイズには、カスタマイズをどの程度広範囲に適用するかに応じて、主に 3 つのアプローチがあります。
カスタマイズの範囲をできるだけ狭くするには、自動構成された RestClient.Builder
(Javadoc) を挿入し、必要に応じてそのメソッドを呼び出します。RestClient.Builder
(Javadoc) インスタンスはステートフルです。つまり、ビルダーの変更は、その後に作成されるすべてのクライアントに反映されます。同じビルダーで複数のクライアントを作成する場合は、RestClient.Builder other = builder.clone();
を使用してビルダーを複製することも検討できます。
アプリケーション全体ですべての RestClient.Builder
(Javadoc) インスタンスに追加のカスタマイズを行うには、RestClientCustomizer
(Javadoc) Bean を宣言し、注入時点で RestClient.Builder
(Javadoc) をローカルに変更できます。
最後に、元の API にフォールバックして RestClient.create()
を使用することもできます。その場合、自動構成や RestClientCustomizer
(Javadoc) は適用されません。
グローバル HTTP クライアント構成を変更することもできます。 |
RestClient SSL サポート
RestClient
(Javadoc) で使用される ClientHttpRequestFactory
(Javadoc) でカスタム SSL 構成が必要な場合は、ビルダーの apply
メソッドで使用できる RestClientSsl
(Javadoc) インスタンスを挿入できます。
RestClientSsl
(Javadoc) インターフェースは、application.properties
または application.yaml
ファイルで定義した任意の SSL バンドルへのアクセスを提供します。
次のコードは典型的な例を示しています。
Java
Kotlin
import org.springframework.boot.autoconfigure.web.client.RestClientSsl;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestClient;
@Service
public class MyService {
private final RestClient restClient;
public MyService(RestClient.Builder restClientBuilder, RestClientSsl ssl) {
this.restClient = restClientBuilder.baseUrl("https://example.org").apply(ssl.fromBundle("mybundle")).build();
}
public Details someRestCall(String name) {
return this.restClient.get().uri("/{name}/details", name).retrieve().body(Details.class);
}
}
import org.springframework.boot.autoconfigure.web.client.RestClientSsl
import org.springframework.boot.docs.io.restclient.restclient.ssl.settings.Details
import org.springframework.stereotype.Service
import org.springframework.web.client.RestClient
@Service
class MyService(restClientBuilder: RestClient.Builder, ssl: RestClientSsl) {
private val restClient: RestClient
init {
restClient = restClientBuilder.baseUrl("https://example.org")
.apply(ssl.fromBundle("mybundle")).build()
}
fun someRestCall(name: String?): Details {
return restClient.get().uri("/{name}/details", name)
.retrieve().body(Details::class.java)!!
}
}
SSL バンドルに加えて他のカスタマイズを適用する必要がある場合は、ClientHttpRequestFactoryBuilder
(Javadoc) とともに ClientHttpRequestFactorySettings
(Javadoc) クラスを使用できます。
Java
Kotlin
import java.time.Duration;
import org.springframework.boot.http.client.ClientHttpRequestFactoryBuilder;
import org.springframework.boot.http.client.ClientHttpRequestFactorySettings;
import org.springframework.boot.ssl.SslBundles;
import org.springframework.http.client.ClientHttpRequestFactory;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestClient;
@Service
public class MyService {
private final RestClient restClient;
public MyService(RestClient.Builder restClientBuilder, SslBundles sslBundles) {
ClientHttpRequestFactorySettings settings = ClientHttpRequestFactorySettings
.ofSslBundle(sslBundles.getBundle("mybundle"))
.withReadTimeout(Duration.ofMinutes(2));
ClientHttpRequestFactory requestFactory = ClientHttpRequestFactoryBuilder.detect().build(settings);
this.restClient = restClientBuilder.baseUrl("https://example.org").requestFactory(requestFactory).build();
}
public Details someRestCall(String name) {
return this.restClient.get().uri("/{name}/details", name).retrieve().body(Details.class);
}
}
import org.springframework.boot.http.client.ClientHttpRequestFactoryBuilder;
import org.springframework.boot.http.client.ClientHttpRequestFactorySettings;
import org.springframework.boot.ssl.SslBundles
import org.springframework.stereotype.Service
import org.springframework.web.client.RestClient
import java.time.Duration
@Service
class MyService(restClientBuilder: RestClient.Builder, sslBundles: SslBundles) {
private val restClient: RestClient
init {
val settings = ClientHttpRequestFactorySettings.defaults()
.withReadTimeout(Duration.ofMinutes(2))
.withSslBundle(sslBundles.getBundle("mybundle"))
val requestFactory = ClientHttpRequestFactoryBuilder.detect().build(settings);
restClient = restClientBuilder
.baseUrl("https://example.org")
.requestFactory(requestFactory).build()
}
fun someRestCall(name: String?): Details {
return restClient.get().uri("/{name}/details", name).retrieve().body(Details::class.java)!!
}
}
RestTemplate
Spring Framework の RestTemplate
(Javadoc) クラスは RestClient
(Javadoc) より古く、多くのアプリケーションが リモート REST サービスを呼び出すために使用する従来の方法です。RestClient
(Javadoc) に移行したくない既存のコードがある場合、または RestTemplate
(Javadoc) API にすでに精通している場合は、RestTemplate
(Javadoc) を使用することを選択できます。
RestTemplate
(Javadoc) インスタンスは使用前にカスタマイズする必要があることが多いため、Spring Boot は単一の自動構成された RestTemplate
(Javadoc) Bean を提供しません。ただし、必要に応じて RestTemplate
(Javadoc) インスタンスを作成するために使用できる RestTemplateBuilder
(Javadoc) は自動構成されます。自動構成された RestTemplateBuilder
(Javadoc) により、適切な HttpMessageConverters
(Javadoc) と適切な ClientHttpRequestFactory
(Javadoc) が RestTemplate
(Javadoc) インスタンスに適用されます。
次のコードは典型的な例を示しています。
Java
Kotlin
import org.springframework.boot.web.client.RestTemplateBuilder;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;
@Service
public class MyService {
private final RestTemplate restTemplate;
public MyService(RestTemplateBuilder restTemplateBuilder) {
this.restTemplate = restTemplateBuilder.build();
}
public Details someRestCall(String name) {
return this.restTemplate.getForObject("/{name}/details", Details.class, name);
}
}
import org.springframework.boot.web.client.RestTemplateBuilder
import org.springframework.stereotype.Service
import org.springframework.web.client.RestTemplate
@Service
class MyService(restTemplateBuilder: RestTemplateBuilder) {
private val restTemplate: RestTemplate
init {
restTemplate = restTemplateBuilder.build()
}
fun someRestCall(name: String): Details {
return restTemplate.getForObject("/{name}/details", Details::class.java, name)!!
}
}
RestTemplateBuilder
(Javadoc) には、RestTemplate
(Javadoc) をすばやく構成するために使用できる便利なメソッドが多数含まれています。たとえば、BASIC 認証サポートを追加するには、builder.basicAuthentication("user", "password").build()
を使用できます。
RestTemplate のカスタマイズ
RestTemplate
(Javadoc) のカスタマイズには、カスタマイズをどの程度広範囲に適用するかに応じて、主に 3 つのアプローチがあります。
カスタマイズの範囲をできるだけ狭くするには、自動構成された RestTemplateBuilder
(Javadoc) を挿入し、必要に応じてそのメソッドを呼び出します。各メソッド呼び出しは新しい RestTemplateBuilder
(Javadoc) インスタンスを返すため、カスタマイズはビルダーのこの使用にのみ影響します。
アプリケーション全体にわたる追加カスタマイズを行うには、RestTemplateCustomizer
(Javadoc) Bean を使用します。このような Bean はすべて、自動構成された RestTemplateBuilder
(Javadoc) に自動的に登録され、それを使用して構築されたすべてのテンプレートに適用されます。
次の例は、192.168.0.5
を除くすべてのホストに対してプロキシの使用を構成するカスタマイザーを示しています。
Java
Kotlin
import org.apache.hc.client5.http.classic.HttpClient;
import org.apache.hc.client5.http.impl.classic.HttpClientBuilder;
import org.apache.hc.client5.http.impl.routing.DefaultProxyRoutePlanner;
import org.apache.hc.client5.http.routing.HttpRoutePlanner;
import org.apache.hc.core5.http.HttpException;
import org.apache.hc.core5.http.HttpHost;
import org.apache.hc.core5.http.protocol.HttpContext;
import org.springframework.boot.web.client.RestTemplateCustomizer;
import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
import org.springframework.web.client.RestTemplate;
public class MyRestTemplateCustomizer implements RestTemplateCustomizer {
@Override
public void customize(RestTemplate restTemplate) {
HttpRoutePlanner routePlanner = new CustomRoutePlanner(new HttpHost("proxy.example.com"));
HttpClient httpClient = HttpClientBuilder.create().setRoutePlanner(routePlanner).build();
restTemplate.setRequestFactory(new HttpComponentsClientHttpRequestFactory(httpClient));
}
static class CustomRoutePlanner extends DefaultProxyRoutePlanner {
CustomRoutePlanner(HttpHost proxy) {
super(proxy);
}
@Override
protected HttpHost determineProxy(HttpHost target, HttpContext context) throws HttpException {
if (target.getHostName().equals("192.168.0.5")) {
return null;
}
return super.determineProxy(target, context);
}
}
}
import org.apache.hc.client5.http.classic.HttpClient
import org.apache.hc.client5.http.impl.classic.HttpClientBuilder
import org.apache.hc.client5.http.impl.routing.DefaultProxyRoutePlanner
import org.apache.hc.client5.http.routing.HttpRoutePlanner
import org.apache.hc.core5.http.HttpException
import org.apache.hc.core5.http.HttpHost
import org.apache.hc.core5.http.protocol.HttpContext
import org.springframework.boot.web.client.RestTemplateCustomizer
import org.springframework.http.client.HttpComponentsClientHttpRequestFactory
import org.springframework.web.client.RestTemplate
class MyRestTemplateCustomizer : RestTemplateCustomizer {
override fun customize(restTemplate: RestTemplate) {
val routePlanner: HttpRoutePlanner = CustomRoutePlanner(HttpHost("proxy.example.com"))
val httpClient: HttpClient = HttpClientBuilder.create().setRoutePlanner(routePlanner).build()
restTemplate.requestFactory = HttpComponentsClientHttpRequestFactory(httpClient)
}
internal class CustomRoutePlanner(proxy: HttpHost?) : DefaultProxyRoutePlanner(proxy) {
@Throws(HttpException::class)
public override fun determineProxy(target: HttpHost, context: HttpContext): HttpHost? {
if (target.hostName == "192.168.0.5") {
return null
}
return super.determineProxy(target, context)
}
}
}
最後に、独自の RestTemplateBuilder
(Javadoc) Bean を定義できます。これにより、自動構成されたビルダーが置き換えられます。自動構成で実行されたように、カスタムビルダーに RestTemplateCustomizer
(Javadoc) Bean を適用する場合は、RestTemplateBuilderConfigurer
(Javadoc) を使用して構成します。次の例では、カスタム接続および読み取りタイムアウトも指定されていることを除いて、Spring Boot の自動構成で実行されたものと一致する RestTemplateBuilder
(Javadoc) を公開します。
Java
Kotlin
import java.time.Duration;
import org.springframework.boot.autoconfigure.web.client.RestTemplateBuilderConfigurer;
import org.springframework.boot.web.client.RestTemplateBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration(proxyBeanMethods = false)
public class MyRestTemplateBuilderConfiguration {
@Bean
public RestTemplateBuilder restTemplateBuilder(RestTemplateBuilderConfigurer configurer) {
return configurer.configure(new RestTemplateBuilder())
.connectTimeout(Duration.ofSeconds(5))
.readTimeout(Duration.ofSeconds(2));
}
}
import org.springframework.boot.autoconfigure.web.client.RestTemplateBuilderConfigurer
import org.springframework.boot.web.client.RestTemplateBuilder
import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.Configuration
import java.time.Duration
@Configuration(proxyBeanMethods = false)
class MyRestTemplateBuilderConfiguration {
@Bean
fun restTemplateBuilder(configurer: RestTemplateBuilderConfigurer): RestTemplateBuilder {
return configurer.configure(RestTemplateBuilder()).connectTimeout(Duration.ofSeconds(5))
.readTimeout(Duration.ofSeconds(2))
}
}
最も極端な(そしてめったに使用されない)オプションは、コンフィギュラを使用せずに独自の RestTemplateBuilder
(Javadoc) Bean を作成することです。これにより、自動構成されたビルダーが置き換えられるだけでなく、RestTemplateCustomizer
(Javadoc) Bean が使用されなくなります。
グローバル HTTP クライアント構成を変更することもできます。 |
RestTemplate SSL サポート
RestTemplate
(Javadoc) でカスタム SSL 構成が必要な場合は、次の例に示すように、SSL バンドルを RestTemplateBuilder
(Javadoc) に適用できます。
Java
Kotlin
import org.springframework.boot.docs.io.restclient.resttemplate.Details;
import org.springframework.boot.ssl.SslBundles;
import org.springframework.boot.web.client.RestTemplateBuilder;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;
@Service
public class MyService {
private final RestTemplate restTemplate;
public MyService(RestTemplateBuilder restTemplateBuilder, SslBundles sslBundles) {
this.restTemplate = restTemplateBuilder.sslBundle(sslBundles.getBundle("mybundle")).build();
}
public Details someRestCall(String name) {
return this.restTemplate.getForObject("/{name}/details", Details.class, name);
}
}
import org.springframework.boot.docs.io.restclient.resttemplate.Details
import org.springframework.boot.ssl.SslBundles
import org.springframework.boot.web.client.RestTemplateBuilder
import org.springframework.stereotype.Service
import org.springframework.web.client.RestTemplate
@Service
class MyService(restTemplateBuilder: RestTemplateBuilder, sslBundles: SslBundles) {
private val restTemplate: RestTemplate
init {
restTemplate = restTemplateBuilder.sslBundle(sslBundles.getBundle("mybundle")).build()
}
fun someRestCall(name: String): Details {
return restTemplate.getForObject("/{name}/details", Details::class.java, name)!!
}
}
RestClient および RestTemplate の HTTP クライアントの検出
Spring Boot は、アプリケーションクラスパスで使用可能なライブラリに応じて、RestClient
(Javadoc) および RestTemplate
(Javadoc) で使用する HTTP クライアントを自動検出します。優先順位に従って、次のクライアントがサポートされます。
Apache HttpClient
Jetty HttpClient
Reactor Netty HttpClient
JDK クライアント (
java.net.http.HttpClient
)シンプルな JDK クライアント (
java.net.HttpURLConnection
)
クラスパス上で複数のクライアントが使用可能であり、グローバル構成が提供されていない場合は、最も優先されるクライアントが使用されます。
グローバル HTTP クライアント構成
自動検出された HTTP クライアントがニーズを満たさない場合は、spring.http.client.factory
プロパティを使用して特定のファクトリを選択できます。例: クラスパスに Apache HttpClient があるが、Jetty の HttpClient
(英語) を使用する場合は、以下を追加できます。
プロパティ
YAML
spring.http.client.factory=jetty
spring:
http:
client:
factory: jetty
すべてのクライアントに適用されるデフォルトを変更するプロパティを設定することもできます。例: タイムアウトを変更したり、リダイレクトに従うかどうかを変更したりすることができます。
プロパティ
YAML
spring.http.client.connect-timeout=2s
spring.http.client.read-timeout=1s
spring.http.client.redirects=dont-follow
spring:
http:
client:
connect-timeout: 2s
read-timeout: 1s
redirects: dont-follow
より複雑なカスタマイズを行うには、独自の ClientHttpRequestFactoryBuilder
(Javadoc) Bean を宣言して、自動構成を無効にできます。これは、基盤となる HTTP ライブラリの内部の一部をカスタマイズする必要がある場合に役立ちます。
例: 以下は、特定の ProxySelector
(標準 Javadoc) で構成された JDK クライアントを使用します。
Java
Kotlin
import java.net.ProxySelector;
import org.springframework.boot.http.client.ClientHttpRequestFactoryBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration(proxyBeanMethods = false)
public class MyClientHttpConfiguration {
@Bean
ClientHttpRequestFactoryBuilder<?> clientHttpRequestFactoryBuilder(ProxySelector proxySelector) {
return ClientHttpRequestFactoryBuilder.jdk()
.withHttpClientCustomizer((builder) -> builder.proxy(proxySelector));
}
}
import org.springframework.boot.http.client.ClientHttpRequestFactoryBuilder
import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.Configuration
import java.net.ProxySelector
import java.net.http.HttpClient
@Configuration(proxyBeanMethods = false)
class MyClientHttpConfiguration {
@Bean
fun clientHttpRequestFactoryBuilder(proxySelector: ProxySelector): ClientHttpRequestFactoryBuilder<*> {
return ClientHttpRequestFactoryBuilder.jdk()
.withHttpClientCustomizer { builder -> builder.proxy(proxySelector) }
}
}