Proljetni čizma i Kotlin

1. Pregled

Velika najava objavljena je još u siječnju u ekosustavu Proljeće: Podrška za Kotlin dolazi na Spring Framework 5. To znači da će Spring Boot 2.x imati prvoklasnu podršku za Kotlin.

To naravno nije neočekivano, jer je tim u Pivotalu poznat po prihvaćanju JVM jezika kao što su Scala i Groovy.

Izgradimo aplikaciju Kotlin pomoću Spring Boot aplikacije 2.x!

2. Postavljanje

2.1. Okoliš

Kotlin podržava razvoj u IntelliJ, Eclipse i na naredbenom retku. Slijedite upute za postavljanje svog okruženja na temelju svojih želja.

2.2. Postaviti

Prvo, izradimo projekt Spring Boot 2 i izmijenimo POM tako da sadrži unose koji navode verzije Jave i Kotlina s ovisnostima:

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

Imajte na umu da odredujemo mjesta datoteka za izvorne i testne datoteke Kotlin:

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

Ako su naše datoteke Kotlin na različitim lokacijama, morat ćete izmijeniti ove unose u POM-u.

Da bismo kompilirali Kotlin module i izvore, trebamo koristiti kotlin-maven-plugin:

 kotlin-maven-plugin org.jetbrains.kotlin 1.1.2 proljeće 1.8 compile compile compile test-compile test-compile test-compile org.jetbrains.kotlin kotlin-maven-allopen 1.1.2 

U redu, sada imamo sve što nam je potrebno za izgradnju naše aplikacije Kotlin. Za referencu: možete pronaći najnovije verzije Maven Central (spring-boot-starter-web, kotlin-stdlib-jre8, kotlin-reflect, jackson-module-kotlin, test).

Dalje, postavimo kontekst aplikacije.

3. Kontekst aplikacije

Uđimo u neki Kotlin kod i napišite nam poznati kontekst aplikacije Spring Boot:

@SpringBootApplication klasa KotlinDemoApplication zabavna glavna (args: Array) {SpringApplication.run (KotlinDemoApplication :: class.java, * args)}

Vidimo svoje poznato @SpringBootApplication bilješka. To je ista napomena koju bismo koristili u Java klasi.

Ispod toga imamo definiciju klase za naš KotlinDemoApplication razred. U Kotlinu je zadani opseg klasa javan, tako da to možemo izostaviti. Uz to, ako klasa nema varijable i nema funkcija, može se deklarirati bez kovrčavih zagrada. U osnovi, upravo smo definirali klasu.

Prelazak na metodu. Ovo je standardna metoda Java točke ulaska u Javi: javna statička void glavna (String [] args).

Opet, metode ili funkcije su prema zadanim postavkama javne, pa to ovdje ne moramo deklarirati. Dodatno, funkcije koje ne vraćaju ništa ne trebaju specificirati void tip povratka.

I konačno, bilo koja funkcija definirana izvan tijela klase automatski je statična. To ovu funkciju čini prihvatljivom za pokretanje.

A sada pokrenimo našu aplikaciju iz korijenskog direktorija pomoću mvn spring-boot: trčanje. Aplikacija bi se trebala pokrenuti, a mi bismo trebali vidjeti kako se naša aplikacija izvodi na portu 8080.

Dalje, izgradimo kontroler.

4. Kontroler

Pogledajmo dodavanje kontrolera u našu uslugu:

Klasa @RestController HelloController {@GetMapping ("/ hello") fun helloKotlin (): String {return "hello world"}}

Ne razlikuje se previše od standardnog Spring regulatora, ali sigurno manje koda. Dodajmo klasu ispitivanja i slučaj za ovaj kontroler kako bi potvrdio naš rad:

