我的应用程序中有以下有效的数据源配置
application.yaml:
spring:
datasource:
batch:
jdbcUrl: jdbc:mysql://localhost:33060/test
username: root
password: somepassowrd
driver-class-name: com.mysql.cj.jdbc.Driver
minimumIdle: 5
maximumPoolSize: 15
idleTimeout: 30000
connectionTimeout: 30000
reader:
jdbcUrl: jdbc:mysql://localhost:3306/BL
username: root
password: someotherpassowrd
driver-class-name: com.mysql.cj.jdbc.Driver
minimumIdle: 5
maximumPoolSize: 15
idleTimeout: 30000
connectionTimeout: 30000
数据源配置类:
@Configuration
class DatasourceConfiguration() {
@Bean(name = ["batchDatasource"])
@ConfigurationProperties(prefix = "spring.datasource.batch")
@BatchDataSource
fun batchDataSource(): DataSource = HikariDataSource()
@Bean(name = ["daoDatasource"])
@ConfigurationProperties(prefix = "spring.datasource.reader")
@Primary
fun readerDataSource(): DataSource = HikariDataSource()
}
正如所说,这工作得很好,但我现在有一个限制,即 application.yaml 中的密码是加密的(硬限制 - 无法更改它)。
如何在创建数据源之前解密密码?
我尝试过:
spring:
datasource:
batch:
jdbcUrl: jdbc:mysql://localhost:33060/test
username: root
password: somepassowrd
driver-class-name: com.mysql.cj.jdbc.Driver
minimumIdle: 5
maximumPoolSize: 15
idleTimeout: 30000
connectionTimeout: 30000
reader:
jdbcUrl: jdbc:mysql://localhost:3306/BL
username: root
password: someotherpassowrd
driver-class-name: com.mysql.cj.jdbc.Driver
minimumIdle: 5
maximumPoolSize: 15
idleTimeout: 30000
connectionTimeout: 30000
数据源配置类:
@Configuration
class DatasourceConfiguration() {
@Bean(name = ["batchDatasource"])
@ConfigurationProperties(prefix = "spring.datasource.batch")
@BatchDataSource
fun batchDataSource(@Value("${spring.datasource.batch.password}") encryptedPassword: String): DataSource = HikariDataSource()
.apply(password = decryptPassword(encryptedPassword))
@Bean(name = ["daoDatasource"])
@ConfigurationProperties(prefix = "spring.datasource.reader")
@Primary
fun readerDataSource(@Value("${spring.datasource.reader.password}") encryptedPassword: String): DataSource = HikariDataSource()
.apply(password = decryptPassword(encryptedPassword))
}
但是没有成功
我能够通过一个小解决方法解决这个问题: application.yaml:
spring:
datasource:
batch:
jdbcUrl: jdbc:mysql://localhost:33060/test
username: root
encrypted-password: somepassowrd
driver-class-name: com.mysql.cj.jdbc.Driver
minimumIdle: 5
maximumPoolSize: 15
idleTimeout: 30000
connectionTimeout: 30000
reader:
jdbcUrl: jdbc:mysql://localhost:3306/BL
username: root
encrypted-password: someotherpassowrd
driver-class-name: com.mysql.cj.jdbc.Driver
minimumIdle: 5
maximumPoolSize: 15
idleTimeout: 30000
connectionTimeout: 30000
数据源配置类:
@Configuration
class DatasourceConfiguration() {
@Bean(name = ["batchDatasource"])
@ConfigurationProperties(prefix = "spring.datasource.batch")
@BatchDataSource
fun batchDataSource(@Value("${spring.datasource.batch.encrypted-password}") encryptedPassword: String): DataSource = HikariDataSource()
.apply(password = decryptPassword(encryptedPassword))
@Bean(name = ["daoDatasource"])
@ConfigurationProperties(prefix = "spring.datasource.reader")
@Primary
fun readerDataSource(@Value("${spring.datasource.reader.encrypted-password}") encryptedPassword: String): DataSource = HikariDataSource()
.apply(password = decryptPassword(encryptedPassword))
}
说明: 我认为我在
apply
子句中设置的内容被 @ConfigurationProperties
覆盖。因此,我没有在 application.yaml
中声明密码,而是设置了一个不同的属性,然后 @ConfigurationProperties
不会覆盖密码,这样我就可以获取此属性,解密它并将其设置为 apply
子句中的密码