由于我们的properties文件设置相当复杂,因此我们不能简单地使用@PropertySource

这是属性文件:

connection.http.connectTimeout=15000
#connection.http.readTimeout=${connection.http.connectTimeout}
connection.http.readTimeout=#{30*1000}


第二行仍然可以工作,并将readTimeout设置为15000,但是在第三行中,该值仅为0。

Bean类:

@Component
@ConfigurationProperties("connection")
public class ConnectionConfig {

  @NestedConfigurationProperty
  private ConnectionSourceConfig http;

  public ConnectionSourceConfig getHttp() {
    return http;
  }

  public void setHttp(ConnectionSourceConfig http) {
    this.http = http;
  }

}

public class ConnectionSourceConfig {

  private long connectTimeout;

  private long readTimeout;

  public long getConnectTimeout() {
    return connectTimeout;
  }

  public void setConnectTimeout(long connectTimeout) {
    this.connectTimeout = connectTimeout;
  }

  public long getReadTimeout() {
    return readTimeout;
  }

  public void setReadTimeout(long readTimeout) {
    this.readTimeout = readTimeout;
  }

}


使用PropertySourcesPlaceholderConfigurer似乎使SpEL无法正常工作:

@Configuration
public class BaseAppConfig {

  @Bean
  public static PropertySourcesPlaceholderConfigurer properties(Environment environment) throws IOException {
    String env = getEnvProperty(environment);
    PropertySourcesPlaceholderConfigurer configurer = new PropertySourcesPlaceholderConfigurer();
    configurer.setLocations(getPropertiesFiles(env));
    configurer.setIgnoreResourceNotFound(true);
    return configurer;
  }


我尝试了PropertySourcesPlaceholderConfigurer鸽友,但从未调用convertPropertyValue()

    PropertySourcesPlaceholderConfigurer configurer = new PropertySourcesPlaceholderConfigurer() {

      @Override
      protected String convertPropertyValue(String originalValue) {
        System.out.println("Parse " + originalValue);
        return super.convertPropertyValue(originalValue);
      }

    };


我试图研究一下Spring是如何工作的,它似乎可以与PropertyResolver一起使用。但是,我不知道如何将它编织到其中。

但是,也许我在处理Spring的生命周期方面犯了一个错误...

最佳答案

在属性文件方面,#被视为注释块。这样做,您的属性文件最终会将一个属性设置为空。

connection.http.readTimeout=#{30*1000}之所以选择connection.http.readTimeout=,是因为#之后的所有内容都会被忽略。

10-06 02:01