无法配置数据源:未指定'url'属性,并且无法配置任何嵌入式数据源

时间:2018-07-07 09:29:15

标签: spring spring-boot spring-batch

我正在使用MongoDB处理 Spring Boot Batch 示例,并且已经启动了Mongod服务器

启动应用程序时,出现以下错误。

此问题有任何指针吗?

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

Description:

Failed to configure a DataSource: 'url' attribute is not specified and no embedded datasource could be configured.

Reason: Failed to determine a suitable driver class


Action:

Consider the following:
    If you want an embedded database (H2, HSQL or Derby), please put it on the classpath.
    If you have database settings to be loaded from a particular profile you may need to activate it (no profiles are currently active).

application.properties:

# Mongo database URI. Cannot be set with host, port and credentials.
spring.data.mongodb.uri=mongodb://localhost/test 

pom.xml

<dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-batch</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-mongodb</artifactId>
        </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>
        </dependency>
    </dependencies>

我已经开始mongod

C:\Users\pc>mongod
2018-07-07T14:39:39.223+0530 I JOURNAL  [initandlisten] journal dir=C:\data\db\journal
2018-07-07T14:39:39.230+0530 I JOURNAL  [initandlisten] recover : no journal files present, no recovery needed
2018-07-07T14:39:39.478+0530 I JOURNAL  [durability] Durability thread started
2018-07-07T14:39:39.589+0530 I CONTROL  [initandlisten] MongoDB starting : pid=11992 port=27017 dbpath=C:\data\db\ 64-bit host=DESKTOP-NQ639DU
2018-07-07T14:39:39.589+0530 I CONTROL  [initandlisten] targetMinOS: Windows 7/Windows Server 2008 R2
2018-07-07T14:39:39.591+0530 I CONTROL  [initandlisten] db version v3.0.5
2018-07-07T14:39:39.592+0530 I CONTROL  [initandlisten] git version: 8bc4ae20708dbb493cb09338d9e7be6698e4a3a3
2018-07-07T14:39:39.592+0530 I CONTROL  [initandlisten] build info: windows sys.getwindowsversion(major=6, minor=1, build=7601, platform=2, service_pack='Service Pack 1') BOOST_LIB_VERSION=1_49
2018-07-07T14:39:39.592+0530 I CONTROL  [initandlisten] allocator: tcmalloc
2018-07-07T14:39:39.593+0530 I CONTROL  [initandlisten] options: {}
2018-07-07T14:39:39.595+0530 I JOURNAL  [journal writer] Journal writer thread started
2018-07-07T14:39:40.485+0530 I NETWORK  [initandlisten] waiting for connections on port 27017
2018-07-07T14:40:39.140+0530 I NETWORK  [initandlisten] connection accepted from 127.0.0.1:51340 #1 (1 connection now open)
2018-07-07T14:40:41.663+0530 I NETWORK  [conn1] end connection 127.0.0.1:51340 (0 connections now open)
2018-07-07T14:45:12.421+0530 I NETWORK  [initandlisten] connection accepted from 127.0.0.1:51578 #2 (1 connection now open)
2018-07-07T14:45:12.870+0530 I NETWORK  [conn2] end connection 127.0.0.1:51578 (0 connections now open)
2018-07-07T14:46:21.734+0530 I NETWORK  [initandlisten] connection accepted from 127.0.0.1:51591 #3 (1 connection now open)
2018-07-07T14:46:22.041+0530 I NETWORK  [conn3] end connection 127.0.0.1:51591 (0 connections now open)
2018-07-07T14:57:47.523+0530 I NETWORK  [initandlisten] connection accepted from 127.0.0.1:52534 #4 (1 connection now open)
2018-07-07T14:57:47.910+0530 I NETWORK  [conn4] end connection 127.0.0.1:52534 (0 connections now open)

enter image description here

32 个答案:

答案 0 :(得分:15)

您的问题是弹簧批处理spring-boot-starter-batch的依赖关系,该依赖关系具有spring-boot-starter-jdbc可传递maven依赖关系。

Spring Batch是用于构建可靠且具有容错能力的企业批处理的框架。它支持许多功能,例如重试失败的批处理,记录批处理执行的状态等。为了实现该春季批处理,使用数据库模式存储已注册作业的状态,自动配置已经为您提供了所需数据源的基本配置,并且该配置需要关系数据库的配置。

为此,您提供了一些数据库驱动程序,例如mysql,h2等,并配置了url。

更新 只是为了入门,您可以像下面这样配置application.yml:

spring:
  datasource:
    driver-class-name: org.h2.Driver
    url: jdbc:h2:mem:localhost;DB_CLOSE_ON_EXIT=FALSE
    username: admin
    password:

