Springboot 没有 [javax.sql.DataSource] 类型的合格 bean

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/32810178/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-11 13:08:20  来源:igfitidea点击:

Springboot No qualifying bean of type [javax.sql.DataSource]

javaspring-boot

提问by fritsMaister

I'm trying to use application.properties to bean datasource but it seems that spring boot does not find the file or something like.

我正在尝试将 application.properties 用于 bean 数据源,但似乎 spring boot 找不到该文件或类似的东西。

Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [javax.sql.DataSource] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {}

Here my structure:

这是我的结构:

 .
├── build.gradle
└── src
    └── main
        ├── java
        │?? └── com
        │??     └── companies
        │??         ├── CompanyApplication.java
        │??         ├── config
        │??         │?? └── WebMvcConfig.java
        │??         ├── controller
        │??         │?? └── HelloWorldController.java
        │??         └── model
        │??             ├── Article.java
        │??             ├── daoInterface
        │??             │?? └── ArticleDaoInterface.java
        │??             ├── daoTemplates
        │??             │?? └── ArticleDao.java
        │??             └── mappers
        │??                 └── ArticleMapper.java
        ├── resources
        │?? └── application.properties
        └── webapp
            └── WEB-INF
                └── pages
                    └── hello.jsp

I've try to move application.properties file from resources to config and nothing. application.properties:

我尝试将 application.properties 文件从资源移动到配置,但什么也没有。 application.properties:

spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/name
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.jdbc.Driver

build.gradle

build.gradle

buildscript {
        repositories {
            //Required repos
            mavenCentral()
            maven { url "http://repo.spring.io/snapshot" }
            maven { url "http://repo.spring.io/milestone" }
        }
        dependencies {
            //Required dependency for spring-boot plugin
            classpath "org.springframework.boot:spring-boot-gradle-plugin:1.2.6.RELEASE"
        }
    }

    apply plugin: 'java'
    apply plugin: 'war'
    apply plugin: 'spring-boot'

    jar {
        baseName = 'companies'
        version = '0.2'
    }

    war {
        baseName = 'companies'
        version =  '0.1'
    }

    sourceCompatibility = 1.8
    targetCompatibility = 1.8

    repositories {
        mavenCentral()
        maven { url "http://repo.spring.io/snapshot" }
        maven { url "http://repo.spring.io/milestone" }
    }

    dependencies {
        compile 'org.springframework.boot:spring-boot-starter-web'
        compile("org.springframework.boot:spring-boot-starter")
        compile("org.springframework:spring-jdbc")
        compile('org.springframework.boot:spring-boot-starter-jdbc:1.2.6.RELEASE')
        testCompile("junit:junit")
        //Required dependency for JSP
        compile 'org.apache.tomcat.embed:tomcat-embed-jasper'
    }

And where I'm trying to autowire the dataSource:

我试图自动装配数据源的地方:

package com.companies.model.daoTemplates;

import com.companies.model.Article;
import com.companies.model.daoInterface.ArticleDaoInterface;
import com.companies.model.mappers.ArticleMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;

import javax.sql.DataSource;
import java.util.List;

@Repository
public class ArticleDao implements ArticleDaoInterface {

    private JdbcTemplate jdbcTemplateObject;

    private final String DB_NAME = "articles";

    @Override
    @Autowired
    public void setDataSource(DataSource ds) {
        this.jdbcTemplateObject = new JdbcTemplate(ds);
    }

    @Override
    public List<Article> listArticle() {
        String SQL = "select * from " + DB_NAME + " where inactive = false ORDER BY name";
        List <Article> article = jdbcTemplateObject.query(SQL,
                new ArticleMapper());
        return article;
    }

}

CompanyApplication.java

CompanyApplication.java

package com.companies;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

@Configuration
@ComponentScan
@EnableAutoConfiguration
public class CompanyApplication {

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

}

I cannot find where I'm failing at.

我找不到我失败的地方。

回答by Filip

As @M. Deinummentioned in his comment it seems to be a dependency configuration problem. You need a dependency on spring-jdbc for an embedded database to be auto-configured.

作为@M。Deinum在他的评论中提到它似乎是一个依赖配置问题。您需要依赖 spring-jdbc 才能自动配置嵌入式数据库

Please make sure you've followed on the documentation

请确保您已按照 文档进行操作

You should also check out this spring-boot-jdb sample

您还应该查看此spring-boot-jdb 示例

回答by DzianisH

I've faced this problem and figured out that implementation of DataSource is placed in Tomcat libs. So for 8th tomcat you going to include org.apache.tomcat.jdbc.pool.DataSourceclass that placed in org.apache.tomcat:tomcat-jdbc:jar:8.0.36

我遇到了这个问题,并发现 DataSource 的实现放在 Tomcat 库中。因此,对于第 8 个 tomcat,您将包括org.apache.tomcat.jdbc.pool.DataSource放置在org.apache.tomcat:tomcat-jdbc:jar:8.0.36

回答by espendennis

I had the same problem. In my case I solved it by adding the dependency for the mysql java connector.

我有同样的问题。在我的情况下,我通过添加 mysql java 连接器的依赖项来解决它。

回答by Iclo

Spring boot is mostly based on the principle than putting a specific jar in the classpath will trigger the activation of the related functionality. Spring boot is scanning the classpath at startup and will start "everything he found" except if you disable it by using annotation.

Spring boot 主要基于这样的原理,而不是在类路径中放置特定的 jar 会触发相关功能的激活。Spring boot 会在启动时扫描类路径,并将启动“他找到的所有内容”,除非您使用注释禁用它。

So to have Spring Boot initializing a DataSource you must have one of the following dependencies: - spring-boot-starter-jdbc : will allow to use the DataSource and JDBC stuff. - spring-boot-starter-data-jpa : will load the JPA and so the DataSource as a sub-module

因此,要让 Spring Boot 初始化数据源,您必须具有以下依赖项之一: - spring-boot-starter-jdbc :将允许使用数据源和 JDBC 的东西。- spring-boot-starter-data-jpa : 将加载 JPA 等数据源作为子模块