Spring Boot - 创建名为' dataSource'的bean时出错在类路径资源中定义

时间:2015-01-20 09:59:45

标签: java spring spring-boot

我有Spring Boot Web应用程序。它以RESTful方法为中心。所有配置似乎都存在但由于某种原因MainController无法处理请求。它导致404错误。如何解决?

@Controller
public class MainController {

    @Autowired
    ParserService parserService;

    @RequestMapping(value="/", method= RequestMethod.GET)
    public @ResponseBody String displayStartPage(){
        return "{hello}";
    }
}

应用

@Configuration
@ComponentScan(basePackages = "")
@EnableAutoConfiguration
public class Application extends SpringBootServletInitializer{
        public static void main(final String[] args) {
            SpringApplication.run(Application.class, args);
        }

        @Override
        protected final SpringApplicationBuilder configure(final SpringApplicationBuilder application) {
            return application.sources(Application.class);
        }
}

ParserController

@RestController
public class ParserController {

    @Autowired
    private ParserService parserService;

    @Autowired
    private RecordDao recordDao;

 private static final Logger LOG = Logger.getLogger(ParserController.class);

    @RequestMapping(value="/upload", method= RequestMethod.POST)
    public @ResponseBody String fileUploadPage(
   }
}

更新

似乎MySQL无法初始化......

    Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration': Injection of autowired dependencies failed; 

nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private javax.sql.DataSource org.springframework.boot.autoconfigure.orm.jpa.JpaBaseConfiguration.dataSource; 

nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSource' defined in class path resource [org/springframework/boot/autoconfigure/jdbc/DataSourceAutoConfiguration$NonEmbeddedConfiguration.class]: Instantiation of bean failed; 

nested exception is org.springframework.beans.factory.BeanDefinitionStoreException: Factory method [public javax.sql.DataSource org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration$NonEmbeddedConfiguration.dataSource()] threw exception; 

nested exception is org.springframework.beans.factory.BeanCreationException: Cannot determine embedded database driver class for database type NONE. If you want an embedded database please put a supported one on the classpath.

UPDATE2

application.properties

spring.datasource.driverClassName=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/logparser
spring.datasource.username=root
spring.datasource.password=root

spring.jpa.database = MYSQL
spring.jpa.show-sql = true

# Hibernate
hibernate.dialect: org.hibernate.dialect.MySQL5Dialect
hibernate.show_sql: true
hibernate.hbm2ddl.auto: update
entitymanager.packagesToScan: /

UPDATE4

似乎设置@RequestMapping时,lite控制器没有响应。为什么会这样?

  

PS。它发生在我运行Maven的生命周期test时。   在IntelliJ中以degub模式运行时,不会输出错误。

UPDATE5

我也按教程中的说明使用这个DAO。

public interface RecordDao extends CrudRepository<Record, Long> {
}

http://blog.netgloo.com/2014/10/27/using-mysql-in-spring-boot-via-spring-data-jpa-and-hibernate/

UPDATE6

我确实更改了我的应用程序属性。并尝试了每一个组合,但它拒绝工作。 ;(

Maven输出:

-------------------------------------------------------
 T E S T S
-------------------------------------------------------
Running IntegrationTest
Tests run: 1, Failures: 0, Errors: 1, Skipped: 0, Time elapsed: 2.365 sec <<< FAILURE! - in IntegrationTest
saveParsedRecordsToDatabase(IntegrationTest)  Time elapsed: 2.01 sec  <<< ERROR!
java.lang.IllegalStateException: Failed to load ApplicationContext
    at org.springframework.test.context.CacheAwareContextLoaderDelegate.loadContext(CacheAwareContextLoaderDelegate.java:99)
    at org.springframework.test.context.DefaultTestContext.getApplicationContext(DefaultTestContext.java:101)
    at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.injectDependencies(DependencyInjectionTestExecutionListener.java:109)
    at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.prepareTestInstance(DependencyInjectionTestExecutionListener.java:75)
    at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:331)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.createTest(SpringJUnit4ClassRunner.java:213)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner$1.runReflectiveCall(SpringJUnit4ClassRunner.java:290)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.methodBlock(SpringJUnit4ClassRunner.java:292)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:233)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:87)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229)
    at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
    at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:71)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:309)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:176)
    at org.apache.maven.surefire.junit4.JUnit4Provider.execute(JUnit4Provider.java:264)
    at org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:153)
    at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:124)
    at org.apache.maven.surefire.booter.ForkedBooter.invokeProviderInSameClassLoader(ForkedBooter.java:200)
    at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:153)
    at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:103)
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private javax.sql.DataSource org.springframework.boot.autoconfigure.orm.jpa.JpaBaseConfiguration.dataSource; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSource' defined in class path resource [org/springframework/boot/autoconfigure/jdbc/DataSourceAutoConfiguration$NonEmbeddedConfiguration.class]: Instantiation of bean failed; nested exception is org.springframework.beans.factory.BeanDefinitionStoreException: Factory method [public javax.sql.DataSource org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration$NonEmbeddedConfiguration.dataSource()] threw exception; nested exception is org.springframework.beans.factory.BeanCreationException: Cannot determine embedded database driver class for database type NONE. If you want an embedded database please put a supported one on the classpath.

