hello world
lorsque vous accédez à / hello
avec GET.Getting Started · Creating a Multi Module Project
bonjour
directement sous le projet à
setting.gradle` directement sous le projet.setting.gradle
rootProject.name = 'demo'
include '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 de
spring-boot-dependencies, alors utilisez
dependency-management et
mavenBom`.
Peut-être que le plug-in de Kotlin devrait également utiliser dependency-management
et mavenBom
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')
}
src / main / kotlin
sous le répertoire hellocom.example.demo.hello
dans le répertoire src / main / kotlin
.com.example.demo.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"
}
}
http: // localhost: 8080 / hello
avec un navigateur et vérifiez que hello world
est affiché.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é.
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 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
.
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é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"
}
}
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
À 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
À 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.
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.
https://github.com/eno314/SpringModuleSample
Recommended Posts