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 despring-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.hellopackage 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.messagefor the test using the default attribute of the@SpringBootTestannotation. It is not advisable to putapplication.propertiesin a library because there might be a clash at runtime in the application that uses it (only oneapplication.propertiesis ever loaded from the classpath). You could putapplication.propertiesin 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