当然在您的pom.xml中包括H2驱动程序

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.example</groupId>
    <artifactId>demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>demo</name>
    <description>Demo project for Spring Boot</description>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.3.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
       ....
        <dependency>
            <groupId>com.h2database</groupId>
            <artifactId>h2</artifactId>
        </dependency>

....
    </dependencies>
...

</project>

之所以这样做,是因为您不能为此mongo使用mongo,其动机是mongo的使用仅提供给项目读/写器,而不用于管理作为内部模式而非业务模式的spring batch内部数据库。该查询是普通的sql查询,内部抽象依赖于关系数据库。必须拥有一个具有ACID功能的数据库,因为每个批处理都需要读写大量工作并保存信息才能重新启动NoSql。

最后,您已经配置了一个关系数据库以便为内部功能准备好Spring批处理,内部抽象仅在jdbc上不依赖于mongo。然后,可以通过项目读取器/写入器将mongo用于批处理的业务,但仅用于商业方面。

我希望这种思考可以帮助您清除疑虑。

答案 1 :(得分:14)

排除DataSourceAutoConfiguration.class对我有用:

@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class })

答案 2 :(得分:12)

检查您的application.properties

改变

spring.datasource.driverClassName=com.mysql.jdbc.Driver

spring.datasource.driver-class-name=com.mysql.jdbc.Driver

为我工作。完整配置:

spring.datasource.url=jdbc:mysql://localhost:3306/db
spring.datasource.username=
spring.datasource.password=   
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.jpa.database-platform = org.hibernate.dialect.MySQL5Dialect
spring.jpa.generate-ddl=true
spring.jpa.hibernate.ddl-auto = update

答案 3 :(得分:7)

不是问题的重点(尽管可以联系),但是,如果您引导一个新项目并想知道为什么会得到相同的错误,则可能是{{1}的artifactId }部分中。我在下面给出了依赖性。您将需要定义数据库来摆脱这种情况。

spring-boot-starter-data-jpa

答案 4 :(得分:5)

只需添加:@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class }) 为我工作。

我遇到与@EnableAutoConfiguration(exclude = ...)尝试的相同错误,但不起作用。

答案 5 :(得分:4)

可能是通过Spring Initializr创建项目时,您的资源目录未添加到类路径中。因此,您的应用程序永远不会加载已配置的application.properties文件。

要进行快速测试,请将以下内容添加到application.properties文件中:

server.port=8081

现在,在运行应用程序时,您应该在spring boot控制台中看到如下输出:

INFO  o.s.b.w.e.tomcat.TomcatWebServer - Tomcat started on port(s): **8081** (http) with context path ''

如果您的端口仍然是默认的8080并且未更改为8081,则显然不会加载application.properties文件。

您还可以从命令行检查应用程序是否以gradle bootRun运行。哪个最有可能会工作。

解决方案:

  1. 关闭IntelliJ,然后在项目文件夹中删除“ .idea”文件夹
  2. 将您的项目重新导入到IntelliJ中,如下所示:“导入项目”->“仅选择要导入的build.gradle文件”。 (IntelliJ将自动获取其余部分)
  3. 再次构建并运行您的应用程序

请参阅IntelliJ支持人员的官方答复: IDEA-221673

答案 6 :(得分:3)

根本原因

JPA(Java持久性API)是ORM(对象关系映射)工具的Java规范。 spring-boot-starter-data-jpa依赖性在spring boot框架的上下文中启用ORM。

spring boot应用程序的JPA自动配置功能尝试使用JPA数据源建立数据库连接。 JPA DataSource bean需要数据库驱动程序才能连接到数据库。

数据库驱动程序应作为pom.xml文件中的依赖项提供。对于外部数据库,例如Oracle,SQL Server,MySql,DB2,Postgres,MongoDB等,需要数据库JDBC连接属性来建立连接。

您需要配置数据库驱动程序和JDBC连接属性来解决此异常。无法配置数据源:未指定“ url”属性,并且无法配置任何嵌入式数据源。原因:无法确定合适的驱动程序类别。

application.properties

spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration 

application.yaml

spring:
autoconfigure:
    exclude:org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration

通过编程

@SpringBootApplication(exclude =  {DataSourceAutoConfiguration.class })

答案 7 :(得分:2)

作为 2021 年 spring-boot 最新版本的摘要2.5.0

如果您的 application.properties 中至少有这些条目

spring.datasource.url=jdbc:mysql://localhost:3306/db
spring.datasource.driver-class-name=com.mysql.jdbc.Driver

