2015-03-02 15 views
27

mit Frühlings-Stiefel kann ich ein JdbcTemplate mit folgenden instanziiert:Configure Datasource programmatisch im Frühjahr Boot-

Code:

@Autowired 
private JdbcTemplate jdbcTemplate; 

Eigenschaften:

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 

Diese Datasource der Klasse erstellen: org.apache.tomcat.jdbc.pool.DataSource

Wie stelle ich die ein? DataSource Benutzername/Passwort programmgesteuert?

Wir haben eine Richtlinie, Anmeldeinformationen nicht im Klartext zu speichern, und ich muss einen bestimmten Credential Provider verwenden, wo ich arbeite.

Antwort

50

Sie können DataSourceBuilder verwenden, wenn Sie jdbc Starter verwenden. Um die Standard-Autokonfigurations-Bean zu überschreiben, müssen Sie Ihre Bean als @Primary

In meinem Fall habe ich Eigenschaften beginnend mit datasource.postgres Präfix.

Z. B

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

Wenn es nicht möglich für Sie ist, dann können Sie

@Bean 
@Primary 
public DataSource dataSource() { 
    return DataSourceBuilder 
     .create() 
     .username("") 
     .password("") 
     .url("") 
     .driverClassName("") 
     .build(); 
} 
+2

@Primary nicht notwendig ist, da die Autokonfiguration nur einen Datasource-Bean erzeugt, wenn kein anderer Bean definiert ist. – dunni

+0

create() sollte wahrscheinlich zuerst – Gevorg

+0

Primär nicht erforderlich sein. @Bean ermöglicht Spring Boot die Konfiguration zu registrieren. Name der Treiberklasse, URL, Benutzer, pwd erforderlich –

9

Alles, was Sie tun müssen, verwenden, um ein Verfahren mit Anmerkungen versehen, die eine Datasource mit @Bean zurückgibt. Ein vollständiges Arbeitsbeispiel folgt.

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

Danke, mein Projekt feder Boot hat normalerweise laufen nach Ihrer Hilfe, meine Datenquelle Konfiguration in meinem Projekt als Gebrüll:

**configuration in application.yml** 
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 

Benutzerdefinierte Datasource

@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(); 
    } 
} 
+1

Diese Antwort hilft, weil es zeigt, wie die Standardeigenschaft spring.datasource zum Definieren der DataSource verwendet wird. Beachten Sie, dass Sie überschreiben möchten Nur das Passwort, sagen Sie, dann müssten Sie die Kennwortdefinition aus application.properties (oder application.yml) entfernen und diese eine Eigenschaft im Code festlegen. –

1

Wenn Sie mehr Datenquellenkonfigurationen möchten, z

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

Sie unter Code

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

verweisen verwenden: Spring boot jdbc Connection

Verwandte Themen