Spring Boot og Kotlin

1. Oversigt

En stor meddelelse blev sendt tilbage i januar i forårets økosystem: Kotlin-support kommer til Spring Framework 5. Dette betyder, at Spring Boot 2.x får førsteklasses support til Kotlin.

Dette er selvfølgelig ikke uventet, da teamet på Pivotal er kendt for accept af JVM-sprog som Scala og Groovy.

Lad os bygge en Kotlin-app ved hjælp af Spring Boot-app 2.x!

2. Opsætning

2.1. Miljø

Kotlin understøtter udvikling i IntelliJ, Eclipse og på kommandolinjen. Følg instruktionerne for at indstille dit miljø baseret på dine præferencer.

2.2. Opsætning

Lad os først oprette et Spring Boot 2-projekt og ændre POM til at indeholde poster, der specificerer versionerne af Java og Kotlin med afhængighederne:

 org.jetbrains.kotlin kotlin-stdlib-jre8 1.2.71 org.jetbrains.kotlin kotlin-reflekterer 1.2.71 com.fasterxml.jackson.module jackson-module-kotlin 2.9.9 

Bemærk, at vi angiver filplaceringer for vores Kotlin-kilde og testfiler:

$ {project.basedir} / src / main / kotlin $ {project.basedir} / src / test / kotlin

Hvis vores Kotlin-filer er forskellige steder, skal du ændre disse poster i POM.

For at kompilere Kotlin-moduler og kilder skal vi bruge kotlin-maven-plugin:

 kotlin-maven-plugin org.jetbrains.kotlin 1.1.2 fjeder 1.8 kompilere kompilere kompilere test-kompilere test-kompilere test-compile org.jetbrains.kotlin kotlin-maven-allopen 1.1.2 

Okay, nu har vi alt, hvad vi har brug for til at opbygge vores Kotlin-applikation. Til reference: du kan finde de nyeste versioner af Maven Central (spring-boot-starter-web, kotlin-stdlib-jre8, kotlin-reflect, jackson-module-kotlin, test).

Lad os derefter oprette vores applikationskontekst.

3. Applikationskontekst

Lad os hoppe ind i en Kotlin-kode og skrive vores velkendte Spring Boot-applikationskontekst:

@SpringBootApplication klasse KotlinDemoApplication sjov main (args: Array) {SpringApplication.run (KotlinDemoApplication :: class.java, * args)}

Vi ser vores velkendte @SpringBootApplication kommentar. Dette er den samme kommentar, som vi ville bruge i en Java-klasse.

Nedenfor har vi en klassedefinition til vores KotlinDemoApplication klasse. I Kotlin er standardområdet for klasser offentligt, så vi kan udelade det. Derudover, hvis en klasse ikke har nogen variabler og ingen funktioner, kan den erklæres uden krøllede seler. Så i det væsentlige har vi netop defineret en klasse.

Gå videre til metoden. Dette er standard Java-indgangsmetoden i Java: public static ugyldig main (String [] args).

Igen er metoder eller funktioner offentlige som standard, så vi behøver ikke at erklære det her. Derudover funktioner, der ikke returnerer noget, behøver ikke at angive en ugyldig returneringstype.

Og endelig, enhver funktion defineret uden for kroppen i en klasse er automatisk statisk. Dette gør denne funktion berettiget til startudførelse.

Lad os nu køre vores applikation fra rodmappen ved hjælp af mvn spring-boot: løb. Ansøgningen skal starte, og vi skal se vores applikation køre på port 8080.

Lad os derefter bygge en controller.

4. Controller

Lad os se på at tilføje en controller til vores service:

@RestController klasse HelloController {@GetMapping ("/ hej") sjov helloKotlin (): String {returner "hej verden"}}

Ikke for meget forskellig fra en standard Spring controller, men bestemt mindre kode. Lad os tilføje en testklasse og sag for denne controller for at validere vores arbejde:

