Home > Blockchain >  Spring boot application.properties naming
Spring boot application.properties naming

Time:05-19

I am learning about springboot and trying to connect to a DB2 database. I got that working just fine.

Below are my working DB2 properties:

spring.datasource.url=jdbc:db2://server:port/database:currentSchema=schema-name;
spring.datasource.username=user1
spring.datasource.password=password1

But I renamed them to start with "db2" instead "spring" like:

db2.datasource.url=jdbc:db2://server:port/database:currentSchema=schema-name;
db2.datasource.username=user1
db2.datasource.password=password1

My app still runs, hHowever, when I do that, my controllers no longer return results as they did before the rename.

The reason I ask this is that if I add 2nd data source in the future, I could distinguish easily properties by their data sources if I name them like this.

UPDATE:

Thanks to @Kosta Tenasis answer below and this article (https://www.javadevjournal.com/spring-boot/multiple-data-sources-with-spring-boot/), I was able to resolve and figure this out.

Then going back to my specific question, once you have the configuration for data source in place, you can then modify application.properties to have:

db2.datasource.url=...

instead of having:

spring.datasource.url=...

NOTE1: if you are using Springboot 2.0, they changed to use Hikari and Hikari does not have url property but instead uses jdbc-url, so just change above to:

db2.datasource.jdbc-url=...

NOTE2: In your datasource that you had to create when adding multiple datasources to your project, you will have annotation @ConfigurationProperties. This annotation needs to point to your updated application.properties for datasource (the db2.datasource.url).

CodePudding user response:

By default Spring looks for spring.datasource.** for the properties of the DataSource to connect to.

So you might be getting wrong results because you are not connecting to the database. If you want to configure a DataSource with different,from default, properties you can do like so

@Configuration
public class DataSourceConfig {

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

And let's say a day comes along and you want a second DataSource you can modify the previous class to something like:

@Configuration
public class DataSourceConfig {

@Bean
@ConfigurationProperties(prefix="db2.datasource")
public DataSource d2Datasource() {
    return DataSourceBuilder.create()
                            .build();
}

@Bean
@ConfigurationProperties(prefix="db3.datasource")
public DataSource db3Datasource() { //pun intented
    return DataSourceBuilder.create()
                            .build();
    }
}

and after that in each Class that you want a DataSource you can specify which of the beans you like:

public class DB3DependedClass{
    
    private final DataSource dataSource;

    public DB3DependedClass(@Qualifier("db3Datasource") DataSource dataSource){
           this.dataSource = dataSource;
 
    }
}

So by default spring will look for

  1. spring.datasource.url (or spring.datasource.jdbc-url)
  2. spring.datasource.username
  3. spring.datasource.password

If you specify another DataSource of your own, those values are not needed.

So in the above example where we specified let's say db3.datasource spring will look for

  1. db3.datasource.url
  2. db3.datasource.username
  3. db3.datasource.password

Important thing here is that the spring IS NOT inferred meaning the complete path is indeed: db3.datasource.url and NOT spring.db3.datasource.url

Finally to wrap this up you do have the flexibility to make it start with spring if you want so by declaring a prefix like spring.any.path.ilike.datasouce and of course under that the related values. Spring will pick up either path as long as you specify it.

NOTE: This answer is written solely in the text box provided here and was not tested in an IDE for compilation errors. The logic still holds though

  • Related