Некоторые вызовы должны идти через корпоративный прокси, а другой сервис доступен напрямую. Дайте этим маршрутам отдельные экземпляры 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);
}

Для фабрики запросов JDK в Spring 6.2 Proxy.NO_PROXY задаёт явную политику прямого подключения. Если оставить прокси фабрики незаданным, вместо этого разрешается обычный путь конфигурации URLConnection, который может выбрать прокси JVM.

Используйте @Qualifier в точке внедрения, чтобы выбрать нужный bean, например @Qualifier("directRestTemplate") RestTemplate rest. Само по себе определение двух bean-ов не выбирает между ними при неоднозначной зависимости.

Этот пример выбирает HTTP-прокси без аутентификации. Транспорт, которому нужна аутентификация прокси, можно собрать отдельно с поддерживаемым им поставщиком учётных данных, сохранив ту же схему выбора bean-ов. Для Spring 6 с Apache HttpClient 5 ограничьте этого поставщика конечной точкой прокси.

Другие перехватчики или фабрики запросов, намеренно установленные приложением, по-прежнему относятся к его собственной конфигурации клиента. Держите их вместе с маршрутом, которому они действительно нужны.

Похожие статьи