首页 > 解决方案 > 上下文表单循环中的多个 RestTemplateBuilders

问题描述

我的应用程序对 2 个不同的 Web 服务进行 REST 调用。第一个使用基本身份验证,第二个不使用。我想定义一个配置了基本身份验证凭据的 RestTemplateBuilder bean,并将其用于基本身份验证情况,并将默认 Spring 配置的 RestTemplateBuilder 用于非基本身份验证情况。

但是定义自定义 RestTemplateBuilder bean 会导致上下文加载失败(详情如下)。

豆定义:

@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]
└─────┘

据我了解,应该将 spring 初始化的 bean 注入customRestTemplateBuilder(...),并且返回值应该产生一个名为 name 的新 bean customRestTemplateBuilder。感谢有关可能出现问题的任何指示?

这个问题的答案建议定义 RestTemplate bean。但这会阻止RestClientTest在我的测试中使用。

我可以将 Spring 初始化的 RestTemplateBuilder 注入到我的服务中,并restTemplateBuilder.build()在每个服务之前设置凭据。但是随后设置凭据的逻辑将分布在服务中(违反 DRY)。

定义一个新的 RestTemplateBuilder 解决了这个问题,但是 Spring 初始化丢失了。

@Bean
    public RestTemplateBuilder customRestTemplateBuilder() {
        return
            new RestTemplateBuilder()
                .basicAuthentication("user", "password");
    }

标签: javaspringspring-boot

解决方案


您别无选择,只能在您的上下文中定义 2 个 bean,它们可能通过为两者定义一个 init 方法来共享相同的初始化逻辑。正如您的示例中所示,由于 bean 级别的重用是不可能的。


推荐阅读