以及你的 pom.xml 中的这些依赖项

<dependency>
  <groupId>mysql</groupId>
  <artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>

不应该出现这个错误:

Failed to configure a DataSource: 'url' attribute is not specified and no embedded datasource could be configured.
Reason: Failed to determine a suitable driver class

就我而言,这是 IDE

无论你使用的是eclipse还是intellij,在真实环境中应用程序都必须在linux上运行。因此,要验证是否是 IDE 问题,请使用 shell 运行您的应用

mvn spring-boot:run

如果启动没有错误,问题出在你的 IDE

日蚀

Eclipse IDE for Enterprise Java and Web Developers
Version: 2021-03 (4.19.0)
Build id: 20210312-0638

就我而言,我在 spring boot 项目中的经典 Application.java右键单击运行该项目,然后作为 java 应用程序运行强>

经过数小时的研究,解决方案是:

右键单击root spring boot 项目,然后作为 java 应用程序运行。 Eclipse 向我展示了几个带有主要方法的类。我选择我的 Application.java 然后运行

详细说明

如果您检查确切的方法错误 DataSourceProperties.determineDriverClassName,您将看到只需要 driverClassName 或 dirver-class-name 和 url。

答案 8 :(得分:2)

我在我的代码中遇到了同样的问题,在 Application.java 文件中添加这段代码帮了我 -

@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class, DataSourceTransactionManagerAutoConfiguration.class})

答案 9 :(得分:2)

如果您使用的是Gradle,则重建Gradle可以解决此问题。

答案 10 :(得分:2)

可能是因为您具有jpa依赖项和插件...

仅在不使用时对其进行评论(build.gradle或pom文件)

e。 g。

// kotlin("plugin.jpa") version "1.3.61"

// implementation("org.springframework.boot:spring-boot-starter-data-jpa")

答案 11 :(得分:2)

This link帮助了。

  

Spring Boot自动配置尝试配置Bean   自动根据添加到类路径的依赖项。和   因为我们在类路径上有一个JPA依赖项(spring-data-starter-jpa),所以它将尝试对其进行配置。

问题:Spring Boot并没有配置JPA数据源所需的所有信息,即JDBC连接属性。 解决方案:

  1. 提供JDBC连接属性(最佳)
  2. 通过排除某些AutoConfig类来推迟提供连接属性(临时-最终应删除)

上面的链接不包括DataSourceAutoConfiguration.class

@SpringBootApplication(exclude={DataSourceAutoConfiguration.class})

但这对我不起作用。相反,我不得不排除2个AutoConfig类:

@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class, XADataSourceAutoConfiguration.class})

答案 12 :(得分:1)

“无法配置数据源”错误。首先,我们通过定义数据源来解决此问题。接下来,我们讨论了如何解决此问题而完全不配置数据源。

https://www.baeldung.com/spring-boot-failed-to-configure-data-source

答案 13 :(得分:1)

我也遇到了同样的问题,可以通过添加<scope>provided</scope>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
            <scope>provided</scope>
        </dependency>

来源: https://github.com/spring-projects/spring-boot/issues/13796#issuecomment-413313346

答案 14 :(得分:1)

在主Java文件中添加此批注

@EnableAutoConfiguration(exclude=DataSourceAutoConfiguration.class)

答案 15 :(得分:1)

如果pom.xml中具有JPA依赖项,则将其删除。这个解决方案对我有用。

答案 16 :(得分:0)

如果数据源在application.resources中定义,请确保它位于src/main下,并将其添加到构建路径中。

答案 17 :(得分:0)

在pom文件中添加h2依赖项可以解决此类问题。          ......                      com.h2数据库             h2                  ......

答案 18 :(得分:0)

您需要配置数据库驱动程序和 JDBC 连接属性来修复此异常 Failed to configure a DataSource: ‘url’ attribute is not specified and no embedding datasource can be configured。原因:未能确定合适的驱动程序类别。

application.properties

spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration

答案 19 :(得分:0)

检查您的 application.properties 文件。 可能的原因之一是

  • 你可能被添加了“Spring Data”maven插件而你没有 提供 datastore details in application.properties file.

答案 20 :(得分:0)

启动新项目时遇到相同的错误。使用命令行对我有用。

./gradlew bootRun

答案 21 :(得分:0)

如果在pom.xml中添加了“ spring-boot-starter-data-jpa”依赖项,请分别添加与h2等类似的依赖项数据库。

答案 22 :(得分:0)

对于下面的春季启动版本2.X.X来说,它对我有用。

