Spring Boot og Kotlin

1. Oversikt

En stor kunngjøring ble gitt tilbake i januar i vårøkosystemet: Kotlin-støtte kommer til Spring Framework 5. Dette betyr at Spring Boot 2.x vil ha førsteklasses støtte for Kotlin.

Dette er selvfølgelig ikke uventet, ettersom teamet på Pivotal er kjent for aksept av JVM-språk som Scala og Groovy.

La oss bygge en Kotlin-app ved hjelp av Spring Boot app 2.x!

2. Oppsett

2.1. Miljø

Kotlin støtter utvikling i IntelliJ, Eclipse og på kommandolinjen. Følg instruksjonene for å sette opp miljøet ditt, basert på dine preferanser.

2.2. Oppsett

La oss først lage et Spring Boot 2-prosjekt og endre POM for å inneholde oppføringer som spesifiserer versjonene av Java og Kotlin med avhengighetene:

 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 

Vær oppmerksom på at vi spesifiserer filplasseringer for Kotlin-kilden og testfilene:

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

Hvis Kotlin-filene våre er forskjellige steder, må du endre disse oppføringene i POM.

For å kompilere Kotlin-moduler og kilder, må vi bruke kotlin-maven-plugin:

 kotlin-maven-plugin org.jetbrains.kotlin 1.1.2 vår 1.8 kompilere kompilere kompilere test-kompilere test-kompilere test-kompilere org.jetbrains.kotlin kotlin-maven-allopen 1.1.2 

OK, nå har vi alt vi trenger for å bygge vår Kotlin-applikasjon. For referanse: du finner de nyeste versjonene av Maven Central (spring-boot-starter-web, kotlin-stdlib-jre8, kotlin-reflect, jackson-module-kotlin, test).

Deretter la oss sette opp søknadssammenheng.

3. Søknadskontekst

La oss hoppe inn i noen Kotlin-kode og skrive vår kjente Spring Boot-applikasjonskontekst:

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

Vi ser vår kjente @SpringBootApplication kommentar. Dette er den samme merknaden vi brukte i en Java-klasse.

Nedenfor har vi en klassedefinisjon for vår KotlinDemoApplication klasse. I Kotlin er standardområdet for klasser offentlig, slik at vi kan utelate det. I tillegg, hvis en klasse ikke har noen variabler og ingen funksjoner, kan den deklareres uten krøllete bukseseler. Så egentlig har vi nettopp definert en klasse.

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

Igjen er metoder eller funksjoner offentlige som standard, så vi trenger ikke å erklære det her. I tillegg funksjoner som ikke returnerer noe, trenger ikke å spesifisere en ugyldig returtype.

Og endelig, enhver funksjon definert utenfor kroppen til en klasse er automatisk statisk. Dette gjør denne funksjonen kvalifisert for oppstart av oppstart.

La oss nå kjøre applikasjonen vår fra rotkatalogen ved hjelp av mvn spring-boot: run. Søknaden skal starte, og vi skal se applikasjonen vår kjøre på port 8080.

La oss deretter bygge en kontroller.

4. Kontroller

La oss ta en titt på å legge til en kontroller i tjenesten vår:

@RestController klasse HelloController {@GetMapping ("/ hallo") moro halloKotlin (): String {return "hallo verden"}}

Ikke for mye forskjellig fra en standard vårkontroller, men absolutt mindre kode. La oss legge til en testklasse og sak for denne kontrolleren for å validere arbeidet vårt:

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

Denne testen viser en av Kotlins veldig kraftige funksjoner - null sikkerhet! Kotlin-variabler som kan være null, må erklæres ved hjelp av ‘?’. Kompilatoren vet da at defensiv koding er nødvendig før du får tilgang til eiendommen.

I vår test, TestRestTemplate er definert som en nullbar type, og hver gang vi får tilgang til den, gjør vi det ved å bruke null-koalescerende operator "?." - som vil returnere null hvis det ringte objektet er null.

Dette tydeliggjør bruken av null i programmet og tvinger utviklere til å skrive sikker kode når de jobber med dem.

La oss deretter legge til en tjeneste og integrere den i kontrolleren vår.

5. Service

Som du sikkert kan gjette nå, vil tjenesten vår være ganske enkel å legge til i prosjektet vårt. La oss gjøre det nå:

