Michael Schaefer
Michael Schaefer

Reputation: 88

SpringBoot Datasource AutoConfiguration Not Working

I have a simple SpringBoot application and I'd like to use AutoConfiguration to configure the Tomcat jdbc pooled data sources.

I am using these Spring dependencies:

// Spring Boot
compile 'org.springframework.boot:spring-boot-starter-web:1.3.5.RELEASE'
compile 'org.springframework.boot:spring-boot-starter-jdbc:1.3.5.RELEASE'

Here are my datasource properties in my application.yml file:

spring:
    datasource:
        url: jdbc:mysql://my.host/mydb
        username: user
        password: pwd
        driver-class-name: com.mysql.jdbc.Driver
        initialSize: 5

I am sure the properties are being loaded because the app is picking up other values.

I define the bean in my config file as:

@Bean(name="myDataSource")
@ConfigurationProperties(prefix="spring.datasource")
public DataSource getDataSource() {
    DataSource dataSource = DataSourceBuilder.create().build()
    return dataSource
}

And I inject the datasource into my DAO like this:

@Slf4j
@Repository
class MyDAO {

    @Autowired
    DataSource dataSource

    public void getFoo() {
        log.info("DB URL: ${dataSource.getUrl()}")
    }
}

If I set a breakpoint in the getDataSource() method, the DataSourceBuilder will create an instance of DataSource. However, all the properties of that object like URL, user and password are all null. Also, when I call getFoo(), the dataSource variable is null. I have tried commenting out the bean definition in my AppConfig. The dataSource is still null. Any suggestions?

I looked through the Spring Boot documentation and my Spring book but I didn't see any examples like this. I see examples where I create the DataSource myself. But I was hoping Spring's auto-configuration would tie this stuff together automatically.

Thanks in advance for any help you can provide.

Upvotes: 3

Views: 6998

Answers (2)

Michael Schaefer
Michael Schaefer

Reputation: 88

Based on Andy's comments I found out that I had two problems. First of all, I needed to include the JPA dependency to the project. I added this line to my build.gradle file:

compile 'org.springframework.boot:spring-boot-starter-data-jpa:1.3.5.RELEASE'

Second, I was creating instances of MyDAO using new(). I fixed this by creating a service class that used @Autowired to inject an instance of MyDAO. Once the DAO became a Spring managed bean, it was able to inject the instance of DataSource from the Tomcat connection pool.

Upvotes: 2

Andy Wilkinson
Andy Wilkinson

Reputation: 116041

By creating your own bean, you're actually switching off Boot's auto-configuration of a DataSource. You can just delete your getDataSource method and let Boot auto-configure one instead.

Upvotes: 2

Related Questions