web-dev-qa-db-fra.com

Configurer DataSource par programme dans Spring Boot

Avec Spring Boot, je peux instancier une JdbcTemplate avec les éléments suivants:

Code:

@Autowired
private JdbcTemplate jdbcTemplate;

Propriétés:

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

Cela crée une source de données de classe: org.Apache.Tomcat.jdbc.pool.DataSource

Comment définir le nom d'utilisateur/mot de passe DataSource par programme?

Nous avons pour politique de ne pas stocker les informations d'identification en texte brut et je dois utiliser un fournisseur d'informations d'identification spécifique sur lequel je travaille.

54
Gevorg

Vous pouvez utiliser DataSourceBuilder si vous utilisez jdbc starter. De plus, pour remplacer le bean d'autoconfiguration par défaut, vous devez marquer votre bean en tant que @Primary.

Dans mon cas, j'ai des propriétés commençant par datasource.postgres préfixe.

Par exemple

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

Si ce n'est pas faisable pour vous, alors vous pouvez utiliser

@Bean
@Primary
public DataSource dataSource() {
    return DataSourceBuilder
        .create()
        .username("")
        .password("")
        .url("")
        .driverClassName("")
        .build();
}
77
Eddú Meléndez

Mon projet de spring-boot a fonctionné normalement en fonction de votre aide. La configuration de la source de données yaml est la suivante:

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

source de données personnalisée

@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();
    }
}
20
Alfer Wei

Tout ce que vous avez à faire est d’annoter une méthode qui renvoie un DataSource avec @Bean. Un exemple de travail complet suit.

@Bean
public DataSource dataSource() {
    DataSourceBuilder dataSourceBuilder = DataSourceBuilder.create();
        dataSourceBuilder.url(dbUrl);
        dataSourceBuilder.username(username);
        dataSourceBuilder.password(password);
        return dataSourceBuilder.build();   
}
11

Si vous voulez plus de config de datesource, par exemple.

spring.datasource.test-while-idle=true 
spring.datasource.time-between-eviction-runs-millis=30000
spring.datasource.validation-query=select 1

vous pouvez utiliser le code ci-dessous

@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;
}

voir: Connexion Spring Boot jdbc

4
zhuguowei

Si vous utilisez la dernière botte de printemps (avec jdbc starter et Hikari), vous rencontrerez: _Java.lang.IllegalArgumentException: jdbcUrl is required with driverClassName._ Pour résoudre ceci:

  1. Dans votre application.properties:

_datasource.Oracle.url=youroracleurl_

  1. Dans votre application, définissez comme bean (_@Primary_ est obligatoire!):
_@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();
}
_
3
ACV

Vous pouvez également utiliser DriverManagerDataSource comme:

public DataSource getDataSource(DBInfo db) {

    DriverManagerDataSource dataSource = new DriverManagerDataSource();

    dataSource.setUsername(db.getUsername());
    dataSource.setPassword(db.getPassword());
    dataSource.setUrl(db.getUrl());
    dataSource.setDriverClassName(db.getDriverClassName());

    return dataSource;
}

Attention toutefois à l'utiliser, car:

REMARQUE: cette classe n'est pas un pool de connexions réel. il ne regroupe pas réellement les connexions. Il ne sert que de simple remplacement pour un pool de connexions complet, implémentant la même interface standard, mais créant de nouvelles connexions à chaque appel. référence

2
MMKarami