web-dev-qa-db-fra.com

Erreur lors de la création du bean avec le nom 'dataSource' + Spring Boot + Hibernate

J'ai quelques problèmes pour démarrer le guide de printemps sur la façon d'accéder aux données mysql (voir ce lien: https://spring.io/guides/gs/accessing-data-mysql/ ). J'ai légèrement ajusté les classes, j'ai donc ce code:

  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>
    

J'utilise ce 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();
    }
}

Avec ce référentiel: 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> {

}

Et cette entité: 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;
    }
}

Et enfin j'ai cette Application.class:

@EnableAutoConfiguration
@SpringBootApplication
public class IPbackendApplication {

public static void main(String[] args) {

    SpringApplication.run(IPbackendApplication.class, args);
}
}

Je reçois cette erreur:

org.springframework.beans.factory.UnsatisfiedDependencyException: Erreur lors de la création du bean avec le nom 'org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration': Dépendance insatisfaite exprimée par le paramètre constructeur 0; L'exception imbriquée est org.springframework.beans.factory.BeanCreationException: erreur lors de la création du bean avec le nom 'dataSource' défini dans la ressource de chemin de classe [org/springframework/boot/autoconfigure/jdbc/DataSourceConfiguration $ Tomcat.class]: échec de l'instanciation du bean par la méthode de fabrique ; L'exception imbriquée est org.springframework.beans.BeanInstantiationException: échec de l'instanciation [org.Apache.Tomcat.jdbc.pool.DataSource]: la méthode d'usine 'DataSource' a renvoyé une exception; L'exception imbriquée est Java.lang.IllegalArgumentException: l'URL doit commencer par 'jdbc' at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray (ConstructorResolver.Java:749) ~ [spring-beans-4.3.10.RELEASE.jar: 4.3.10.RELEASE] at 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]

Merci de votre aide!

2
justus

Regardez ce message dans la trace d'exception:

exception imbriquée est org.springframework.beans.BeanInstantiationException: Echec de instanciez [org.Apache.Tomcat.jdbc.pool.DataSource]: Méthode de fabrique 'dataSource' a lancé une exception; exception imbriquée est Java.lang.IllegalArgumentException: URL doit commencer par 'jdbc' à org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray (ConstructorResolver.Java:749)

Il est fort probable que vous ne fournissiez pas de fichier application.properties qui valorise la propriété spring.datasource.url.
Sinon vous ne le valorisez pas correctement.

Cela devrait ressembler à:

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

Vous pouvez vous référer à à la documentation Spring Boot .

6
davidxxx

J'ai reçu une erreur assez similaire lorsque j'ai essayé de tester ma couche 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);
    }
}

Le problème a été résolu en ajoutant:

@AutoConfigureTestDatabase (replace = AutoConfigureTestDatabase.Replace.NONE)

à la classe de test:

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

Les dernières propriétés que vous partagez ont des erreurs à corriger spring.datasource.data-username=myuser et spring.datasource.data-password=ThePassword

Ceci est un exemple de la façon de configurer correctement la source de données Spring

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

C'est un autre exemple de Documentation 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
0
Daniel C.