20 个答案:

答案 0 :(得分:81)

看起来最初的问题是自动配置。

如果您不需要数据源,只需将其从自动配置过程中删除:

@EnableAutoConfiguration(exclude={DataSourceAutoConfiguration.class})

答案 1 :(得分:15)

从你没有将足够的数据传递到Spring Boot来配置数据源

在您现有的application.properties中创建/添加以下内容

spring.datasource.driverClassName=
spring.datasource.url=
spring.datasource.username=
spring.datasource.password=

确保为每个属性附加一个值。

答案 2 :(得分:10)

也许你忘记了MySQL JDBC驱动程序。

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.34</version>
</dependency>

答案 3 :(得分:5)

我得到了同样的错误,发现它是由于我的pom.xml中缺少的某些依赖项,如Spring JPA,Hibernate,Mysql或者jackson。 因此,请确保pom.xml中没有缺少依赖项,并检查它们的版本兼容性。

<!-- Jpa and hibernate -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-orm</artifactId>
            <version>4.2.2.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-entitymanager</artifactId>
            <version>5.0.3.Final</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.6</version>
        </dependency>

答案 4 :(得分:4)

hibernate.*属性没用,它们应该是spring.jpa.*属性。更不用说您尝试使用spring.jpa.*属性覆盖已设置的那些。 (对于每个属性的解释,我强烈建议阅读Spring Boot reference guide

spring.jpa.database-platform = org.hibernate.dialect.MySQL5Dialect
spring.jpa.show-sql = true

# Hibernate
spring.jpa.hibernate.ddl-auto=update

还会根据Application类的基础包自动检测要扫描的包。如果要指定其他内容,请使用@EntityScan注释。同时指定最顶级的包并不是非常明智的,因为它将扫描整个类路径,这将严重影响性能。

答案 5 :(得分:3)

更改以下代码行

spring.datasource.driverClassName

spring.datasource.driver-class-name

答案 6 :(得分:2)

如果您在spring boot app中使用application.properties,那么只需将以下行放入application.properties即可以使用:
spring.datasource.url:jdbc:mysql:// google /?cloudSqlInstance =&amp; socketFactory = com.google.cloud.sql.mysql.SocketFactory&amp; user = ****&amp; password = ****

答案 7 :(得分:2)

运行Test时会出现此问题。 添加依赖

testCompile group: 'com.h2database', name: 'h2', version: '1.4.197' 

在测试源添加文件bootstrap.yml下添加文件夹资源 并提供内容。

spring:
  datasource:
    type: com.zaxxer.hikari.HikariDataSource
    url: jdbc:h2:mem:TEST
    driver-class-name: org.h2.Driver
    username: username
    password: password
    hikari:
      idle-timeout: 10000

这将设置您的数据源。

答案 8 :(得分:1)

即使在application.properties中提供了所有必需的数据源属性之后,我也遇到了这个问题。然后我意识到属性配置类没有被Spring引导扫描,因为它与我的Spring引导Application.java相比处于不同的包层次结构中,因此没有属性应用于数据源对象。 我更改了属性配置类的包名称,它开始工作。

答案 9 :(得分:1)

在我的情况下,这种情况正在发生,因为org.springframework.boot.autoconfigure.orm.jpa.JpaBaseConfiguration.dataSource是一个没有限定符的自动装配字段,我使用的是具有限定名称的多个数据源。我在我的一个dataSource bean配置上任意使用@Primary解决了这个问题,如此

if([[AVAudioSession sharedInstance] respondsToSelector:@selector(requestRecordPermission)]) {
    [[AVAudioSession sharedInstance] requestRecordPermission];
    // Now run your function
}

我认为他们希望您实现AbstractRoutingDataSource,然后该自动配置将起作用,因为不需要限定符,您只需要一个数据源,允许您的bean根据需要解析为适当的DataSource。那么你根本不需要@Primary或​​@Qualifier注释,因为你只有一个DataSource。

在任何情况下,我的解决方案都有效,因为我的bean通过限定符指定DataSource,而JPA自动配置的东西很高兴,因为它有一个主要的DataSource。我绝不推荐这是做事的“正确”方式,但在我的情况下,它很快就解决了问题,并没有以任何明显的方式阻止我的应用程序的行为。希望有一天能够实现AbstractRoutingDataSource并重构所有需要特定DataSource的bean,然后这将是一个更简洁的解决方案。

答案 10 :(得分:1)

检查build.gradle

运行时组是否具有数据库相关性
runtime group: 'com.h2database', name: 'h2', version: '1.4.194'

如果使用Maven

,则将范围从测试更改为运行时
<dependency>
    <groupId>com.h2database</groupId>
    <artifactId>h2</artifactId>
    <version>1.4.194</version>
    <scope>runtime</scope>
</dependency>

答案 11 :(得分:1)

与原始问题没有直接关系,但这对某人有用。使用简单的两个项目结构,我发生了这个错误。一个项目是使用spring jdbc处理一些数据库操作(比如A)而另一个项目根本没有任何jdbc操作(比如B)。但是当我开始服务B时仍然出现这个错误。说数据源应该正确初始化。

正如我所知,我已将此依赖项添加到两个模块的父pom中

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

这导致spring初始化项目B的jdbc依赖项。所以,我把它移到了A的pom,一切都很好。

希望这可以帮助某人

答案 12 :(得分:0)

它对我有用,你可以试试你的: 将其添加到Tomcat中的VM选项

-DdevBaseDir="C:\Your_Project_Dir_Path"

答案 13 :(得分:0)

就我而言,我在application.properties文件中忽略了以下内容:

#Hibernate

#spring.jpa.hibernate.ddl-自动=更新

它对我有用....

答案 14 :(得分:0)

给你一些不同的东西,当你遇到这种错误时,无法创造 测试用例中的bean数据源。

可能是由于某些原因引起的:

  1. 没有数据源,您需要创建数据源,h2内存数据源或其他任何数据源,或者您可以选择像exclude={datasource··}这样的方式。
  2. 你拥有自己的数据源,就像MySQL一样,但它仍然不起作用。它是由类AutoConfigureTestDatabase引起的,它将为您选择一个可能导致歧义的数据源。
  3. 解决方案:添加@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)以避免替换默认数据源。

