8

I know that spring boot will create a dataSource Bean automatically if related configurations are set in application.properties, like:

spring.datasource.url = jdbc:mysql://192.168.10.103:3306/hms?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull
spring.datasource.username=root
spring.datasource.password=test@123
spring.datasource.driver-class-name=com.mysql.jdbc.Driver

Application code:

package com.synline.mdataserver;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.apache.tomcat.jdbc.pool.DataSource;

@SpringBootApplication
public class Application implements CommandLineRunner {

    @Autowired
    AnnotationConfigApplicationContext context;

    /*@Autowired
    DataSource dataSource;*/

    public static void main(String[] args) throws InterruptedException {
        SpringApplication.run(Application.class, args);
    }

    @Override
    public void run(String... args) throws Exception {
        DataSource dataSource = (DataSource)context.getBean("dataSource");
        System.out.println(dataSource);

        while (true) {
           Thread.sleep(5000);
        }

    }
}

If the @Autowired DataSource is commented out, the Bean information will be printed:

org.apache.tomcat.jdbc.pool.DataSource@1800a575{ConnectionPool[defaultAutoCommit=null; defaultReadOnly=null; ....}

So I think Spring Boot really created the Bean.

But if @Autowried DataSource is used, exception occurs to complain No Such Bean

Error creating bean with name 'application': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: org.apache.tomcat.jdbc.pool.DataSource com.synline.mdataserver.Application.dataSource; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [org.apache.tomcat.jdbc.pool.DataSource] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
4
  • Please post the full case that doesn't work, not only a snippet. Also you should be using a javax.sql.DataSource not the specific tomcat type. Commented Oct 12, 2015 at 5:20
  • Thanks. I re-edit the post and add the full code. Commented Oct 12, 2015 at 6:22
  • Ah, Deinum, you get the point. After I " import javax.sql.DataSource", instead of "import org.apache.tomcat.jdbc.pool.DataSource;", no problems any more! Commented Oct 12, 2015 at 6:26
  • 1
    Could you explain a little more, why the Autowired failed, if I used the specific tomcat type, but getBean() was OK? Thanks a lot! Commented Oct 12, 2015 at 6:33

1 Answer 1

7

Your variable should be declared as a standard JDBC DataSource (i.e. javax.sql.DataSource), not as a particular implementation of that interface.

Sign up to request clarification or add additional context in comments.

1 Comment

Yes, this is the root cause. Thanks!

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.