java - 上下文表单循环中的多个 RestTemplate 构建器

标签 java spring spring-boot

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

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

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 应该注入(inject)到 customRestTemplateBuilder(...) 中,并且返回值应该生成一个名为 customRestTemplateBuilder 的新 bean。感谢任何有关可能出现问题的指示?

this question 的答案建议定义 RestTemplate beans。但这会阻止在我的测试中使用 RestClientTest

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

定义一个新的 RestTemplateBuilder 可以解决该问题,但 Spring 初始化会丢失。

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

最佳答案

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

关于java - 上下文表单循环中的多个 RestTemplate 构建器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56434353/

相关文章:

java - 两个线程作用于同一个可运行对象

Spring 安全/OAuth : mapping between Principal's authority and role in @RolesAllowed

java - 使用 JpaRepository 进行动态查询

Java RestHighLevelClient 与 AWS ElasticSearch

spring-mvc - 使用 thymeleaf 和 spring boot 上传和显示图像

java - 需要存储另一个领域模型的领域模型

java - 无法断开套接字

java - 在域模型对象中使用工厂?

java - 在 AWS lambda 中部署 Spring Boot 应用程序

java - 在android中使用公历获取当前的儒略日数