【问题标题】:Spring Boot not able to create datasourceSpring Boot 无法创建数据源
【发布时间】:2016-08-09 15:04:32
【问题描述】:

我想将 Spring Boot 集成到现有应用程序之一中。所以我决定先从 POC 开始。 我从http://www.journaldev.com/3531/spring-mvc-hibernate-mysql-integration-crud-example-tutorial 下载了一个示例工作代码并尝试集成 Spring Boot。我更改了 pom.xml 并添加了一个新的 Java 类 Application。下面是他们两个。

pom.xml

<?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/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.journaldev.spring</groupId>
<artifactId>SpringMVCHibernate</artifactId>
<name>SpringMVCHibernate</name>
<packaging>war</packaging>
<version>1.0.0-BUILD-SNAPSHOT</version>
<properties>
    <java-version>1.6</java-version>
    <org.aspectj-version>1.7.4</org.aspectj-version>
    <org.slf4j-version>1.7.5</org.slf4j-version>
</properties>
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.2.3.RELEASE</version>
    <relativePath />
</parent>

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
    </dependency>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.34</version>
    </dependency>
    <dependency>
        <groupId>commons-dbcp</groupId>
        <artifactId>commons-dbcp</artifactId>
        <version>1.4</version>
    </dependency>
</dependencies>

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

Application.java

package com.journaldev.spring;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.ImportResource;

@SpringBootApplication
@ImportResource({"classpath*:spring/appServlet/servlet-context.xml"})
@EnableAutoConfiguration(exclude=DataSourceAutoConfiguration.class)
public class Application {

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

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

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.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: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:334)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1210)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:537)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:476)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:303)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:299)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194)
at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:368)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1119)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1014)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:504)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:476)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:303)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:299)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194)
at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:956)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:747)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:480)
at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:118)
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:686)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:320)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:957)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:946)
at com.journaldev.spring.Application.main(Application.java:17)
Caused by: 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.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: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:561)
at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:88)
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:331)
... 25 common frames omitted
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: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoSuchBeanDefinitionException(DefaultListableBeanFactory.java:1301)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1047)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:942)
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:533)
... 27 common frames omitted

下面是servlet-context.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/mvc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"    xmlns:beans="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
    http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
    http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd">

<!-- DispatcherServlet Context: defines this servlet's request-processing 
    infrastructure -->

<!-- Enables the Spring MVC @Controller programming model -->
<annotation-driven />

