Java 如何在spring引导应用程序中从YML文件加载多个属性
我们的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
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参考指南中进行了解释
如果您不需要数据源
,而是构建您自己的对象(尽管不确定为什么需要它?),则同样适用