[JAVA] Ajouter un module avec Spring Boot

Chose que tu veux faire

référence

Getting Started · Creating a Multi Module Project

environnement

procédure

Préparation du module Hello

setting.gradle


rootProject.name = 'demo'
include 'hello'

Préparer build.gradle pour le module hello

Créez build.gradle directement sous le répertoire hello et écrivez comme suit

build.gralde


buildscript {
    ext {
        kotlinVersion = '1.3.10'
    }
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:${kotlinVersion}")
        classpath("org.jetbrains.kotlin:kotlin-allopen:${kotlinVersion}")
    }
}

ext {
    springBootVersion = '2.1.0.RELEASE'
}

apply plugin: 'kotlin'
apply plugin: 'kotlin-spring'
apply plugin: 'io.spring.dependency-management'

group = 'com.example'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = 1.8

compileKotlin {
    kotlinOptions {
        freeCompilerArgs = ["-Xjsr305=strict"]
        jvmTarget = "1.8"
    }
}
compileTestKotlin {
    kotlinOptions {
        freeCompilerArgs = ["-Xjsr305=strict"]
        jvmTarget = "1.8"
    }
}

repositories {
    mavenCentral()
}

dependencies {
    implementation('org.springframework.boot:spring-boot-starter-web')
    implementation('com.fasterxml.jackson.module:jackson-module-kotlin')
    implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8")
    implementation("org.jetbrains.kotlin:kotlin-reflect")
    testImplementation('org.springframework.boot:spring-boot-starter-test')
}

dependencyManagement {
    imports {
        mavenBom("org.springframework.boot:spring-boot-dependencies:${springBootVersion}")
    }
}

Vous n'avez pas besoin d'utiliser le plug-in gradle de ʻorg.springframework.bootpour le sous-module, mais vous avez besoin despring-boot-dependencies, alors utilisez dependency-management et mavenBom`.

Peut-être que le plug-in de Kotlin devrait également utiliser dependency-management et mavenBom

Ajouter une dépendance de module Hello directement sous le projet

Ajout de la description de ʻimplementation project (': hello') `aux dépendances de build.gradle directement sous le projet.


...

dependencies {
	implementation('org.springframework.boot:spring-boot-starter-web')
	implementation('com.fasterxml.jackson.module:jackson-module-kotlin')
	implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8")
	implementation("org.jetbrains.kotlin:kotlin-reflect")
	
	implementation project(':hello')
	
	testImplementation('org.springframework.boot:spring-boot-starter-test')
}

Préparer le contrôleur dans le module hello

package com.example.demo.hello

import org.springframework.web.bind.annotation.GetMapping
import org.springframework.web.bind.annotation.RequestParam
import org.springframework.web.bind.annotation.RestController

@RestController
class Controller {

    @GetMapping("/hello")
    fun hello(
        @RequestParam(required = false, defaultValue = "world") name: String
    ): String {
        return "hello $name"
    }
}

Contrôle de fonctionnement

Points à noter lors de l'écriture de tests unitaires sous les modules

Si vous souhaitez écrire un test en utilisant les fonctions Spring telles que l'utilisation de mockMvc dans un module, vous devez préparer une classe avec @ SpringBootApplication.

Exemple de test unitaire à l'aide de la fonction Spring


@ExtendWith(SpringExtension::class)
@WebMvcTest
class ControllerTest(@Autowired val mockMvc: MockMvc) {
    @Test
    fun test() {
        // /Demander le nom du paramètre pour bonjour=Si vous demandez avec test
        //Le statut est 200 et la réponse est"hello test"Confirmez que
        val request = MockMvcRequestBuilders.get("/hello")
            .param("name", "test")
        mockMvc.perform(request)
            .andExpect(MockMvcResultMatchers.status().isOk)
            .andExpect(MockMvcResultMatchers.content().string("hello test"))
    }

    @SpringBootApplication
    internal class TestConfiguration
}

Si vous ne préparez pas de classe avec @ SpringBootApplication, vous obtiendrez ce message d'erreur

java.lang.IllegalStateException: Unable to find a @SpringBootConfiguration, you need to use @ContextConfiguration or @SpringBootTest(classes=...) with your test

La classe avec @ SpringBootApplication peut être préparée dans un fichier séparé.

À propos de application.properties (yml)

Le Tutoriel officiel lié pour référence a la description suivante.

In the sample above we have configured the service.message for the test using the default attribute of the @SpringBootTest annotation. It is not advisable to put application.properties in a library because there might be a clash at runtime in the application that uses it (only one application.properties is ever loaded from the classpath). You could put application.properties in the test classpath, but not include it in the jar, for instance by placing it in src/test/resources.

Il n'est pas recommandé de créer application.properties (yml) sous chaque module car il est en conflit.

En guise de test, j'ai préparé application.properties (yml) à la racine du projet et dans le module hello de cet exemple et j'ai essayé de voir comment cela fonctionne

Préparation

Préparez un point d'entrée pour afficher la valeur de application.properties (yml) dans Controller

@RestController
class Controller {

    @Value("\${hoge}")
    private val hoge: String? = null

    @Value("\${fuga}")
    private val fuga: String? = null

...

