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)
结果不符合预期.
@Value从DataSources类,两者的性质readDataSource和writeDataSource为空(的DataSources类本身不为空).当我@Value在DataSources课堂上添加时,测试会失败并出现异常
引起:java.lang.IllegalStateException:无法将类型[java.lang.String]的值转换为必需的类型[com.abc.DataSource]:找不到匹配的编辑器或转换策略
感谢是否有人可以提供一些如何处理这个问题的想法.我想要的只是捕捉一个类的内部readDataSource和writeDataSource内部DataSources.
注释您的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构建自己的对象(虽然不确定为什么需要它?),这同样适用.
| 归档时间: |
|
| 查看次数: |
4317 次 |
| 最近记录: |