Мое приложение выполняет вызовы REST для 2 различных веб-сервисов. Первый использует базовую аутентификацию, а второй - нет. Я хотел бы определить bean-компонент RestTemplateBuilder с настроенными базовыми учетными данными аутентификации и использовать его для случая basic-auth и использовать настроенный по умолчанию Spring RestTemplateBuilder для случая non-basic-auth.
Но определение пользовательского компонента RestTemplateBuilder завершается неудачей загрузки контекста (подробности ниже).
Определение бина:
@Configuration
class RestTemplateBuilderConfig {
@Bean
public RestTemplateBuilder customRestTemplateBuilder(RestTemplateBuilder springConfiguredRestTemplateBuilder) {
return
springConfiguredRestTemplateBuilder
.basicAuthentication("user", "password");
}
}
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
Ошибка загрузки контекста:
***************************
APPLICATION FAILED TO START
***************************
Description:
The dependencies of some of the beans in the application context form a cycle:
┌─────┐
| customRestTemplateBuilder defined in class path resource [com/example/demo/RestTemplateBuilderConfig.class]
└─────┘
Как я понимаю, инициализированный пружиной компонент должен быть введен в customRestTemplateBuilder(...)
, а возвращаемое значение должно привести к созданию нового компонента с именем customRestTemplateBuilder
. Цените любые указания на то, что может пойти не так?
Ответы на на этот вопрос предлагают определить бины RestTemplate. Но это помешало бы использовать RestClientTest
в моих тестах.
Я мог бы внедрить инициализированный Spring RestTemplateBuilder в мои службы и установить учетные данные до restTemplateBuilder.build()
в каждой из служб. Но тогда логика для установки учетных данных будет распределена по службам (нарушая DRY).
Определение нового RestTemplateBuilder решает проблему, но инициализация Spring теряется.
@Bean
public RestTemplateBuilder customRestTemplateBuilder() {
return
new RestTemplateBuilder()
.basicAuthentication("user", "password");
}