web-dev-qa-db-fra.com

Configurer SpringBoot + Hibernate + PostgreSQL

Je ne connais absolument pas PostgreSQL et la configuration des applications Web Spring, et toutes les informations que j'ai pu trouver à ce sujet se trouvent sur Maven ou sur Eclipse, donc très difficile pour moi de comprendre car j'utilise IntelliJ + Gradle. J'ai installé Postgres v 9.5.4.2 sur mon iMac et lancé une application Web simple:

[~ # ~] mise à jour [~ # ~] : Toutes les corrections apportées, M. Deinum, gradle-2.13 est ok pour SpringBoot?

Structure du projet:

enter image description here

build.gradle:

buildscript {
    ext {
        springBootVersion = '1.3.7.RELEASE'
    }
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
    }
}

apply plugin: 'Java'
apply plugin: 'idea'
apply plugin: 'spring-boot'

jar {
    baseName = 'TryPostgreSQL'
    version = '0.0.1-SNAPSHOT'
}

repositories {
    mavenCentral()
}

dependencies {
    compile 'org.springframework.boot:spring-boot-starter-web'
    compile 'org.springframework.boot:spring-boot-starter-thymeleaf'
    compile 'org.springframework.boot:spring-boot-starter-data-jpa'
    compile 'org.springframework.boot:spring-boot-starter-security'
    compile 'org.springframework.boot:spring-boot-starter-aop'
    compile 'org.thymeleaf.extras:thymeleaf-extras-springsecurity4'
    compile 'com.google.code.gson:gson'
    compile 'org.postgresql:postgresql'

    testCompile 'org.springframework.boot:spring-boot-starter-test'
    testCompile("org.dbunit:dbunit:2.5.1")
    testCompile("com.github.springtestdbunit:spring-test-dbunit:1.2.1")
    testCompile("net.sourceforge.htmlunit:htmlunit:2.20")
    testCompile("org.easytesting:fest-assert:1.4")
    testCompile ("org.springframework.security:spring-security-test")
}

task wrapper(type: Wrapper) {
    gradleVersion = '3.0'
}

task stage {
    dependsOn build
}

Application.Java

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

