Tristan O'Keefe
Tristan O'Keefe

Reputation: 411

No qualifying bean of type 'org.springframework.jdbc.core.JdbcTemplate' available error

I am running through the tutorial.example on https://developer.ibm.com/tutorials/spring-with-db2-via-jdbc/ but cannot get it to work, i keep getting the below error and am unsure how to fix.

No qualifying bean of type 'org.springframework.jdbc.core.JdbcTemplate' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}'

Nothing to do with setting up a bean is mentioned in the tutorial so am unsure if i should be breaking off it to fix it or i've just made a mistake.

my application class -

@SpringBootApplication
public class SBApplication {
    public static void main(String[] args) {
        SpringApplication.run(SBApplication.class, args);
    }
 }

Example rest controller -

package application.rest.v1;

import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ResponseBody;
import java.util.ArrayList;
import java.util.List;
import main.java.application.jdbc.*;

@RestController
public class Example {
    @Autowired
    JdbcTemplate jdbcTemplate;

    @RequestMapping("test")
    public @ResponseBody ResponseEntity<String> example() {
        List<String> list = new ArrayList<>();
        list.add("Table data...");
        jdbcTemplate.query(
                "SELECT * FROM things", new Object[]{},
                (rs,rowNum) -> new Things(rs.getLong("id"), rs.getString("name")))
                .forEach(thing -> list.add(thing.toString()));
        return new ResponseEntity<String>(list.toString(), HttpStatus.OK);
    }
}

application.properties -

spring.datasource.url=jdbc:imdb://xxxx.xxx.xxxx/xxxx
spring.datasource.username=xxxxxxx
spring.datasource.password=xxxx
spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration

Also, i am not connecting to the suggested DB2 instance in the tutorial but my own instance.

Upvotes: 11

Views: 23001

Answers (2)

Alexander
Alexander

Reputation: 117

Since the tutorial implies use of Spring Boot, it would be better to use spring-boot-starter-jdbc as dependency to avoid boilerplate configuration suggested in the accepted answer. The dependency contains auto-configuration which does the same as the @Configuration class suggested in this answer

For Maven:

<dependencies>
  <!-- ... -->

  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jdbc</artifactId>
  </dependency>

  <!-- ... -->
</dependencies>

For Gradle:

dependencies {
  // ...

  implementation("org.springframework.boot", "spring-boot-starter-jdbc")

  // ...
}

Upvotes: 0

Coder
Coder

Reputation: 2239

I believe you are missing the part where you are supposed to configure JdbcTemplate in your configuration. As you are using spring boot, you can achieve it through @Configuration annotation on a class. You typical configuration will look something like below

@Configuration
public class WebAppConfig {

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

    @Bean(name = "applicationJdbcTemplate")
    public JdbcTemplate applicationDataConnection(){
        return new JdbcTemplate(dataSource());
    }
}

Upvotes: 17

Related Questions