Spring で直接接続用とプロキシ経由の RestTemplate Bean を構成する
呼び出しごとに共有ルートを切り替えるのではなく、HTTP プロキシ用と明示的に直接接続する JDK 用に別々の RestTemplate Bean を作成します。
呼び出しによっては社内プロキシを使う必要があり、別のサービスは直接到達します。リクエストが重なる可能性があるため、共有ファクトリを書き換えるのではなく、それらの経路に別々の RestTemplate インスタンスを与えます。
既存の Spring 構成クラスの内部で:
@Bean("directRestTemplate")
RestTemplate directRestTemplate() {
var factory = new SimpleClientHttpRequestFactory();
factory.setProxy(java.net.Proxy.NO_PROXY);
return new RestTemplate(factory);
}
@Bean("proxyRestTemplate")
RestTemplate proxyRestTemplate() {
var factory = new SimpleClientHttpRequestFactory();
factory.setProxy(new java.net.Proxy(
java.net.Proxy.Type.HTTP,
new java.net.InetSocketAddress("proxy.example", 8080)));
return new RestTemplate(factory);
}
Spring 6.2 の JDK リクエストファクトリでは、Proxy.NO_PROXY が明示的な直接接続ポリシーを提供します。ファクトリのプロキシを未設定のままにすると、代わりに通常の URLConnection 構成経路が許可され、JVM プロキシが選択される可能性があります。
必要な Bean を選ぶには注入ポイントで @Qualifier を使います。たとえば @Qualifier("directRestTemplate") RestTemplate rest です。2 つの Bean を定義するだけでは、あいまいな依存関係に対してどちらを選ぶか決まりません。
この例は認証なしの HTTP プロキシを選びます。プロキシ認証が必要なトランスポートは、同じ Bean 選択の構成を保ったまま、対応する資格情報プロバイダとともに別途構築できます。Apache HttpClient 5 を使う Spring 6 では、そのプロバイダをプロキシのエンドポイントに限定してください。
アプリケーションが意図的に組み込んだ他のインターセプタやリクエストファクトリは、引き続きそのクライアント自身の構成に属します。実際に必要とする経路とともに保ってください。