Home  >  Q&A  >  body text

dataSource cannot be autowired when configuring Druid with Spring Boot

After configuring the dataSource, I want to test whether the configuration is successful

package com.yang.Controller;

import com.alibaba.druid.pool.DruidDataSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

/**
 * Created by Yang on 2017/6/6.
 */
@RestController
public class TestController {

    @Autowired
    private DruidDataSource dataSource;

    @RequestMapping("/hello")
    public String index() {
        String sql = "select * from reader;";
        String str = "";
        PreparedStatement ps = null;
        ResultSet rs = null;
        try {
            ps = dataSource.getConnection().prepareStatement(sql);
            rs = ps.executeQuery();
            while (rs.next()){
                str = rs.getString(2);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }

        return str;
    }

}

This TestController can run successfully, I want to encapsulate dataSource.getConnection() again

package com.yang.Utils;

import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.pool.DruidPooledConnection;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.sql.SQLException;


/**
 * Created by Yang on 2017/6/6.
 */
public class ConnectionManager {

    private Logger logger = LoggerFactory.getLogger(ConnectionManager.class);

    @Autowired
    private DruidDataSource dataSource;

    private static volatile ConnectionManager connectionManager;

    private ConnectionManager(){}

    public static ConnectionManager getInstance(){
        if(connectionManager == null){
            synchronized (ConnectionManager.class){
                if(connectionManager == null){
                    connectionManager = new ConnectionManager();
                }
            }
        }
        return connectionManager;
    }