    @GetMapping("/test")
    fun test(): String {
        return "$hoge $fuga"
    }
}

Vérification 1 Préparez application.properties (yml) uniquement dans le module hello

hoge: hogehoge
fuga: fugafuga

Lorsque j'ai exécuté l'application dans cet état et que j'ai accédé à http: // localhost: 8080 / test, hogehoge fugafuga était affiché.

Cela fonctionne bien même s'il n'y a application.properties (yml) que dans le module

Vérification 2 Préparez application.properties (yml) pour les deux

À la racine du projet


hoge: hoge
fuga: fuga

Dans le module bonjour


hoge: hogehoge
fuga: fugafuga

Lorsque j'ai exécuté l'application dans cet état et que j'ai accédé à http: // localhost: 8080 / test, hoge fuga était affiché.

La priorité a été donnée à la définition de la racine du projet

Vérification 3 Préparez application.properties (yml) pour les deux, mais supprimez une copie à la racine du projet

À la racine du projet


hoge: hoge

Dans le module bonjour


hoge: hogehoge
fuga: fugafuga

Si vous essayez d'exécuter l'application dans cet état, elle se bloquera et une erreur d'exécution se produira.

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'controller': Injection of autowired dependencies failed; nested exception is java.lang.IllegalArgumentException: Could not resolve placeholder 'fuga' in value "${fuga}"
...
Caused by: java.lang.IllegalArgumentException: Could not resolve placeholder 'fuga' in value "${fuga}"
...

Il semble peu probable que vous obteniez les éléments manquants de application.properties (yml) dans un autre module.

Résumé

Même si vous créez application.properties (yml) pour chaque module et préparez vos propres valeurs de paramètre, une seule application.properties (yml) est prioritaire. Il semble peu probable que vous obteniez les paramètres d'autres modules. Si tel est le cas, il semble préférable de le gérer à la racine du projet ou dans le module principal.

Exemple de code

https://github.com/eno314/SpringModuleSample

Recommended Posts

Ajouter un module avec Spring Boot
Télécharger avec Spring Boot
Configurer l'application Spring Boot avec le module multiple maven
[Java] Article pour ajouter une validation avec Spring Boot 2.3.1.
Générer un code à barres avec Spring Boot
Hello World avec Spring Boot
Implémenter GraphQL avec Spring Boot
Démarrez avec Spring Boot
Exécutez LIFF avec Spring Boot
Connexion SNS avec Spring Boot
Téléchargement de fichiers avec Spring Boot
Spring Boot commençant par copie
Hello World avec Spring Boot
Premiers pas avec Spring Boot
Créer un micro service avec Spring Boot
Envoyer du courrier avec Spring Boot
Créez une application avec Spring Boot 2
Liaison de base de données avec doma2 (Spring boot)
Programmation Spring Boot avec VS Code
Jusqu'à "Hello World" avec Spring Boot
Obtenez des résultats de validation avec Spring Boot
(Intellij) Hello World avec Spring Boot
Créez une application avec Spring Boot
Google Cloud Platform avec Spring Boot 2.0.0
J'ai essayé GraphQL avec Spring Boot
[Java] Intégration LINE avec Spring Boot
À partir de Spring Boot 0. Utilisez Spring CLI
J'ai essayé Flyway avec Spring Boot
La coopération des messages a commencé avec Spring Boot
Traitement lors du démarrage d'une application avec Spring Boot
Hello World avec Eclipse + Spring Boot + Maven
Envoyez des notifications régulières avec LineNotify + Spring Boot
Effectuer un test de confirmation de transaction avec Spring Boot
Essayez d'utiliser Spring Boot avec VS Code
Démarrez le développement d'applications Web avec Spring Boot
Lancez l'application Nginx + Spring Boot avec docker-compose
Implémenter CRUD avec Spring Boot + Thymeleaf + MySQL
Traitement asynchrone avec Spring Boot en utilisant @Async
Implémenter la fonction de pagination avec Spring Boot + Thymeleaf
Spring Boot Rappelez-vous
gae + botte à ressort
(IntelliJ + gradle) Hello World avec Spring Boot
Utiliser le cache avec EhCashe 2.x avec Spring Boot
Test de validation de classe de formulaire avec Spring Boot
Ajoutez une botte de printemps et un dégradé à éclipse
Exécutez l'application WEB avec Spring Boot + Thymeleaf
Obtenez une authentification BASIC avec Spring Boot + Spring Security
Créez un site Web avec Spring Boot + Gradle (jdk1.8.x)
Testez le contrôleur avec Mock MVC dans Spring Boot
Traitement asynchrone avec exécution régulière dans Spring Boot
Jusqu'à l'acquisition de données avec Spring Boot + MyBatis + PostgreSQL
Créez une application de recherche simple avec Spring Boot
Hash des mots de passe avec Spring Boot + Spring Security (avec sel, avec étirement)
Comment utiliser MyBatis2 (iBatis) avec Spring Boot 1.4 (Spring 4)
Exécutez l'application Scala avec Spring Boot via Gradle
Comment utiliser h2db intégré avec Spring Boot
Essayez d'implémenter la fonction de connexion avec Spring Boot
Comment ajouter un chemin de classe dans Spring Boot