首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在spring-boot应用程序中从YML文件加载多个属性

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

Stack Overflow用户
提问于 2016-03-30 05:11:28
回答 1查看 5.6K关注 0票数 0

我们有一个YML配置,如下所示:

代码语言:javascript
复制
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

我们必须将其加载到自定义类DataSources中,该类如下所示

代码语言:javascript
复制
@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引导配置文件如下所示:

代码语言:javascript
复制
@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);
  }
}

单元测试是:

代码语言:javascript
复制
@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);
  }
}

结果不像预期的那样。

  1. 当我从@Value类中删除DataSources时,属性readDataSourcewriteDataSource都是null ( DataSources类本身不是null)。
  2. 当我在@Value类中添加DataSources时,测试会异常失败。 由: java.lang.IllegalStateException:无法将java.lang.String类型的值转换为必需的类型com.abc.DataSource:没有找到匹配的编辑器或转换策略

感谢有人能提供一些如何处理这件事的想法。我想要的只是在像readDataSource这样的类中同时捕获DataSourceswriteDataSource

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-03-30 06:01:44

@Configuration注释您的@Configuration类,然后创建两个用@ConfigurationProperties注释的@Bean方法。

代码语言:javascript
复制
@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();
    }
}

现在您有了两个数据源,它的属性绑定到创建的DataSource上,在中解释了这个机制。

如果您不需要DataSource,但是构造您自己的对象(尽管不确定为什么需要它),也会出现同样的情况。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36300195

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档