Java 如何在spring引导应用程序中从YML文件加载多个属性

Java 如何在spring引导应用程序中从YML文件加载多个属性,java,spring,configuration,spring-boot,Java,Spring,Configuration,Spring Boot,我们的YML配置如下所示: datasurces: readDataSource: ssl-enabled: false driver-class-name: oracle.jdbc.driver.OracleDriver host: db1.abc.com port: 1232 sid: ABC_DB trust-store-fileName: abcdb.jks connection-pool: initial-siz

我们的YML配置如下所示:

datasurces: 
  readDataSource:
    ssl-enabled: false
    driver-class-name: oracle.jdbc.driver.OracleDriver
    host: db1.abc.com
    port: 1232
    sid: ABC_DB
    trust-store-fileName: abcdb.jks
    connection-pool:
      initial-size: 10
      max-size: 20

  writeDataSource:
    ssl-enabled: false
    driver-class-name: oracle.jdbc.driver.OracleDriver
    host: db2.abc.com
    port: 1232
    sid: XYZ_DB
    trust-store-fileName: xyzdb.jks
    connection-pool:
      initial-size: 10
      max-size: 20
@Configuration
@ComponentScan(basePackages = {"com.abc"})
@EnableAspectJAutoProxy(proxyTargetClass = true)
@EnableConfigurationProperties(DataSources.class)
@Profile({"dev"})
public class TestAppConfiguration {

}

@EnableAutoConfiguration
@SpringBootApplication
@EnableConfigurationProperties(DataSources.class)
public class TestAppInitializer {
  @Autowired
  private DataSources dataSources;

  public static void main(final String[] args) {
    SpringApplication.run(TestAppInitializer.class, args);
  }
}
我们必须将其加载到自定义类
数据源中

@ConfigurationProperties(prefix = "datasources")
public class DataSources {
  @Value("${datasources.readDataSource}")
  private DataSource readDataSource;

  @Value("${datasources.writeDataSource}")
  private DataSource writeDataSource;

  //...getters/setters
}

public class DataSource {
  private String id;
  private boolean sslEnabled;
  private String driverClassName;
  private String host;
  private int port;
  private String trustStoreFileName;
  private ConnectionPool connectionPool;

  //...getters/setters  
}

public class ConnectionPool {
  private int initialSize;
  private int maxSize;

  //...getters/setters 
}
我的spring boot配置文件如下所示:

datasurces: 
  readDataSource:
    ssl-enabled: false
    driver-class-name: oracle.jdbc.driver.OracleDriver
    host: db1.abc.com
    port: 1232
    sid: ABC_DB
    trust-store-fileName: abcdb.jks
    connection-pool:
      initial-size: 10
      max-size: 20

  writeDataSource:
    ssl-enabled: false
    driver-class-name: oracle.jdbc.driver.OracleDriver
    host: db2.abc.com
    port: 1232
    sid: XYZ_DB
    trust-store-fileName: xyzdb.jks
    connection-pool:
      initial-size: 10
      max-size: 20
@Configuration
@ComponentScan(basePackages = {"com.abc"})
@EnableAspectJAutoProxy(proxyTargetClass = true)
@EnableConfigurationProperties(DataSources.class)
@Profile({"dev"})
public class TestAppConfiguration {

}

@EnableAutoConfiguration
@SpringBootApplication
@EnableConfigurationProperties(DataSources.class)
public class TestAppInitializer {
  @Autowired
  private DataSources dataSources;

  public static void main(final String[] args) {
    SpringApplication.run(TestAppInitializer.class, args);
  }
}
单元测试是:

@SpringApplicationConfiguration(classes = {TestAppInitializer.class})
@Test(groups = "categoryTests")
@ActiveProfiles("dev")
public class DataSourcesTest extends AbstractTestNGSpringContextTests {
  private static final AppLogger logger = LoggerUtil.getLogger(DataSourcesTest.class);

  @Autowired
  private DataSources dataSources;

  @Test
  public void printDetails() {
    logger.debug("DataSources --> {}", dataSources);
  }
}
结果并不像预期的那样

  • 当我从
    数据源
    类中删除
    @Value
    时,属性
    readDataSource
    writeDataSource
    都为null(数据源
  • 类本身不为null)
  • 当我在
    DataSources
    类中添加
    @Value
    时,测试异常失败

    原因:java.lang.IllegalStateException:无法将[java.lang.String]类型的值转换为所需类型[com.abc.DataSource]:未找到匹配的编辑器或转换策略


  • 如果有人能提供一些解决方法,我将不胜感激。我只想在类中捕获
    readDataSource
    writedasource
    ,比如
    DataSources

    @ConfigurationProperties
    注释你的
    数据源
    类,然后创建两个
    @Bean
    @ConfigurationProperties
    注释的方法

    @Configuration
    public class DataSources {
    
        @Bean
        @ConfigurationProperties(prefix="datasources.readDataSource")
        public DataSource readDataSource() {
            return DataSourceBuilder.create().build();
        }
    
        @Bean
        @ConfigurationProperties(prefix="datasources.writeDataSource")
        public DataSource writeDataSource() {
            return DataSourceBuilder.create().build();
        }
    }
    
    现在有2个数据源,其属性绑定到创建的
    DataSource
    s。这一机制在Spring Boot参考指南中进行了解释


    如果您不需要
    数据源
    ,而是构建您自己的对象(尽管不确定为什么需要它?),则同样适用

    @Configuration
    注释
    数据源
    类,然后创建2个
    @Bean
    方法,用
    @ConfigurationProperties
    注释

    @Configuration
    public class DataSources {
    
        @Bean
        @ConfigurationProperties(prefix="datasources.readDataSource")
        public DataSource readDataSource() {
            return DataSourceBuilder.create().build();
        }
    
        @Bean
        @ConfigurationProperties(prefix="datasources.writeDataSource")
        public DataSource writeDataSource() {
            return DataSourceBuilder.create().build();
        }
    }
    
    现在有2个数据源,其属性绑定到创建的
    DataSource
    s。这一机制在Spring Boot参考指南中进行了解释

    如果您不需要
    数据源
    ,而是构建您自己的对象(尽管不确定为什么需要它?),则同样适用