答案 15 :(得分:0)

您是否将该应用程序作为jar运行? (java -jar xxxx.jar)

如果是这样,你有没有存储在那个jar中的application.properties?

如果不是,请尝试找出原因:

  • 要自动打包在jar中,文件可以在:src / main / resources / application.properties
  • 也可以配置pom.xml中的maven插件

答案 16 :(得分:0)

几天来我都遇到了同样的问题,最后问题不是代码,问题从maven传来,您必须删除他从硬盘驱动器“ C:\ Users \ username”下载的所有文件.m2 \ repository”,然后为您的项目进行另一个更新,这将解决您的问题。

答案 17 :(得分:0)

我通过更改父级Spring Boot依赖关系解决了我的问题。

import matplolib.pyplot as plt
for i in range(4):
    plt.subplot(2,2,i+1).set_title('Subplot n°{}' .format(i+1))
plt.show()

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.1.0.RELEASE</version>
</parent>

有关更多信息,请查看发行说明:Spring Boot 2.1.0 Release Notes

答案 18 :(得分:0)

在MySQL中创建数据库

create database springboot2;

application.properties

spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url = jdbc:mysql://localhost:3306/springboot2
spring.datasource.username = root
spring.datasource.password = root
spring.jpa.show-sql = true
spring.jpa.hibernate.ddl-auto = update
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5Dialect
server.port=9192

pom.xml

<dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>

主班

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class Application {

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

}

模型类

package com.First.Try.springboot.entity;
    
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor 
@NoArgsConstructor
@Entity
@Table(name="PRODUCT_TBL1")
public class Product {
    @Id
    @GeneratedValue
    private int id;
    private String name;
    private int quantity;
    private double price;
    ....
    ....
    ....
 }

答案 19 :(得分:0)

默认情况下,使用最新版本的 Spring Boot,data.sql 的加载是在创建表之前完成的。所以使用 - spring.jpa.defer-datasource-initialization=true

示例 -

**In application.properties :- **
spring.jpa.show-sql=true
spring.datasource.url=jdbc:h2:mem:testdb
spring.h2.console.enabled=true
spring.jpa.defer-datasource-initialization=true

谢谢 阿塔尔·卡里姆