Несколько циклов RestTemplateBuilders в контексте форм - PullRequest
0 голосов
/ 03 июня 2019

Мое приложение выполняет вызовы 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");
    }

Ответы [ 2 ]

0 голосов
/ 04 июня 2019

RestTemplateBuilder используется для создания одиночных RestTemplates.

Проще всего просто создать два restTemplates и использовать @Qualifier для каждого RestTemplate.

0 голосов
/ 04 июня 2019

У вас нет выбора, кроме как определить 2 компонента в вашем контексте, который может использовать одну и ту же логику инициализации, определив метод init для обоих.Так как повторное использование уровня bean невозможно, как показано в вашем примере.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...