Getting Started · Creating a Multi Module Project
setting.gradle
rootProject.name = 'demo'
include 'hello'
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
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')
}
com.example.demo.hello
vorpackage 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"
}
}
http: // localhost: 8080 / hello
zu und überprüfen Sie, ob hello world
angezeigt wird.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.
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 putapplication.properties
in a library because there might be a clash at runtime in the application that uses it (only oneapplication.properties
is ever loaded from the classpath). You could putapplication.properties
in the test classpath, but not include it in the jar, for instance by placing it insrc/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
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"
}
}
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
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
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.
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.
https://github.com/eno314/SpringModuleSample
Recommended Posts