web-dev-qa-db-fra.com

Comment utiliser Spring Boot avec la base de données MySQL et JPA?

Je souhaite configurer Spring Boot avec MySQL et JPA. Pour cela je crée: Person

package domain;

import javax.persistence.*;

@Entity
@Table(name = "person")
public class Person {

@Id
@GeneratedValue
private Long id;

@Column(nullable = false)
private String firstName;

// setters and getters
}

PersonRepository

package repository;

import domain.Person;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.repository.CrudRepository;


public interface PersonRepository extends CrudRepository<Person, Long> {

Page<Person> findAll(Pageable pageable);
}

PersonController

package controller;

import domain.Person;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import repository.PersonRepository;

@Controller
public class PersonController {

@Autowired
private PersonRepository personRepository;

@RequestMapping("/")
@ResponseBody
public String test() {
    Person person = new Person();
    person.setFirstName("First");
    person.setLastName("Test");
    personRepository.save(person);
    return "hello";
}
}

Début de la classe Exemple:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class Example {

public static void main(String[] args) throws Exception {
    SpringApplication.run(Example.class, args);
}

}

Et pour la configuration de la base de données, je crée application.properties

spring.jpa.hibernate.ddl-auto=create-drop
spring.jpa.properties.hibernate.globally_quoted_identifiers=true

spring.datasource.url=jdbc:mysql://localhost/test_spring_boot
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driverClassName=com.mysql.jdbc.Driver

J'ai donc une structure de projet:

enter image description here

Mais par conséquent, j'ai des exceptions:

org.springframework.beans.factory.BeanDefinitionStoreException: Failed to parse configuration class [Example]; nested exception is Java.io.FileNotFoundException: class path resource [org/springframework/security/config/annotation/authentication/configurers/GlobalAuthenticationConfigurerAdapter.class] cannot be opened because it does not exist

Par exemple, j'utilise: spring-boot-sample-data-jpa/pom.xml

21
TestUser

J'ai créé un projet comme toi. La structure ressemble à ceci

project structure

Les cours sont simplement copiés depuis le vôtre.

J'ai changé le application.properties à ceci:

spring.datasource.url=jdbc:mysql://localhost/testproject
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driverClassName=com.mysql.jdbc.Driver
spring.jpa.hibernate.ddl-auto=update

Mais je pense que votre problème est dans votre 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>

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.4.1.RELEASE</version>
</parent>

<artifactId>spring-boot-sample-jpa</artifactId>
<name>Spring Boot JPA Sample</name>
<description>Spring Boot JPA Sample</description>

<dependencies>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-Java</artifactId>
    </dependency>
    <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>
</dependencies>
<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

Vérifiez ces fichiers pour les différences. J'espère que cela t'aides

Mise à jour 1: J'ai changé mon nom d'utilisateur. Le lien vers l'exemple est maintenant https://github.com/Yannic92/stackOverflowExamples/tree/master/SpringBoot/MySQL

23
Yannic Klem

Lorsque vous déplacez des classes dans des packages spécifiques tels que référentiel, contrôleur, domaine, le générique @SpringBootApplication ne suffit pas. 

Vous devrez spécifier le package de base pour l'analyse des composants

@ComponentScan("base_package")

Pour JPA 

@EnableJpaRepositories(basePackages = "repository")

est également nécessaire, afin que les données de printemps sachent où chercher pour les interfaces de référentiel.

3
Florin Grozea

Dans la référence botte de printemps , il était écrit:

Lorsqu'une classe n'inclut pas de déclaration de package, elle est considérée comme appartenant au «package par défaut». L'utilisation du «package par défaut» est généralement déconseillée et doit être évitée. Cela peut poser des problèmes particuliers aux applications de démarrage Spring qui utilisent les annotations @ComponentScan, @EntityScan ou @SpringBootApplication, car toutes les classes de chaque fichier jar seront lues.

com
 +- example
     +- myproject
         +- Application.Java
         |
         +- domain
         |   +- Customer.Java
         |   +- CustomerRepository.Java
         |
         +- service
         |   +- CustomerService.Java
         |
         +- web
             +- CustomerController.Java

Dans vos cas. Vous devez ajouter scanBasePackages dans le @SpringBootApplication annotation.just like@SpringBootApplication(scanBasePackages={"domain","contorller"..})

0
linghu