@RunWith (SpringRunner :: class) @SpringBootTest (classes = arrayOf (KotlinDemoApplication :: class), webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) class KotlinDemoApplicationTests {@Autowired lateinit var testRestTemplate: TestRestTemplate = testRestTemplate = TestRestTemplate: TestRestTemplate: TestRestTemplet // ... .getForEntity ("/ hej", String :: class.java) assertNotNull (resultat) assertEquals (resultat? .statusCode, HttpStatus.OK) assertEquals (resultat? .body, "hej verden")}}

Denne test viser en af ​​Kotlins meget kraftfulde funktioner - nul sikkerhed! Kotlin-variabler, der kan være nul, skal erklæres ved hjælp af '?'. Compileren ved derefter, at defensiv kodning er påkrævet, før han får adgang til ejendommen.

I vores test TestRestTemplate er defineret som en nulbar type, og hver gang vi får adgang til den, gør vi det ved hjælp af nul-koalescerende operator "?." - som returnerer null, hvis det kaldte objekt er null.

Dette tydeliggør brugen af ​​nuller i programmet og tvinger udviklere til at skrive sikker kode, når de arbejder med dem.

Lad os derefter tilføje en tjeneste og integrere den i vores controller.

5. Service

Som du sikkert kan gætte nu, vil vores service være ret let at tilføje til vores projekt. Lad os gøre det nu:

@Serviceklasse HelloService {fun getHello (): Streng {returner "hej service"}}

Temmelig enkel service her med en enkelt funktion, der returnerer en streng. Lad os derefter koble vores service til controlleren og bruge den til at returnere en værdi:

@RestController klasse HelloController (val helloService: HelloService) {// ... @GetMapping ("/ hello-service") sjov helloKotlinService (): String {return helloService.getHello ()}}

Ahh, det ser godt ud! I Kotlin kan hovedkonstruktøren defineres inline med klassedeklarationen. Vi har udeladt @Autowired kommentar fra vores konstruktør, fordi det ikke er obligatorisk siden nogen tid.

Disse parametre konverteres automatisk til felter i klassen. Kotlin de kaldes egenskaber. Der er ingen getters eller settere defineret; de oprettes automatisk. Du kan selvfølgelig tilsidesætte disse standardindstillinger, hvis du vil.

I Kotlin kan egenskaber i klasser og variabler i funktioner defineres ved hjælp af var eller val. Var angiver en ændret egenskab, og val angiver en endelig. Dette giver kompilatoren mulighed for at kontrollere ulovlig adgang. Siden vores Hej service er en singleton, vi forbinder den som en val for at forhindre mutation.

Lad os derefter tilføje en test til denne controller-metode:

@Test sjov nårCalled_shouldReturnHelloService () {var result = testRestTemplate // ... .getForEntity ("/ hello-service", String :: class.java) assertNotNull (result) assertEquals (result? .StatusCode, HttpStatus.OK) assertEquals (result resultat? .krop, "hej service")}

Endelig, lad os se på, hvordan en POJO ser ud i Kotlin.

6. Kotlin-dataklasse

I Java repræsenterer vi dataobjekter med almindelige gamle Java-objekter, POJO. I Kotlin har vi noget, der lader os udtrykke denne type objekter mere kortfattet - en dataklasse.

Lad os skrive et dataobjekt, der skal returneres i vores controller:

dataklasse HelloDto (val hilsen: streng)

Det var ikke noget trick. Jeg undlader ikke noget fra vores klasse. Med datamodifikatoren får vi mange fordele. Dette nøgleord opretter automatisk en er lig med / hashcode par, en toString funktion og en kopifunktion. Alt det fra en 53-linjers one-liner!

Lad os nu tilføje en metode til at returnere vores nye dataklasse:

// ... @GetMapping ("/ hello-dto") sjov helloDto (): HelloDto {return HelloDto ("Hej fra dto")}

Datamodifikatoren tilføjer ikke en standardkonstruktør, hvilket er vigtigt for visse biblioteker som Jackson. For at støtte denne type klasse har vi tilføjet jackson-module-kotlin til vores POM-fil for at understøtte marskalkning. Dette blev gjort under afsnit 2, og du kan se afhængigheden der.

Lad os endelig tilføje en test for denne controller-funktion:

@Test sjov nårCalled_shoudlReturnJSON () {val result = testRestTemplate // ... .getForEntity ("/ hello-dto", HelloDto :: class.java) assertNotNull (result) assertEquals (result? .StatusCode, HttpStatus.OK) assertEquals ( resultat? .body, HelloDto ("Hej fra dto"))}

7. Konklusion

I denne artikel så vi på Kotlin-support i Spring Boot 2.x. Vi så fra eksempler, at Kotlin kunne forenkle og forbedre vores applikationer ved at tvinge os til at skrive kortere og sikrere kode.

Kotlin understøtter også nogle fantastiske funktioner som dataklassen, klasseudvidelser og er fuldt kompatibel med eksisterende Java-kode. Dette betyder, at du kan skrive Kotlin-kode og kalde den fra dine Java-klasser og vice versa. Derudover blev Kotlin bygget fra bunden for at få fantastisk støtte i en IDE, og det gør det.

Der er mange grunde til at prøve Kotlin, og når Google og Spring bakker op, er det nu tid til at tjekke det ud. Fortæl os, hvad du besluttede at bygge ved hjælp af det!

Altid kan du finde kildekoden over på GitHub.