在Spring Boot中以编程方式配置DataSource

Mar*_*ace 59 java spring datasource credential-providers spring-boot

使用Spring Boot,我可以JdbcTemplate使用以下内容实例化:

码:

@Autowired
private JdbcTemplate jdbcTemplate;
Run Code Online (Sandbox Code Playgroud)

属性:

spring.datasource.url=jdbc:postgresql://my_url:my_port/my_other_stuff
spring.datasource.username=my_user_name
spring.datasource.password=my_password
spring.datasource.driver-class-name=org.postgresql.Driver
Run Code Online (Sandbox Code Playgroud)

这创建了一个类的DataSource: org.apache.tomcat.jdbc.pool.DataSource

如何以编程方式设置DataSource用户名/密码?

我们的策略是不以纯文本格式存储凭据,我必须在我工作的地方使用特定的凭据提供程序.

Edd*_*dez 82

您可以使用DataSourceBuilder,如果你使用的是jdbc首发.此外,为了覆盖默认的自动配置bean,您需要将bean标记为@Primary

在我的情况下,我有以datasource.postgresprefix 开头的属性.

例如

@ConfigurationProperties(prefix = "datasource.postgres")
@Bean
@Primary
public DataSource dataSource() {
    return DataSourceBuilder
        .create()
        .build();
}
Run Code Online (Sandbox Code Playgroud)

如果您不可行,那么您可以使用

@Bean
@Primary
public DataSource dataSource() {
    return DataSourceBuilder
        .create()
        .username("")
        .password("")
        .url("")
        .driverClassName("")
        .build();
}
Run Code Online (Sandbox Code Playgroud)

  • @Primary不是必需的,因为当没有定义其他bean时,AutoConfiguration只创建一个DataSource bean. (6认同)
  • 但是如何设置`spring.datasource.validation-query`和`spring.datasource.test-while-idle`和`spring.datasource.time-between-eviction-runs-millis` (6认同)

小智 21

我的spring-boot项目已根据您的帮助正常运行.yaml数据源配置是:

spring:
  # (DataSourceAutoConfiguration & DataSourceProperties)
  datasource:
    name: ds-h2
    url: jdbc:h2:D:/work/workspace/fdata;DATABASE_TO_UPPER=false
    username: h2
    password: h2
    driver-class: org.h2.Driver
Run Code Online (Sandbox Code Playgroud)

自定义数据源

@Configuration
@Component
public class DataSourceBean {

    @ConfigurationProperties(prefix = "spring.datasource")
    @Bean
    @Primary
    public DataSource getDataSource() {
        return DataSourceBuilder
                .create()
//                .url("jdbc:h2:D:/work/workspace/fork/gs-serving-web-content/initial/data/fdata;DATABASE_TO_UPPER=false")
//                .username("h2")
//                .password("h2")
//                .driverClassName("org.h2.Driver")
                .build();
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 这个答案有帮助,因为它显示了如何使用默认的spring.datasource属性来定义DataSource.请注意,如果您只想覆盖密码,那么您需要从application.properties(或application.yml)中删除密码定义,并在代码中设置该属性. (2认同)

Rod*_*yas 11

您需要做的就是注释一个返回带有@Bean的DataSource的方法.完整的工作示例如下.

@Bean
public DataSource dataSource() {
    DataSourceBuilder dataSourceBuilder = DataSourceBuilder.create();
        dataSourceBuilder.url(dbUrl);
        dataSourceBuilder.username(username);
        dataSourceBuilder.password(password);
        return dataSourceBuilder.build();   
}
Run Code Online (Sandbox Code Playgroud)


ACV*_*ACV 6

如果您使用的是最新的Spring Boot(带有jdbc starter和Hikari),则会遇到: java.lang.IllegalArgumentException: jdbcUrl is required with driverClassName. 解决此问题的方法:

  1. 在您的application.properties中:

datasource.oracle.url=youroracleurl

  1. 在您的应用程序中定义为bean(@Primary是必需的!):
@Bean
@Primary
@ConfigurationProperties("datasource.oracle")
public DataSourceProperties getDatasourceProperties() {
    return new DataSourceProperties();
}

@Bean
@ConfigurationProperties("datasource.oracle")
public DataSource getDatasource() {
    return getDatasourceProperties().initializeDataSourceBuilder()
           .username("username")
           .password("password")
           .build();
}
Run Code Online (Sandbox Code Playgroud)

  • 有一个更简单的方法:在应用程序属性(即applicaiotion.yml)中将:`spring.datasource.url`重命名为`spring.datasource.jdbc-url`。这应该可以解决问题!(在我的例子中是这样的 - SpringBoot v2.3.2) (3认同)

zhu*_*wei 5

如果你想要更多的日期源配置,例如

spring.datasource.test-while-idle=true 
spring.datasource.time-between-eviction-runs-millis=30000
spring.datasource.validation-query=select 1
Run Code Online (Sandbox Code Playgroud)

你可以使用下面的代码

@Bean
public DataSource dataSource() {
    DataSource dataSource = new DataSource(); // org.apache.tomcat.jdbc.pool.DataSource;
    dataSource.setDriverClassName(driverClassName);
    dataSource.setUrl(url);
    dataSource.setUsername(username);
    dataSource.setPassword(password);
    dataSource.setTestWhileIdle(testWhileIdle);     
    dataSource.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMills);
    dataSource.setValidationQuery(validationQuery);
    return dataSource;
}
Run Code Online (Sandbox Code Playgroud)

参考:Spring 启动 jdbc 连接