[JAVA] Modul mit Spring Boot hinzufügen

Was du machen willst

Referenz

Getting Started · Creating a Multi Module Project

Umgebung

Verfahren

Vorbereitung des Hallo-Moduls

setting.gradle


rootProject.name = 'demo'
include 'hello'

Bereiten Sie build.gradle für das Hallo-Modul vor

Erstellen Sie build.gradle direkt unter dem Hallo-Verzeichnis und schreiben Sie wie folgt

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}")
    }
}

Sie müssen das Gradle-Plugin "org.springframework.boot" nicht für Submodule verwenden, aber Sie benötigen "Spring-Boot-Abhängigkeiten". Verwenden Sie also "Dependency-Management" und "MavenBom"

Vielleicht sollte Kotlins Plug-In auch "Dependency-Management" und "MavenBom" verwenden

Fügen Sie die Abhängigkeit des Hallo-Moduls direkt unter dem Projekt hinzu

Die Beschreibung von "Implementierungsprojekt" ("Hallo") wurde zu den Abhängigkeiten von build.gradle direkt unter dem Projekt hinzugefügt.


...

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')
}

Bereiten Sie den Controller im Hallo-Modul vor

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"
    }
}

Funktionsprüfung

Zu beachtende Punkte beim Schreiben von Unit-Tests unter Modulen

Wenn Sie einen Test mit Spring-Funktionen schreiben möchten, z. B. mit mockMvc in einem Modul, müssen Sie eine Klasse mit @ SpringBootApplication vorbereiten.

Probeeinheitstest mit Federfunktion


@ExtendWith(SpringExtension::class)
@WebMvcTest
class ControllerTest(@Autowired val mockMvc: MockMvc) {
    @Test
    fun test() {
        // /Fordern Sie den Parameternamen an, um Hallo zu sagen=Wenn Sie mit Test anfordern
        //Der Status ist 200 und die Antwort ist"hello test"Bestätige das
        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
}

Wenn Sie keine Klasse mit "@ SpringBootApplication" vorbereiten, wird diese Fehlermeldung angezeigt

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

Die Klasse mit "@ SpringBootApplication" kann als separate Datei vorbereitet werden.

Über application.properties (yml)

Das als Referenz verlinkte Offizielle Tutorial enthält die folgende Beschreibung.

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.

Es wird nicht empfohlen, application.properties (yml) unter jedem Modul zu erstellen, da es zu Konflikten kommt.

Als Test habe ich application.properties (yml) im Projektstamm und im Hallo-Modul in diesem Beispiel vorbereitet und versucht zu sehen, wie es funktioniert

Vorbereitung

Bereiten Sie einen Einstiegspunkt vor, um den Wert von application.properties (yml) in Controller anzuzeigen

@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"
    }
}

Überprüfung 1 Bereiten Sie application.properties (yml) nur im Hallo-Modul vor

hoge: hogehoge
fuga: fugafuga

Als ich die Anwendung in diesem Zustand ausführte und auf http: // localhost: 8080 / test zugegriffen habe, wurde "hogehoge fugafuga" angezeigt.

Es funktioniert auch dann einwandfrei, wenn application.properties (yml) nur im Modul vorhanden ist

Überprüfung 2 Bereiten Sie application.properties (yml) für beide vor

Im Projektstamm


hoge: hoge
fuga: fuga

Im Hallo-Modul


hoge: hogehoge
fuga: fugafuga

Als ich die Anwendung in diesem Zustand ausführte und auf http: // localhost: 8080 / test zugegriffen habe, wurde "hoge fuga" angezeigt.

Vorrang hatte das Festlegen des Projektstamms

Überprüfung 3 Bereiten Sie application.properties (yml) für beide vor, löschen Sie jedoch eine Kopie auf der Projektstammseite

Im Projektstamm


hoge: hoge

Im Hallo-Modul


hoge: hogehoge
fuga: fugafuga

Wenn Sie versuchen, die Anwendung in diesem Status auszuführen, stürzt sie ab und es tritt ein Ausführungsfehler auf.

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}"
...

Es ist unwahrscheinlich, dass Sie die fehlenden Elemente aus application.properties (yml) in einem anderen Modul erhalten.

Zusammenfassung

