创建名称为' dataSource'的bean时出错+ Spring Boot + Hibernate

时间:2017-08-16 20:54:45

标签: java mysql spring maven

关于如何访问mysql数据,我在启动spring指南时遇到了一些问题(请参阅此链接:https://spring.io/guides/gs/accessing-data-mysql/)。我稍微调整了类,所以我有这个代码:

  1. 的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/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
    
        <groupId>org.springframework</groupId>
        <artifactId>gs-mysql-data</artifactId>
        <version>0.1.0</version>
    
        <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.5.6.RELEASE</version>
    </parent>
    
    <dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    
    <!-- JPA Data (We are going to use Repositories, Entities, Hibernate, etc...) -->
    
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>
    
    <!-- Use MySQL Connector-J -->
    
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
    </dependency>
    
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
    
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-jdbc</artifactId>
    </dependency>
    </dependencies>
    
    <properties>
        <java.version>1.8</java.version>
    </properties>
    
    <build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
    </build>
    

  2. 我正在使用这个mainController: 的 MainController.java

    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.*;
    
    import com.resource.iPbackend.UserRepository;
    import com.resource.iPbackend.User;
    
    @Controller
    @RequestMapping(path = "/main")
    public class MainController {
    
        @Autowired
        private UserRepository userRepository;
    
        @RequestMapping(path = "/reg", method = RequestMethod.POST)
        public @ResponseBody String regNewUser (@RequestParam String firstName,      @RequestParam String lastName, @RequestParam String email, @RequestParam String password, @RequestParam String username) {
            User n = new User();
            n.setFirstName(firstName);
            n.setLastName(lastName);
            n.setEmail(email);
            n.setPassword(password);
            n.setUsername(username);
            userRepository.save(n);
            return "User is stored in database: " + n;
        }
    
        @GetMapping(path = "/all")
        public @ResponseBody Iterable<User> getAllUsers() {
            return userRepository.findAll();
        }
    }
    

    与此存储库一起: 的 UserRepository.java

    import org.springframework.data.repository.CrudRepository;
    import org.springframework.stereotype.Repository;
    import com.resource.iPbackend.User;
    
    
    @Repository
    public interface UserRepository extends CrudRepository<User, Long> {
    
    }
    

    这个实体: 的 User.java

    import org.springframework.data.annotation.Id;
    
    import javax.persistence.Entity;
    import javax.persistence.GeneratedValue;
    import javax.persistence.GenerationType;
    @Entity
    public class User {
    
        @Id
        @GeneratedValue(strategy = GenerationType.AUTO)
        private Integer id;
        private String firstName;
        private String lastName;
        private String email;
        private String password;
        private String username;
    
        public Integer getId() {
            return id;
        }
    
        public void setId(Integer id) {
            this.id = id;
        }
    
        public String getFirstName() {
            return firstName;
        }
    
        public void setFirstName(String firstName) {
            this.firstName = firstName;
        }
    
        public String getLastName() {
            return lastName;
        }
    
        public void setLastName(String lastName) {
            this.lastName = lastName;
        }
    
        public String getEmail() {
            return email;
        }
    
        public void setEmail(String email) {
            this.email = email;
        }
    
        public String getPassword() {
            return password;
        }
    
        public void setPassword(String password) {
            this.password = password;
        }
    
        public String getUsername() {
            return username;
        }
    
        public void setUsername(String username) {
            this.username = username;
        }
    }
    

    最后我有了这个Application.class:

    @EnableAutoConfiguration
    @SpringBootApplication
    public class IPbackendApplication {
    
    public static void main(String[] args) {
    
        SpringApplication.run(IPbackendApplication.class, args);
    }
    }
    

    我收到此错误:

    org.springframework.beans.factory.UnsatisfiedDependencyException:使用名称&#39; org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration&#39;创建bean时出错:通过构造函数参数0表示的不满意的依赖项;嵌套异常是org.springframework.beans.factory.BeanCreationException:创建名称为&#39; dataSource&#39;的bean时出错。在类路径资源中定义[org / springframework / boot / autoconfigure / jdbc / DataSourceConfiguration $ Tomcat.class]:通过工厂方法的Bean实例化失败;嵌套异常是org.springframework.beans.BeanInstantiationException:无法实例化[org.apache.tomcat.jdbc.pool.DataSource]:工厂方法&#39; dataSource&#39;抛出异常;嵌套异常是java.lang.IllegalArgumentException:URL必须以&#39; jdbc&#39;开头。     在org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:749)〜[spring-beans-4.3.10.RELEASE.jar:4.3.10.RELEASE]     在org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:189)〜[spring-beans-4.3.10.RELEASE.jar:4.3.10.RELEASE]     在org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1193)〜[spring-beans-4.3.10.RELEASE.jar:4.3.10.RELEASE]

    感谢您的帮助!

3 个答案:

答案 0 :(得分:6)

在异常跟踪中查看此消息:

  

嵌套异常是   org.springframework.beans.BeanInstantiationException:失败   instantiate [org.apache.tomcat.jdbc.pool.DataSource]:工厂方法   &#39;数据源&#39;抛出异常;嵌套异常是   java.lang.IllegalArgumentException:网址必须以&#39; jdbc&#39; 开头   org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:749)

您很可能无法提供重置application.properties属性的spring.datasource.url文件。
或者你没有正确评估它。

应该看起来像:

spring.datasource.url=jdbc:mysql://localhost/mydb

您可以参考the Spring Boot documentation

答案 1 :(得分:0)

您共享的最后一个属性有一些错误需要修复spring.datasource.data-username=myuserspring.datasource.data-password=ThePassword

这是如何正确配置spring数据源

的示例
spring.datasource.url=jdbc:mysql://localhost:3306/mydb
spring.datasource.username=myuser
spring.datasource.password=ThePassword

这是Spring documentation

的另一个例子
spring.datasource.url=jdbc:mysql://localhost/test
spring.datasource.username=dbuser
spring.datasource.password=dbpass
spring.datasource.driver-class-name=com.mysql.jdbc.Driver

答案 2 :(得分:0)

尝试测试dao层时,我收到了类似的错误。

@RunWith(SpringRunner.class)
@DataJpaTest
public class ItemRepositoryTest {

    @Autowired
    private ItemRepository itemRepository;

    @Test
    public void findAll() {
        List<Item> allItems = itemRepository.findAll();
        Assertions.assertThat(allItems).hasSize(9);
    }
}

通过添加以下内容解决了该问题:

  

@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)

到测试班:

@RunWith(SpringRunner.class)
@DataJpaTest
@AutoConfigureTestDatabase(replace=AutoConfigureTestDatabase.Replace.NONE)
public class ItemRepositoryTest {...}