Spring Cloud не удалось разрешить «$ {spring.util.timeout.sec: $ {SPRING_UTIL_TIMEOUT_SEC: 1}}» при использовании PropertySourcesPlaceholderConfigurer - PullRequest
0 голосов
/ 05 ноября 2018

Итак, у меня есть сторонняя библиотека, для которой определен PropertySourcesPlaceholderConfigurer, например:

@Bean
PropertySourcesPlaceholderConfigurer libraryProperties() {
    PropertySourcesPlaceholderConfigurer config = new PropertySourcesPlaceholderConfigurer();
    config.setLocations(new Resource[]{new ClassPathResource("library_config.properties")});
    config.setPlaceholderPrefix("$library{");
    config.setPlaceholderSuffix("}");
    config.setIgnoreResourceNotFound(true);
    config.setIgnoreUnresolvablePlaceholders(true);
    return config;
}

тогда как в моем приложении я просто использую автоконфигурацию Spring Boot 2.1.0 для настройки всего.

Приложение работает нормально, если я удаляю Spring Cloud (клиент), комментируя:

    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-config</artifactId>
    </dependency>

но как только я добавлю эту зависимость, я получу следующую трассировку стека:

org.springframework.beans.factory.UnsatisfiedDependencyException: 
Error creating bean with name 'compositeDiscoveryClient' defined in class path resource [org/springframework/cloud/client/discovery/composite/CompositeDiscoveryClientAutoConfiguration.class]: 
Unsatisfied dependency expressed through method 'compositeDiscoveryClient' parameter 0; 

nested exception is 
org.springframework.beans.factory.UnsatisfiedDependencyException: 
Error creating bean with name 'org.springframework.cloud.client.discovery.simple.SimpleDiscoveryClientAutoConfiguration':
Unsatisfied dependency expressed through field 'inet'; 

nested exception is 
org.springframework.beans.factory.UnsatisfiedDependencyException: 
Error creating bean with name 'inetUtils' defined in class path resource [org/springframework/cloud/commons/util/UtilAutoConfiguration.class]: 
Unsatisfied dependency expressed through method 'inetUtils' parameter 0; 

nested exception is 
org.springframework.beans.factory.UnsatisfiedDependencyException: 
Error creating bean with name 'inetUtilsProperties': 
Unsatisfied dependency expressed through field 'timeoutSeconds'; 

nested exception is 
org.springframework.beans.TypeMismatchException: 
Failed to convert value of type 'java.lang.String' to required type 'int'; nested exception is java.lang.NumberFormatException: For input string: "${spring.util.timeout.sec:${SPRING_UTIL_TIMEOUT_SEC:1}}"

Который в классе InetUtilsProperties определяется как:

/**
 * Timeout, in seconds, for calculating hostname.
 */
@Value("${spring.util.timeout.sec:${SPRING_UTIL_TIMEOUT_SEC:1}}")
private int timeoutSeconds = 1;

Почему @Value не разрешается с этим PropertySourcesPlaceholderConfigurer?

Я должен отметить, что до использования этой библиотеки Spring Cloud работал как шарм.

Можете ли вы, ребята, помочь мне здесь?

Заранее спасибо!

1 Ответ

0 голосов
/ 26 февраля 2019

Этот пользовательский PropertySourcesPlaceholderConfigurer (разрешение $library{foo}) переопределяет параметр автоконфигурации, который помогает разрешить ${foo}. Добавьте это в свою конфигурацию и попробуйте снова:

    @Bean
    public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() {
        return new PropertySourcesPlaceholderConfigurer();
    }
...