@RunWith (SpringRunner :: class) @SpringBootTest (classes = arrayOf (KotlinDemoApplication :: class), webEnvironment = SpringBootTest. // ... .getForEntity ("/ hello", String :: class.java) assertNotNull (rezultat) assertEquals (rezultat? .statusCode, HttpStatus.OK) assertEquals (rezultat? .body, "hello world")}}

Ovaj test pokazuje jednu od vrlo moćnih Kotlinovih značajki - nultu sigurnost! Kotlin varijable koje mogu biti null moraju se deklarirati pomoću '?'. Kompajler tada zna da je potrebno obrambeno kodiranje prije pristupanja tom svojstvu.

U našem testu, TestRestTemplate definira se kao nullable tip i svaki put kad mu pristupimo, to činimo pomoću null operatora spajanja "?". - koji će vratiti nulu ako je pozvani objekt null.

Ovo pojašnjava upotrebu nula u programu i prisiljava programere da napišu siguran kôd kada rade s njima.

Dalje, dodajte uslugu i integrirajte je u naš kontroler.

5. Usluga

Kao što sada vjerojatno možete pretpostaviti, našu će uslugu biti prilično lako dodati u naš projekt. Učinimo to sada:

@Service klasa HelloService {zabava getHello (): Niz {return "hello service"}}

Ovdje je prilično jednostavna usluga s jednom funkcijom koja vraća String. Dalje, spojimo našu uslugu u kontroler i pomoću nje vratimo vrijednost:

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

Ahh, to izgleda lijepo! U Kotlinu se glavni konstruktor može definirati u skladu s deklaracijom klase. Izostavili smo @Autowired napomena našeg konstruktora jer nije obavezna već neko vrijeme.

Ti se parametri automatski pretvaraju u polja u klasi. Kotlin nazivaju se svojstvima. Nema definiranih getera ili postavljača; stvaraju se automatski. Ako želite, možete poništiti ove zadane postavke.

U Kotlinu se svojstva u klasama i varijable u funkcijama mogu definirati pomoću var ili val. Var označava promjenjivo svojstvo, i val označava konačni. To omogućuje prevoditelju da provjeri ima li ilegalnog pristupa. Od našeg HelloService je singleton, povezujemo ga kao a val kako bi se spriječila mutacija.

Dalje, dodajmo test za ovu metodu kontrolera:

@Test zabave whenCalled_shouldReturnHelloService () {var result = testRestTemplate // ... .getForEntity ("/ hello-service", String :: class.java) assertNotNull (rezultat) assertEquals (rezultat? .StatusCode, HttpStatus.OK) assertEquals ( rezultat? .body, "hello service")}

Na kraju, pogledajmo kako POJO izgleda u Kotlinu.

6. Razred podataka Kotlin

U Javi predstavljamo podatkovne objekte s običnim starim Java objektima, POJO. U Kotlinu imamo nešto što nam omogućuje da sažetiji izrazimo ovu vrstu predmeta - klasu podataka.

Napišimo objekt podataka koji ćemo vratiti u naš kontroler:

podatkovna klasa HelloDto (pozdrav: val)

To nije bio trik. Ne izostavljam ništa iz našeg razreda. Pomoću modifikatora podataka dobivamo puno prednosti. Ova ključna riječ automatski stvara jednako / hashcode par, a toString funkcija i funkcija kopiranja. Sve to od 53-linijske jednoslojne linije!

Sad dodajmo metodu za vraćanje nove klase podataka:

// ... @GetMapping ("/ hello-dto") fun helloDto (): HelloDto {return HelloDto ("Hello from the dto")}

Modifikator podataka ne dodaje zadani konstruktor, što je važno za određene knjižnice kao što je Jackson. Da bismo podržali ovu vrstu klase dodali smo jackson-module-kotlin u našu POM datoteku za podršku marširanju. To je učinjeno tijekom 2. odjeljka i tamo možete vidjeti ovisnost.

Na kraju, dodajmo test za ovu funkciju kontrolera:

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

7. Zaključak

U ovom smo članku pogledali podršku za Kotlin u Spring Boot 2.x. Iz primjera smo vidjeli da bi Kotlin mogao pojednostaviti i poboljšati naše programe prisiljavajući nas da napišemo kraći, sigurniji kod.

Kotlin također podržava neke nevjerojatne značajke poput klase podataka, proširenja klase i u potpunosti je kompatibilan s postojećim Java kodom. To znači da možete napisati Kotlin kod i nazvati ga iz svojih Java klasa i obrnuto. Uz to, Kotlin je izgrađen od temelja kako bi imao fantastičnu podršku u IDE-u, i ima ga.

Puno je razloga za isprobavanje Kotlina, a uz podršku Googlea i Springa, sada je vrijeme da to provjerite. Javite nam što ste odlučili graditi koristeći ga!

Izvorni kod uvijek možete pronaći na GitHubu.