    public DruidPooledConnection getConn(){
        DruidPooledConnection conn = null;
        try {
            conn = dataSource.getConnection();
        } catch (SQLException e) {
            logger.error("get connection error,the connection is null", e);
            e.printStackTrace();
        }
        return conn;
    }

}

I wrote this ConnectionManager, but in this class, the dataSource is null. I don’t know what’s going on. I would like to ask everyone for advice.
There is also another question, how to perform unit testing when using Spring Boot. I started to use unit testing to test a ConnectionManager, but it has been unsuccessful

D:\Java\jdk_8u92\bin\java -Dspring.output.ansi.enabled=always -Didea.launcher.port=7532 "-Didea.launcher.bin.path=D:\develop\idea\IntelliJ IDEA 2016.2.5\bin" -Dfile.encoding=UTF-8 -classpath "D:\environment\Java\jdk_8u92\jre\lib\charsets.jar;D:\environment\Java\jdk_8u92\jre\lib\deploy.jar;D:\environment\Java\jdk_8u92\jre\lib\ext\access-bridge-64.jar;D:\environment\Java\jdk_8u92\jre\lib\ext\cldrdata.jar;D:\environment\Java\jdk_8u92\jre\lib\ext\dnsns.jar;D:\environment\Java\jdk_8u92\jre\lib\ext\jaccess.jar;D:\environment\Java\jdk_8u92\jre\lib\ext\jfxrt.jar;D:\environment\Java\jdk_8u92\jre\lib\ext\localedata.jar;D:\environment\Java\jdk_8u92\jre\lib\ext\nashorn.jar;D:\environment\Java\jdk_8u92\jre\lib\ext\sunec.jar;D:\environment\Java\jdk_8u92\jre\lib\ext\sunjce_provider.jar;D:\environment\Java\jdk_8u92\jre\lib\ext\sunmscapi.jar;D:\environment\Java\jdk_8u92\jre\lib\ext\sunpkcs11.jar;D:\environment\Java\jdk_8u92\jre\lib\ext\zipfs.jar;D:\environment\Java\jdk_8u92\jre\lib\javaws.jar;D:\environment\Java\jdk_8u92\jre\lib\jce.jar;D:\environment\Java\jdk_8u92\jre\lib\jfr.jar;D:\environment\Java\jdk_8u92\jre\lib\jfxswt.jar;D:\environment\Java\jdk_8u92\jre\lib\jsse.jar;D:\environment\Java\jdk_8u92\jre\lib\management-agent.jar;D:\environment\Java\jdk_8u92\jre\lib\plugin.jar;D:\environment\Java\jdk_8u92\jre\lib\resources.jar;D:\environment\Java\jdk_8u92\jre\lib\rt.jar;E:\myJava\LibraryManager\target\classes;D:\environment\maven\repository\org\springframework\boot\spring-boot-starter.4.1.RELEASE\spring-boot-starter-1.4.1.RELEASE.jar;D:\environment\maven\repository\org\springframework\boot\spring-boot.4.1.RELEASE\spring-boot-1.4.1.RELEASE.jar;D:\environment\maven\repository\org\springframework\spring-core.3.3.RELEASE\spring-core-4.3.3.RELEASE.jar;D:\environment\maven\repository\org\springframework\spring-context.3.3.RELEASE\spring-context-4.3.3.RELEASE.jar;D:\environment\maven\repository\org\springframework\spring-aop.3.3.RELEASE\spring-aop-4.3.3.RELEASE.jar;D:\environment\maven\repository\org\springframework\spring-beans.3.3.RELEASE\spring-beans-4.3.3.RELEASE.jar;D:\environment\maven\repository\org\springframework\spring-expression.3.3.RELEASE\spring-expression-4.3.3.RELEASE.jar;D:\environment\maven\repository\org\springframework\boot\spring-boot-autoconfigure.4.1.RELEASE\spring-boot-autoconfigure-1.4.1.RELEASE.jar;D:\environment\maven\repository\org\springframework\boot\spring-boot-starter-logging.4.1.RELEASE\spring-boot-starter-logging-1.4.1.RELEASE.jar;D:\environment\maven\repository\ch\qos\logback\logback-classic.1.7\logback-classic-1.1.7.jar;D:\environment\maven\repository\ch\qos\logback\logback-core.1.7\logback-core-1.1.7.jar;D:\environment\maven\repository\org\slf4j\slf4j-api.7.21\slf4j-api-1.7.21.jar;D:\environment\maven\repository\org\slf4j\jcl-over-slf4j.7.21\jcl-over-slf4j-1.7.21.jar;D:\environment\maven\repository\org\slf4j\jul-to-slf4j.7.21\jul-to-slf4j-1.7.21.jar;D:\environment\maven\repository\org\slf4j\log4j-over-slf4j.7.21\log4j-over-slf4j-1.7.21.jar;D:\environment\maven\repository\org\yaml\snakeyaml.17\snakeyaml-1.17.jar;D:\environment\maven\repository\junit\junit.10\junit-4.10.jar;D:\environment\maven\repository\org\hamcrest\hamcrest-core.3\hamcrest-core-1.3.jar;D:\environment\maven\repository\org\springframework\boot\spring-boot-starter-web.4.1.RELEASE\spring-boot-starter-web-1.4.1.RELEASE.jar;D:\environment\maven\repository\org\springframework\boot\spring-boot-starter-tomcat.4.1.RELEASE\spring-boot-starter-tomcat-1.4.1.RELEASE.jar;D:\environment\maven\repository\org\apache\tomcat\embed\tomcat-embed-core.5.5\tomcat-embed-core-8.5.5.jar;D:\environment\maven\repository\org\apache\tomcat\embed\tomcat-embed-el.5.5\tomcat-embed-el-8.5.5.jar;D:\environment\maven\repository\org\apache\tomcat\embed\tomcat-embed-websocket.5.5\tomcat-embed-websocket-8.5.5.jar;D:\environment\maven\repository\org\hibernate\hibernate-validator.2.4.Final\hibernate-validator-5.2.4.Final.jar;D:\environment\maven\repository\javax\validation\validation-api.1.0.Final\validation-api-1.1.0.Final.jar;D:\environment\maven\repository\org\jboss\logging\jboss-logging.3.0.Final\jboss-logging-3.3.0.Final.jar;D:\environment\maven\repository\com\fasterxml\classmate.3.1\classmate-1.3.1.jar;D:\environment\maven\repository\com\fasterxml\jackson\core\jackson-databind.8.3\jackson-databind-2.8.3.jar;D:\environment\maven\repository\com\fasterxml\jackson\core\jackson-annotations.8.3\jackson-annotations-2.8.3.jar;D:\environment\maven\repository\com\fasterxml\jackson\core\jackson-core.8.3\jackson-core-2.8.3.jar;D:\environment\maven\repository\org\springframework\spring-web.3.3.RELEASE\spring-web-4.3.3.RELEASE.jar;D:\environment\maven\repository\org\springframework\spring-webmvc.3.3.RELEASE\spring-webmvc-4.3.3.RELEASE.jar;D:\environment\maven\repository\org\mybatis\spring\boot\mybatis-spring-boot-starter.1.1\mybatis-spring-boot-starter-1.1.1.jar;D:\environment\maven\repository\org\mybatis\spring\boot\mybatis-spring-boot-autoconfigure.1.1\mybatis-spring-boot-autoconfigure-1.1.1.jar;D:\environment\maven\repository\org\mybatis\mybatis.4.0\mybatis-3.4.0.jar;D:\environment\maven\repository\org\mybatis\mybatis-spring.3.0\mybatis-spring-1.3.0.jar;D:\environment\maven\repository\org\springframework\boot\spring-boot-starter-jdbc.4.1.RELEASE\spring-boot-starter-jdbc-1.4.1.RELEASE.jar;D:\environment\maven\repository\org\apache\tomcat\tomcat-jdbc.5.5\tomcat-jdbc-8.5.5.jar;D:\environment\maven\repository\org\apache\tomcat\tomcat-juli.5.5\tomcat-juli-8.5.5.jar;D:\environment\maven\repository\org\springframework\spring-jdbc.3.3.RELEASE\spring-jdbc-4.3.3.RELEASE.jar;D:\environment\maven\repository\org\springframework\spring-tx.3.3.RELEASE\spring-tx-4.3.3.RELEASE.jar;D:\environment\maven\repository\mysql\mysql-connector-java.1.39\mysql-connector-java-5.1.39.jar;D:\environment\maven\repository\org\springframework\boot\spring-boot-devtools.4.1.RELEASE\spring-boot-devtools-1.4.1.RELEASE.jar;D:\environment\maven\repository\com\alibaba\druid.0.29\druid-1.0.29.jar;D:\environment\Java\jdk_8u92\jre\..\lib\jconsole.jar;D:\environment\Java\jdk_8u92\jre\..\lib\tools.jar;D:\develop\idea\IntelliJ IDEA 2016.2.5\lib\idea_rt.jar" com.intellij.rt.execution.application.AppMain com.yang.Application

