以编程方式加载Spring配置

4

我有三个微服务,它们都需要使用一个名为“common”的库。我需要在共享库中添加新的Spring配置文件。问题是微服务A不关心新代码,也不想被强制添加配置以便运行应用程序。我需要一种方法,只为微服务B和C编写程序来加载配置。

共享库中的新配置:

@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);
    }
}

应用程序.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}

在不提供假值的情况下,最好的解决方法是什么?

2个回答

1

解决方案1:使用配置层次结构并添加一个@Configuration类,创建一个RestTemplate bean,并仅在B和C(或属性可用时)激活它:

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

    // rest of code ...

解决方案2:使用默认值。由于默认超时时间是-1, 因此使用该值:

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

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

关于解决方案1,有几个问题需要澄清:如何添加多个ConditionalOnProperty,因为我可能需要包含几个属性。此外,在包含建议的注释后,现在会抛出以下错误:Bean method 'restTemplate' in 'HttpConnectionConfiguration' not loaded because @ConditionalOnProperty (http.connect.timeout) did not find property 'http.connect.timeout' - maloney
显然,在A配置中,您不应该自动装配或以其他方式访问RestTemplate bean。您可以通过在A配置中不实例化B和C(例如进行更细粒度的组件扫描)来实现这一点。 - rustyx

0

您可以使用 SpEL 表达式在 @Value 中指定默认值,如下所示。

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接