spring.datasource.url=jdbc:mysql://localhost:3306/rest
spring.datasource.username=
spring.datasource.password=
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.jpa.database-platform = org.hibernate.dialect.MySQL5Dialect
spring.jpa.generate-ddl=true
spring.jpa.hibernate.ddl-auto = update 

旧的jdbc驱动程序已弃用。在上面的配置中提到了新的。 请使用相同的名称,然后重新启动项目。

答案 23 :(得分:0)

我删除了pom.xml中对mybatis的过时依赖,以使我的运行。

答案 24 :(得分:0)

这仅表示您已经下载了具有数据库相关性的spring starter代码,而没有配置数据库。所以它不知道如何连接。对于Spring引导版本2.18,请执行以下步骤对其进行修复。

  1. 为您下载的驱动程序(例如mysql/mongo等)创建数据库。
  2. 在您的applications.properties文件中添加数据库连接信息。如果您的数据库是mysql,则将mongo的示例提供给mongo

    spring.datasource.url=jdbc:mysql://localhost:3306/db_name_that_you_created spring.datasource.username=your_db_username_here spring.datasource.password=your_db_pass_here spring.datasource.driver-class-name=com.mysql.jdbc.Driver spring.jpa.database-platform = org.hibernate.dialect.MySQL5Dialect spring.jpa.generate-ddl=true spring.jpa.hibernate.ddl-auto = update

  3. 重新启动将要运行的服务器。

答案 25 :(得分:0)

这个对我有用,对于MySQL: (应用程序属性)

spring.datasource.url=jdbc:mysql://localhost:3306/db?useSSL=false&useUnicode=true&useJDBCCompliantTimezoneShift=true&
useLegacyDatetimeCode=false&serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=admin
spring.jpa.hibernate.ddl-auto=create
spring.jpa.show-sql=true

答案 26 :(得分:0)

我遇到了同样的问题,并尝试了上述所有建议,但没有解决。我将我的答案发布给未来的读者。在它工作正常之前,它又以某种方式终止了。我通过从pom.xml中删除一些不必要的插件和依赖来解决了这个问题

  1. 首先,我将默认包装类型更改为 jar (Spring Boot Initializer在包装中提供了 pom

    <packaging>jar</packaging>

  2. 我无意中添加了一些插件:

    <plugin> <artifactId>maven-war-plugin</artifactId> <configuration> <attachClasses>true</attachClasses> <webXml>target/web.xml</webXml> <webResources> <resource> <directory>src/main/webapp</directory> <filtering>true</filtering> </resource> </webResources> </configuration> </plugin>

我希望我的回答可以对某人有所帮助。

答案 27 :(得分:0)

我已经在Spring Boot应用程序的主类中添加了此批注,并且一切运行正常

@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class })

答案 28 :(得分:0)

这是因为@ valerio-vaudi所说。

  

您的问题是春季批处理的依赖性   具有spring-boot-starter-jdbc的spring-boot-starter-batch   传递Maven依赖。

但是您可以解决它,并根据您的配置设置主数据源

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

 @Bean
 public JdbcTemplate jdbcTemplate(DataSource dataSource) {
      return new JdbcTemplate(dataSource);
 }

答案 29 :(得分:-1)

我认为在导入模块时,您已经导入了另一个软件包,请转到模块并删除其中的所有模块。之后,从项目包中导入模块

答案 30 :(得分:-1)

对我来说,资源文件夹在Maven更新/构建中被排除在外。我转到“构建路径”>“源”,发现src / main / resources具有“已排除的**”。我删除了该条目(点击排除的**>删除>应用并关闭)。

然后工作正常。

enter image description here

答案 31 :(得分:-4)

就我而言

val background= object :Thread() {
        override fun run() {
            try {
                try {
                    AWSMobileClient.getInstance().initialize(baseContext)
                    credentials = BasicAWSCredentials(AWSutils().KEY,AWSutils().SECRET)
                    s3Client = AmazonS3Client(credentials)
                    val response = s3Client.getObject(AWSutils().bucket_name,"jsa3/NewParentData")
                    println("Checking the respose" + response.objectContent.toString())
                    Log.i(response.objectContent.toString(),"checking if response successful")
                    response.close()
                } catch(e:AmazonServiceException) {
                    // The call was transmitted successfully, but Amazon S3 couldn't process
                    // it, so it returned an error response.
                    e.printStackTrace();
                }
                catch(e:AmazonClientException) {
                    // Amazon S3 couldn't be contacted for a response, or the client
                    // couldn't parse the response from Amazon S3.
                    e.printStackTrace();
                }
            }catch (e:Exception){
                e.printStackTrace()
            }
        }
    }
    background.start()
原因是 application.properties 中的