簡體   English   中英

創建名為'dataSource'+ Spring Boot + Hibernate的bean時出錯

[英]Error creating bean with name 'dataSource' + Spring Boot + Hibernate

關於如何訪問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> 

我正在使用這個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:創建名為'org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration'的bean時出錯:通過構造函數參數0表示不滿意的依賴關系; 嵌套異常是org.springframework.beans.factory.BeanCreationException:在類路徑資源中定義名稱為'dataSource'的bean時出錯[org / springframework / boot / autoconfigure / jdbc / DataSourceConfiguration $ Tomcat.class]:通過工廠方法進行Bean實例化失敗; 嵌套異常是org.springframework.beans.BeanInstantiationException:無法實例化[org.apache.tomcat.jdbc.pool.DataSource]:工廠方法'dataSource'引發異常; 嵌套異常是java.lang.IllegalArgumentException:URL必須以org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:749)〜[spring-beans-4.3.10.RELEASE.jar中的'jdbc'開頭: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] at org .springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1193)〜[spring-beans-4.3.10.RELEASE.jar:4.3.10.RELEASE]

謝謝你的幫助!

在異常跟蹤中查看此消息:

嵌套異常是org.springframework.beans.BeanInstantiationException:無法實例化[org.apache.tomcat.jdbc.pool.DataSource]:工廠方法'dataSource'引發異常; 嵌套異常是java.lang.IllegalArgumentException: URL必須以org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:749)中的'jdbc'開頭

您很可能不提供值為spring.datasource.url屬性的application.properties文件。
否則你沒有正確評估它。

它應該看起來像:

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

您可以參考Spring Boot文檔

在嘗試測試我的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(替換= AutoConfigureTestDatabase.Replace.NONE)

到測試類:

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

您共享的最后一個屬性有一些錯誤需要修復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文檔的另一個例子

spring.datasource.url=jdbc:mysql://localhost/test
spring.datasource.username=dbuser
spring.datasource.password=dbpass
spring.datasource.driver-class-name=com.mysql.jdbc.Driver

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM