如何在spring-boot应用程序中从YML文件加载多个属性

Nir*_*jan 0 java configuration spring 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-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
Run Code Online (Sandbox Code Playgroud)

我们必须将它加载到一个DataSources看起来像的自定义类

@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 
}
Run Code Online (Sandbox Code Playgroud)

我的弹簧启动配置文件如下所示:

@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);
  }
}
Run Code Online (Sandbox Code Playgroud)

单元测试是:

@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);
  }
}
Run Code Online (Sandbox Code Playgroud)

结果不符合预期.

  1. 当我删除@ValueDataSources类,两者的性质readDataSourcewriteDataSource为空(的DataSources类本身不为空).
  2. 当我@ValueDataSources课堂上添加时,测试会失败并出现异常

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

感谢是否有人可以提供一些如何处理这个问题的想法.我想要的只是捕捉一个类的内部readDataSourcewriteDataSource内部DataSources.

M. *_*num 6

注释您的DataSources类,@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();
    }
}
Run Code Online (Sandbox Code Playgroud)

现在您有2个数据源,其属性绑定到创建的DataSources.Spring Boot Reference Guide中解释这种机制.

如果您不需要DataSource构建自己的对象(虽然不确定为什么需要它?),这同样适用.