<!-- Handles HTTP GET requests for /resources/** by efficiently serving 
    up static resources in the ${webappRoot}/resources directory -->
<resources mapping="/resources/**" location="/resources/" />

<!-- Resolves views selected for rendering by @Controllers to .jsp resources 
    in the /WEB-INF/views directory -->
<beans:bean
    class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <beans:property name="prefix" value="/WEB-INF/views/" />
    <beans:property name="suffix" value=".jsp" />
</beans:bean>

<beans:bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
    destroy-method="close">
    <beans:property name="driverClassName" value="com.mysql.jdbc.Driver" />
    <beans:property name="url"
        value="jdbc:mysql://localhost:3306/testdb" />
    <beans:property name="username" value="root" />
    <beans:property name="password" value="" />
</beans:bean>

<!-- Hibernate 4 SessionFactory Bean definition -->
<beans:bean id="hibernate4AnnotatedSessionFactory"
    class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
    <beans:property name="dataSource" ref="dataSource" />
    <beans:property name="annotatedClasses">
        <beans:list>
            <beans:value>com.journaldev.spring.model.Person</beans:value>
        </beans:list>
    </beans:property>
    <beans:property name="hibernateProperties">
        <beans:props>
            <beans:prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect
            </beans:prop>
            <beans:prop key="hibernate.show_sql">true</beans:prop>
        </beans:props>
    </beans:property>
</beans:bean>

<beans:bean id="personDAO" class="com.journaldev.spring.dao.PersonDAOImpl">
    <beans:property name="sessionFactory" ref="hibernate4AnnotatedSessionFactory" />
</beans:bean>
<beans:bean id="personService" class="com.journaldev.spring.service.PersonServiceImpl">
    <beans:property name="personDAO" ref="personDAO"></beans:property>
</beans:bean>
<context:component-scan base-package="com.journaldev.spring" />

<tx:annotation-driven transaction-manager="transactionManager"/>

<beans:bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
    <beans:property name="sessionFactory" ref="hibernate4AnnotatedSessionFactory" />
</beans:bean>

【问题讨论】:

  • 你能把你配置数据源的文件贴出来吗?你使用的是什么 bean 或属性文件
  • 我已经发布了 servlet-context.xml 文件。请在上面查看。
  • 也许是愚蠢的问题:不直接采用 Spring-Boot 方式的任何特殊原因?因为您可以省略所有的 xml-situps,只说明驱动程序、用户和通行证和连接将起作用。并且要配置 commons dbcp,如果它在类路径上可用,则无需执行任何操作。
  • 第一件事,在提取一些信息之前,毫无疑问是愚蠢的。答案是:- 我们正在为我们之前开发的现有应用程序评估 Spring Boot。大多数配置都是通过xmls完成的。我们希望以最少的代码更改来利用 Spring Boot,这就是我们想要继续使用 xmls 的原因。再三考虑 Spring Boot 支持 xml 配置,那么为什么它在这种情况下不起作用。
  • 您的servlet-context.xml 在哪里?它是在类路径中还是在WEB-INF 目录中。此外,您使用弹簧靴并努力不使用它,那么使用它的额外好处是什么。

标签: java spring hibernate spring-mvc spring-boot


【解决方案1】:

在运行应用程序时,我们提供如下运行时参数。

-Dspring.config.location=/User/Properties/conf

但最后应该添加一个正斜杠,如下所示。它会解决你的问题。

-Dspring.config.location=/User/Properties/conf/

【讨论】:

  • 确保 application.properties 中的 DbConnection 详细信息正确
【解决方案2】:

经过多次打嗝后,我解决了所有问题并使其正常工作。我已经创建了一个项目并上传到了github,下面是项目的URL。

https://github.com/gauravdubey58/SpringBootLegacy.git

【讨论】:

    【解决方案3】:

    在您的Application.java 文件中,也尝试排除DataSourceTransactionManagerAutoConfiguration。例如:

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

    您可以尝试可运行的示例here。确保此问题的分支是“so-36684444”,并对齐 JDBC 连接。

    在您的Application.java 文件中,我添加了这一行:

    System.out.println(">>> Datasource instance: " + ctx.getBean("dataSource"));
    System.out.println(">>> TransactionManager instance: " + ctx.getBean("transactionManager"));
    

    这是输出:

    >>> Datasource instance: org.apache.commons.dbcp.BasicDataSource@1220ef43
    >>> TransactionManager instance: org.springframework.orm.hibernate4.HibernateTransactionManager@60cb1ed6
    

    【讨论】:

    • 它不适用于我的应用程序。我仍然遇到同样的错误。我会试试你的代码并告诉你。
    • 好吧,然后排除更多的自动配置;)。可能的候选人是:HibernateJpaAutoConfiguration.classJpaRepositoriesAutoConfiguration.classJpaBaseConfiguration.class
    • 好像我在循环问题。 Spring Boot 根本不会读取用 xml 编写的配置。我的 bean 都没有被初始化。我得到了例外。 org.springframework.beans.factory.BeanCreationException:无法自动装配字段:private com.boot.spring.service.PersonService com.boot.spring.controller.PersonController.personService;
    • 我解决了这个问题并发布了我的答案。非常感谢您的帮助。
    • 难道我的问题和答案不值得投赞成票吗?
    【解决方案4】:

    我认为配置文件架构配置有问题,请您使用以下架构配置

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:context="http://www.springframework.org/schema/context"
        xmlns:mvc="http://www.springframework.org/schema/mvc"
        xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
            http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
            http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd">
    

    beans:beans 与 mvc 架构发生冲突。因为 beans:beans 指的是默认 xmlns,在你的情况下是 mvc 模式

    【讨论】:

    • 当然我现在在办公室。到家后我会检查一下并通知您。
    【解决方案5】:

    一周前我遇到了同样的问题,因为我刚刚开始学习 Spring 框架。我尝试使用配置文件(java 和 xml 配置)中的 bean 声明手动配置我的 Spring Boot 应用程序的数据源。然后我意识到 Spring Boot 的设计目的是让我们轻松配置。所以我读到了它的documentation on Database initialization。我认为您可以在 application.properties 文件中使用以下几行来消除所有这些 xml 配置:

    spring.datasource.type=org.apache.commons.dbcp.BasicDataSource
    spring.datasource.url=jdbc:mysql://localhost/testdb
    spring.datasource.username=root
    spring.datasource.password=dbpass
    spring.datasource.driver-class-name=com.mysql.jdbc.Driver
    spring.jpa.show-sql=true
    spring.jpa.hibernate.naming-strategy=org.hibernate.cfg.ImprovedNamingStrategy
    spring.data.jpa.repositories.enabled=true
    spring.jpa.database-platform=org.hibernate.dialect.MYSQL5Dialect
    

    然后用@Entity 注释你的实体类。您可以在 JPA 实体配置here 上找到更多示例。如果您希望 spring boot 自动为您创建和删除数据库表,请将以下内容添加到您的 application.properties 文件中:

    spring.jpa.hibernate.ddl-auto=create-drop
    

    默认值为“创建”。如果您不希望自动创建表或表已经存在,您也可以使用“update”。您可以在 application.properties 文件 here.

    中找到有关常见应用程序属性的更多信息。

    【讨论】:

    • 我不想使用属性文件。我在 xml 中完成了很多配置,所以我只想使用 xml。这个问题必须有一些解决方法,我正在尝试找出它们。
    • 您正在使用 @EnableAutoConfiguration(exclude=DataSourceAutoConfiguration.class) 排除自动配置,但您似乎没有在 servlet-context.xml 中提供数据源配置? Spring 需要有一种方法来配置数据源。使用属性,它会自动为您完成。否则你需要在你的 XML 中声明一个 Datasource bean
    • 我已经在上面发布的 servlet-context.xml 文件中完成了所有配置。这有什么不对吗?如果我不使用弹簧靴一切正常。
    • 请问您为什么不喜欢在应用程序属性文件中配置?
    猜你喜欢
    • 2017-04-17
    • 2014-04-10
    • 1970-01-01
    • 2017-11-11
    • 2019-08-23
    • 2016-10-11
    • 2019-12-02
    • 2020-11-11
    • 1970-01-01
    相关资源
    最近更新 更多