  .   ____          _            __ _ _
 /\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (v1.4.1.RELEASE)

2017-06-06 23:18:44.851  INFO 52496 --- [  restartedMain] com.yang.Application                     : Starting Application on Yang with PID 52496 (E:\myJava\LibraryManager\target\classes started by Yang in E:\myJava\LibraryManager)
2017-06-06 23:18:44.856  INFO 52496 --- [  restartedMain] com.yang.Application                     : No active profile set, falling back to default profiles: default
2017-06-06 23:18:45.257  INFO 52496 --- [  restartedMain] ationConfigEmbeddedWebApplicationContext : Refreshing org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@46a9c0: startup date [Tue Jun 06 23:18:45 CST 2017]; root of context hierarchy
2017-06-06 23:18:47.356  WARN 52496 --- [  restartedMain] o.m.s.mapper.ClassPathMapperScanner      : No MyBatis mapper was found in '[com.yang.Mapper]' package. Please check your configuration.
2017-06-06 23:18:47.674  WARN 52496 --- [  restartedMain] o.m.s.mapper.ClassPathMapperScanner      : No MyBatis mapper was found in '[com.yang]' package. Please check your configuration.
2017-06-06 23:18:48.316  INFO 52496 --- [  restartedMain] trationDelegate$BeanPostProcessorChecker : Bean 'org.springframework.transaction.annotation.ProxyTransactionManagementConfiguration' of type [class org.springframework.transaction.annotation.ProxyTransactionManagementConfiguration$$EnhancerBySpringCGLIB$d3489f7] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2017-06-06 23:18:49.813  INFO 52496 --- [  restartedMain] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat initialized with port(s): 8080 (http)
2017-06-06 23:18:49.835  INFO 52496 --- [  restartedMain] o.apache.catalina.core.StandardService   : Starting service Tomcat
2017-06-06 23:18:49.837  INFO 52496 --- [  restartedMain] org.apache.catalina.core.StandardEngine  : Starting Servlet Engine: Apache Tomcat/8.5.5
2017-06-06 23:18:50.072  INFO 52496 --- [ost-startStop-1] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
2017-06-06 23:18:50.072  INFO 52496 --- [ost-startStop-1] o.s.web.context.ContextLoader            : Root WebApplicationContext: initialization completed in 4821 ms
2017-06-06 23:18:50.448  INFO 52496 --- [ost-startStop-1] o.s.b.w.servlet.ServletRegistrationBean  : Mapping servlet: 'dispatcherServlet' to [/]
2017-06-06 23:18:50.456  INFO 52496 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean   : Mapping filter: 'characterEncodingFilter' to: [/*]
2017-06-06 23:18:50.457  INFO 52496 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean   : Mapping filter: 'hiddenHttpMethodFilter' to: [/*]
2017-06-06 23:18:50.457  INFO 52496 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean   : Mapping filter: 'httpPutFormContentFilter' to: [/*]
2017-06-06 23:18:50.457  INFO 52496 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean   : Mapping filter: 'requestContextFilter' to: [/*]
2017-06-06 23:18:50.609  WARN 52496 --- [  restartedMain] ationConfigEmbeddedWebApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'connectionManager': Unsatisfied dependency expressed through field 'dataSource'; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean found for dependency [com.alibaba.druid.pool.DruidDataSource]: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
2017-06-06 23:18:50.616  INFO 52496 --- [  restartedMain] o.apache.catalina.core.StandardService   : Stopping service Tomcat
2017-06-06 23:18:50.650  WARN 52496 --- [ost-startStop-1] o.a.c.loader.WebappClassLoaderBase       : The web application [ROOT] appears to have started a thread named [Abandoned connection cleanup thread] but has failed to stop it. This is very likely to create a memory leak. Stack trace of thread:
 java.lang.Object.wait(Native Method)
 java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:143)
 com.mysql.jdbc.AbandonedConnectionCleanupThread.run(AbandonedConnectionCleanupThread.java:43)
2017-06-06 23:18:50.685  INFO 52496 --- [  restartedMain] utoConfigurationReportLoggingInitializer : 

Error starting ApplicationContext. To display the auto-configuration report re-run your application with 'debug' enabled.
2017-06-06 23:18:50.984 ERROR 52496 --- [  restartedMain] o.s.b.d.LoggingFailureAnalysisReporter   : 

***************************
APPLICATION FAILED TO START
***************************

Description:

Field dataSource in com.yang.Utils.ConnectionManager required a bean of type 'com.alibaba.druid.pool.DruidDataSource' that could not be found.


Action:

Consider defining a bean of type 'com.alibaba.druid.pool.DruidDataSource' in your configuration.


Process finished with exit code 0
package com.yang.Configuration;

import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.support.http.StatViewServlet;
import com.alibaba.druid.support.http.WebStatFilter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;

import java.sql.SQLException;
import java.util.HashMap;
import java.util.Map;

/**
 * Created by Yang on 2017/6/6.
 */
@Configuration
@EnableAutoConfiguration
public class DruidDBConfig {

    private Logger logger = LoggerFactory.getLogger(DruidDBConfig.class);

    @Value("${spring.datasource.url}")
    private String dbUrl;

    @Value("${spring.datasource.username}")
    private String username;

    @Value("${spring.datasource.password}")
    private String password;

    @Value("${spring.datasource.driverClassName}")
    private String driverClassName;

    @Value("${spring.datasource.initialSize}")
    private int initialSize;

    @Value("${spring.datasource.minIdle}")
    private int minIdle;

    @Value("${spring.datasource.maxActive}")
    private int maxActive;

    @Value("${spring.datasource.maxWait}")
    private int maxWait;

    @Value("${spring.datasource.timeBetweenEvictionRunsMillis}")
    private int timeBetweenEvictionRunsMillis;

    @Value("${spring.datasource.minEvictableIdleTimeMillis}")
    private int minEvictableIdleTimeMillis;

    @Value("${spring.datasource.validationQuery}")
    private String validationQuery;

    @Value("${spring.datasource.testWhileIdle}")
    private boolean testWhileIdle;

    @Value("${spring.datasource.testOnBorrow}")
    private boolean testOnBorrow;

    @Value("${spring.datasource.testOnReturn}")
    private boolean testOnReturn;

    @Value("${spring.datasource.poolPreparedStatements}")
    private boolean poolPreparedStatements;

    @Value("${spring.datasource.maxPoolPreparedStatementPerConnectionSize}")
    private int maxPoolPreparedStatementPerConnectionSize;

    @Value("${spring.datasource.filters}")
    private String filters;

    @Value("{spring.datasource.connectionProperties}")
    private String connectionProperties;

    @Bean     //声明其为Bean实例
    @Primary  //在同样的DataSource中,首先使用被标注的DataSource
    public DruidDataSource dataSource(){
        DruidDataSource datasource = new DruidDataSource();

        datasource.setUrl(this.dbUrl);
        datasource.setUsername(username);
        datasource.setPassword(password);
        datasource.setDriverClassName(driverClassName);

        //configuration
        datasource.setInitialSize(initialSize);
        datasource.setMinIdle(minIdle);
        datasource.setMaxActive(maxActive);
        datasource.setMaxWait(maxWait);
        datasource.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis);
        datasource.setMinEvictableIdleTimeMillis(minEvictableIdleTimeMillis);
        datasource.setValidationQuery(validationQuery);
        datasource.setTestWhileIdle(testWhileIdle);
        datasource.setTestOnBorrow(testOnBorrow);
        datasource.setTestOnReturn(testOnReturn);
        datasource.setPoolPreparedStatements(poolPreparedStatements);
        datasource.setMaxPoolPreparedStatementPerConnectionSize(maxPoolPreparedStatementPerConnectionSize);
        try {
            datasource.setFilters(filters);
        } catch (SQLException e) {
            logger.error("druid configuration initialization filter", e);
        }
        datasource.setConnectionProperties(connectionProperties);

        return datasource;
    }

    @Bean
    public ServletRegistrationBean druidServletRegistrationBean() {
        ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean();
        servletRegistrationBean.setServlet(new StatViewServlet());
        servletRegistrationBean.addUrlMappings("/druid/*");
        return servletRegistrationBean;
    }

    /**
     * 注册DruidFilter拦截
     *
     * @return
     */
    @Bean
    public FilterRegistrationBean duridFilterRegistrationBean() {
        FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();
        filterRegistrationBean.setFilter(new WebStatFilter());
        Map<String, String> initParams = new HashMap<String, String>();
        //设置忽略请求
        initParams.put("exclusions", "*.js,*.gif,*.jpg,*.bmp,*.png,*.css,*.ico,/druid/*");
        filterRegistrationBean.setInitParameters(initParams);
        filterRegistrationBean.addUrlPatterns("/*");
        return filterRegistrationBean;
    }

}
某草草某草草2707 days ago1898

reply all(2)I'll reply

  • 某草草

    某草草2017-06-12 09:24:20

    ConnectionManager This class does not have a @Component declaration. Spring cannot manage this class and cannot inject dataSource

    reply
    0
  • 仅有的幸福

    仅有的幸福2017-06-12 09:24:20

    Injection error, the previous one is the correct answer, there is no Component declaration, you need to let Spring manage the bean through the configuration file, and then it can be injected correctly.
    Then for testing, you can use spring-boot-starter-test, which contains junit, mock, assertJ, etc. The official documentation of spring-boot has very detailed instructions for testing, you can take a look. It provides a lot of convenient annotations. Generally speaking, you need to add two to the test class first:
    @RunWith(SpringRunner.class)
    @SpringBootTest
    Secondly, there are annotations for loading different configuration files. It is recommended to read the documentation

    reply
    0
  • Cancelreply