application.properties (aucune idée pourquoi, mais l'attribut dialecte est en rouge gras):

# Details for our datasource
spring.datasource.url = jdbc:postgresql://localhost:5432/database
spring.datasource.username = postgres
spring.datasource.password = postgres

# Hibernate properties
spring.jpa.database = org.hibernate.dialect.PostgreSQLDialect
spring.jpa.show-sql = false
spring.jpa.hibernate.ddl-auto = create-drop
spring.jpa.hibernate.naming.implicit-strategy = org.hibernate.boot.model.naming.ImplicitNamingStrategyJpaCompliantImpl
spring.jpa.properties.hibernate.format_sql=true

Et un message d'erreur bien sûr:

2016-09-16 09:17:19.978  WARN 773 --- [           main] ationConfigEmbeddedWebApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: 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.BeanCreationException: Error creating bean with name 'dataSource' defined in class path resource [org/springframework/boot/autoconfigure/jdbc/DataSourceAutoConfiguration$NonEmbeddedConfiguration.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [javax.sql.DataSource]: Factory method 'dataSource' threw exception; nested exception is org.springframework.boot.autoconfigure.jdbc.DataSourceProperties$DataSourceBeanCreationException: Cannot determine embedded database driver class for database type NONE. If you want an embedded database please put a supported one on the classpath. If you have database settings to be loaded from a particular profile you may need to active it (no profiles are currently active).
2016-09-16 09:17:19.985  INFO 773 --- [           main] o.Apache.catalina.core.StandardService   : Stopping service Tomcat
2016-09-16 09:17:19.996 ERROR 773 --- [           main] o.s.boot.SpringApplication               : Application startup failed

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.BeanCreationException: Error creating bean with name 'dataSource' defined in class path resource [org/springframework/boot/autoconfigure/jdbc/DataSourceAutoConfiguration$NonEmbeddedConfiguration.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [javax.sql.DataSource]: Factory method 'dataSource' threw exception; nested exception is org.springframework.boot.autoconfigure.jdbc.DataSourceProperties$DataSourceBeanCreationException: Cannot determine embedded database driver class for database type NONE. If you want an embedded database please put a supported one on the classpath. If you have database settings to be loaded from a particular profile you may need to active it (no profiles are currently active).
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.Java:334) ~[spring-beans-4.2.7.RELEASE.jar:4.2.7.RELEASE]

Autre code - modèle juste habituel (mes entités), dao (référentiels Crud), service et contrôleurs. Quoi qu'il en soit, je ne peux même pas le démarrer, obtenant ce message d'erreur juste après le démarrage:

Je serai grandement apprécié pour toute aide pour démarrer ce programme et le connecter à la base de données PostgeSQL.

MISE À JOUR 2: Déplacé. Rafraîchie. Erreur:

Properties configuration failed validation
2016-09-16 09:41:53.696 ERROR 883 --- [           main] o.s.b.b.PropertiesConfigurationFactory   : Field error in object 'spring.jpa' on field 'database': rejected value [org.hibernate.dialect.PostgreSQLDialect]; codes [typeMismatch.spring.jpa.database,typeMismatch.database,typeMismatch.org.springframework.orm.jpa.vendor.Database,typeMismatch]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [spring.jpa.database,database]; arguments []; default message [database]]; default message [Failed to convert property value of type [Java.lang.String] to required type [org.springframework.orm.jpa.vendor.Database] for property 'database'; nested exception is org.springframework.core.convert.ConversionFailedException: Failed to convert from type [Java.lang.String] to type [org.springframework.orm.jpa.vendor.Database] for value 'org.hibernate.dialect.PostgreSQLDialect'; nested exception is Java.lang.IllegalArgumentException: No enum constant org.springframework.orm.jpa.vendor.Database.org.hibernate.dialect.PostgreSQLDialect]

MISE À JOUR 3: Changement du nom de la propriété dans application.property de la base de données au dialecte. L'application a commencé!

7
zzheads

Vous utilisez Spring Boot (c'est du moins ce que vous dites), mais votre code montre que vous essayez vraiment de ne pas utiliser Spring Boot.

Commencez par votre classe Application, idéalement qui devrait être dans un paquetage de niveau supérieur comme com.zzheads.trypostgresql. Avec cela, vous pouvez supprimer le @ComponentScan et remplacez simplement toutes les annotations par un simple @SpringBootApplication annotation. (notez également la suppression de la section static!).

@SpringBootApplication
public class Application {

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

Ensuite vos dépendances. Spring Boot fournit des projets de démarrage qui sont là pour le fait qu'il vous évite de rechercher des dépendances. Corrigez ces dépendances pour utiliser les démarreurs Spring Boot. Essayez d'utiliser les dernières versions 1.3.7.RELEASE de Spring Boot (car vous semblez utiliser la ligne 1.3).

springBootVersion = '1.3.7.RELEASE'

Remarque: Le plugin Spring Boot (et le plugin dépendances) ne fonctionnent pas actuellement avec Gradle 3 (voir this =).

Dépendances

dependencies {
    compile 'org.springframework.boot:spring-boot-starter-web'
    compile 'org.springframework.boot:spring-boot-starter-thymeleaf'
    compile 'org.springframework.boot:spring-boot-starter-data-jpa'
    compile 'org.springframework.boot:spring-boot-starter-security'
    compile 'org.springframework.boot:spring-boot-starter-aop'
    compile 'org.thymeleaf.extras:thymeleaf-extras-springsecurity4'
    compile 'com.google.code.gson:gson'
    compile 'org.postgresql:postgresql'

    testCompile 'org.springframework.boot:spring-boot-starter-test'
    testCompile("org.dbunit:dbunit:2.5.1")
    testCompile("com.github.springtestdbunit:spring-test-dbunit:1.2.1")
    testCompile("net.sourceforge.htmlunit:htmlunit:2.20")
    testCompile("org.easytesting:fest-assert:1.4")
    testCompile ("org.springframework.security:spring-security-test")
}

Spring Boot fournit également une gestion des dépendances afin que vous puissiez supprimer les versions des dépendances déjà gérées.

Next Spring Boot configure déjà un DataSource et un JPA pour vous. Vous n'avez pas besoin de le faire vous-même. Supprimez donc simplement votre DataConfig.

Enfin votre application.properties qui sera chargé par Spring Boot pour vous si vous le mettez dans le emplacement correct . Déplacez-le vers l'un de ces emplacements.

Maintenant, pour pouvoir configurer automatiquement la source de données et JPA, utilisez les noms de propriété appropriés.

# Details for our datasource
spring.datasource.url = jdbc:postgresql://localhost:5432/database
spring.datasource.username = postgres
spring.datasource.password = postgres

# Hibernate properties
spring.jpa.database-platform = org.hibernate.dialect.PostgreSQL94Dialect
spring.jpa.show-sql = false
spring.jpa.hibernate.ddl-auto = create-drop
spring.jpa.hibernate.naming.implicit-strategy = org.hibernate.boot.model.naming.ImplicitNamingStrategyJpaCompliantImpl
spring.jpa.properties.hibernate.format_sql=true

Remarque: Assurez-vous que le application.properties est dans src/main/resources et pas src/main/Java. S'ils sont dans ce dernier, Maven/Gradle les ignorera.

Si les entités sont dans un sous-package de com.zzheads.trypostgresql ils seront déjà détectés automatiquement et vous n'avez rien à ajouter. S'ils ne sont pas ajouter un @EntityScan annotation à votre classe Application pour résoudre ce problème. Il en va de même pour vos référentiels JPA, s'ils se trouvent dans un sous-package, vous n'avez rien à faire.

8
M. Deinum