gpt4 book ai didi

java - 以编程方式加载 Spring 配置

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:45:15 25 4
gpt4 key购买 nike

我有 3 个微服务,它们都需要使用“公共(public)”库。我需要向公共(public)库添加一个新的 Spring 配置。问题是微服务 A 不关心新代码,也不希望被迫添加配置以使应用程序运行。我需要一种仅针对微服务 B 和 C 以编程方式加载配置的方法。

公共(public)库中的新配置:

@Configuration
public class HttpConnectionConfiguration {

@Value("${http.connect.timeout}")
private int httpConnectTimeout;

@Value("${http.connect.request.timeout}")
private int httpConnectRequestTimeout;

@Bean
public RestTemplate restTemplate() {
RestTemplate restTemplate = new RestTemplate();

restTemplate.setRequestFactory(getClientHttpRequestFactory());

return restTemplate;
}

private ClientHttpRequestFactory getClientHttpRequestFactory() {
RequestConfig config = RequestConfig.custom()
.setConnectTimeout(httpConnectTimeout)
.setConnectionRequestTimeout(httpConnectRequestTimeout)
.build();

CloseableHttpClient client = HttpClientBuilder
.create()
.useSystemProperties()
.setDefaultRequestConfig(config)
.build();

return new HttpComponentsClientHttpRequestFactory(client);
}
}

在application.yaml的微服务B和C中配置:

http:
connect:
timeout: 5000
request:
timeout: 5000

微服务 B 和 C 启动正常,但 A 给出了这个错误:Caused by: java.lang.IllegalArgumentException: Could not resolve placeholder 'http.connect.timeout' in value "${http.connect.timeout}

在微服务 A 中不提供虚拟值的情况下,解决此问题的最佳方法是什么?

最佳答案

解决方案 1:使用带有附加 @Configuration 类的配置层次结构,该类生成 RestTemplate bean,并仅为 B 和C(或当属性可用时):

@Configuration
@ConditionalOnProperty("http.connect.timeout")
public class HttpConnectionConfiguration {

// rest of code ...

解决方案 2:使用默认值。自 default timeout is -1 ,使用那个:

    @Value("${http.connect.timeout:-1}")
private int httpConnectTimeout;

@Value("${http.connect.request.timeout:-1}")
private int httpConnectRequestTimeout;

关于java - 以编程方式加载 Spring 配置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55296523/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com