@Serviceklasse HelloService {fun getHello (): String {return "hallo service"}}

Ganske enkel tjeneste her med en enkelt funksjon som returnerer en streng. La oss deretter koble tjenesten vår inn i kontrolleren og bruke den til å returnere en verdi:

@RestController klasse HelloController (val helloService: HelloService) {// ... @GetMapping ("/ hallo-service") moro helloKotlinService (): streng {return helloService.getHello ()}}

Ahh, det ser fint ut! I Kotlin kan hovedkonstruktøren defineres inline med klassedeklarasjonen. Vi har utelatt @Autowired kommentar fra konstruktøren vår fordi det ikke er obligatorisk siden noen tid.

Disse parameterne konverteres automatisk til felt i klassen. Kotlin de kalles egenskaper. Det er ingen definerte eller settere definert; de opprettes automatisk. Du kan selvfølgelig overstyre disse standardene hvis du vil.

I Kotlin kan egenskaper i klasser og variabler i funksjoner defineres ved hjelp av var eller val. Var indikerer en foranderlig egenskap, og val indikerer en siste. Dette lar kompilatoren sjekke ulovlig tilgang. Siden vår HelloService er en singleton, vi kobler den opp som en val for å forhindre mutasjon.

La oss deretter legge til en test for denne kontrollermetoden:

@Test fun whenCalled_shouldReturnHelloService () {var result = testRestTemplate // ... .getForEntity ("/ hallo-service", String :: class.java) assertNotNull (result) assertEquals (result? .StatusCode, HttpStatus.OK) assertEquals ( resultat? .kropp, "hei tjenesten")}

Til slutt, la oss se på hvordan en POJO ser ut i Kotlin.

6. Kotlin-dataklasse

I Java representerer vi dataobjekter med vanlige gamle Java-objekter, POJO. I Kotlin har vi noe som lar oss uttrykke denne typen objekter mer kortfattet - en dataklasse.

La oss skrive et dataobjekt som skal returneres i kontrolleren vår:

dataklasse HelloDto (val hilsen: streng)

Det var ikke noe triks. Jeg utelater ikke noe fra klassen vår. Med datamodifikatoren får vi mange fordeler. Dette nøkkelordet oppretter automatisk en er lik / hashcode par, en toString funksjon, og en kopifunksjon. Alt dette fra en 53-tegns one-liner!

La oss nå legge til en metode for å returnere vår nye dataklasse:

// ... @GetMapping ("/ hallo-dto") moro halloDto (): HelloDto {return HelloDto ("Hei fra dto")}

Datamodifisereren legger ikke til en standardkonstruktør, noe som er viktig for visse biblioteker som Jackson. For å støtte denne typen klasser har vi lagt til jackson-module-kotlin til vår POM-fil for å støtte marshaling. Dette ble gjort under seksjon 2, og du kan se avhengigheten der.

Til slutt, la oss legge til en test for denne kontrollerfunksjonen:

@Test fun whenCalled_shoudlReturnJSON () {val result = testRestTemplate // ... .getForEntity ("/ hallo-dto", HelloDto :: class.java) assertNotNull (result) assertEquals (result? .StatusCode, HttpStatus.OK) assertEquals ( resultat? .body, HelloDto ("Hello from the dto"))}

7. Konklusjon

I denne artikkelen så vi på Kotlin-støtte i Spring Boot 2.x. Vi så fra eksempler at Kotlin kunne forenkle og forbedre applikasjonene våre ved å tvinge oss til å skrive kortere, tryggere kode.

Kotlin støtter også noen fantastiske funksjoner som dataklasse, klasseutvidelser, og er fullt kompatibel med eksisterende Java-kode. Dette betyr at du kan skrive Kotlin-kode og ringe den fra Java-klasser og omvendt. I tillegg ble Kotlin bygget fra grunnen av for å ha fantastisk støtte i en IDE, og det gjør det.

Det er mange grunner til å prøve Kotlin, og når Google og Spring støtter det, er det nå på tide å sjekke det ut. Gi oss beskjed om hva du bestemte deg for å bygge med den!

Alltid kan du finne kildekoden på GitHub.


$config[zx-auto] not found$config[zx-overlay] not found