Selbst wenn Sie application.properties (yml) für jedes Modul erstellen und Ihre eigenen Einstellungswerte vorbereiten, wird nur eine application.properties (yml) priorisiert. Es ist unwahrscheinlich, dass Sie die Einstellungen anderer Module erhalten. In diesem Fall ist es besser, es im Projektstamm oder im Hauptmodul zu verwalten.

Beispielcode

https://github.com/eno314/SpringModuleSample

Recommended Posts

Modul mit Spring Boot hinzufügen
Mit Spring Boot herunterladen
Konfigurieren Sie die Spring Boot-Anwendung mit dem Maven Multi-Modul
[Java] Artikel zum Hinzufügen einer Validierung mit Spring Boot 2.3.1.
Generieren Sie mit Spring Boot einen Barcode
Hallo Welt mit Spring Boot
Implementieren Sie GraphQL mit Spring Boot
Beginnen Sie mit Spring Boot
Führen Sie LIFF mit Spring Boot aus
SNS-Login mit Spring Boot
Datei-Upload mit Spring Boot
Spring Boot beginnt mit dem Kopieren
Hallo Welt mit Spring Boot
Erste Schritte mit Spring Boot
Erstellen Sie mit Spring Boot einen Mikrodienst
Mail mit Spring Boot verschicken
Erstellen Sie eine App mit Spring Boot 2
Datenbankverknüpfung mit doma2 (Spring Boot)
Spring Boot Programmierung mit VS Code
Bis "Hallo Welt" mit Spring Boot
Erhalten Sie Validierungsergebnisse mit Spring Boot
(Intellij) Hallo Welt mit Spring Boot
Erstellen Sie eine App mit Spring Boot
Google Cloud Platform mit Spring Boot 2.0.0
Ich habe GraphQL mit Spring Boot ausprobiert
[Java] LINE-Integration mit Spring Boot
Beginnend mit Spring Boot 0. Verwenden Sie Spring CLI
Ich habe Flyway mit Spring Boot ausprobiert
Die Nachrichtenkooperation begann mit Spring Boot
Verarbeitung beim Starten einer Anwendung mit Spring Boot
Hallo Welt mit Eclipse + Spring Boot + Maven
Senden Sie regelmäßige Benachrichtigungen mit LineNotify + Spring Boot
Führen Sie einen Transaktionsbestätigungstest mit Spring Boot durch
Versuchen Sie es mit Spring Boot mit VS-Code
Starten Sie die Entwicklung von Webanwendungen mit Spring Boot
Starten Sie die Nginx + Spring Boot-Anwendung mit Docker-Compose
Implementieren Sie CRUD mit Spring Boot + Thymeleaf + MySQL
Asynchrone Verarbeitung mit Spring Boot unter Verwendung von @Async
Implementieren Sie die Paging-Funktion mit Spring Boot + Thymeleaf
Spring Boot Denken Sie daran
gae + frühlingsstiefel
(IntelliJ + gradle) Hallo Welt mit Spring Boot
Verwenden Sie den Cache mit EhCashe 2.x mit Spring Boot
Formularklassenvalidierungstest mit Spring Boot
Fügen Sie Frühlingsstiefel und Gradle zur Sonnenfinsternis hinzu
Führen Sie die WEB-Anwendung mit Spring Boot + Thymeleaf aus
Erreichen Sie die BASIC-Authentifizierung mit Spring Boot + Spring Security
Erstellen Sie eine Website mit Spring Boot + Gradle (jdk1.8.x)
Testen Sie den Controller mit Mock MVC im Spring Boot
Asynchrone Verarbeitung mit regelmäßiger Ausführung in Spring Boot
Bis zur Datenerfassung mit Spring Boot + MyBatis + PostgreSQL
Erstellen Sie mit Spring Boot eine einfache Such-App
Hash-Passwörter mit Spring Boot + Spring Security (mit Salt, mit Stretching)
Verwendung von MyBatis2 (iBatis) mit Spring Boot 1.4 (Spring 4)
Führen Sie die Scala-Anwendung mit Spring Boot über Gradle aus
Verwendung des eingebauten h2db mit Federstiefel
Versuchen Sie, die Anmeldefunktion mit Spring Boot zu implementieren
So fügen Sie in Spring Boot einen Klassenpfad hinzu