Spring Boot dan Kotlin

1. Ikhtisar

Pengumuman besar dibuat kembali pada bulan Januari di ekosistem Spring: Dukungan Kotlin akan hadir untuk Spring Framework 5 . Ini berarti Spring Boot 2.x akan memiliki dukungan kelas satu untuk Kotlin.

Ini tentu saja tidak terduga, karena tim di Pivotal dikenal dengan penerimaan bahasa JVM seperti Scala dan Groovy.

Mari buat aplikasi Kotlin menggunakan aplikasi Spring Boot 2.x!

2. Penyiapan

2.1. Lingkungan Hidup

Kotlin mendukung pengembangan di IntelliJ, Eclipse, dan pada baris perintah. Ikuti petunjuk untuk mengatur lingkungan Anda, berdasarkan preferensi Anda.

2.2. Mendirikan

Pertama, mari buat proyek Spring Boot 2 dan modifikasi POM untuk memuat entri yang menentukan versi Java dan Kotlin dengan dependensi:

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

Perhatikan bahwa kami menentukan lokasi file untuk sumber Kotlin dan file uji kami:

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

Jika file Kotlin kami berada di lokasi yang berbeda, Anda perlu mengubah entri ini di POM.

Untuk mengompilasi modul dan sumber Kotlin, kita perlu menggunakan kotlin-maven-plugin:

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

Baiklah, sekarang kita memiliki semua yang kita butuhkan untuk membangun aplikasi Kotlin kita. Untuk referensi: Anda dapat menemukan versi terbaru Maven Central (spring-boot-starter-web, kotlin-stdlib-jre8, kotlin-reflect, jackson-module-kotlin, test).

Selanjutnya, mari kita siapkan konteks aplikasi kita.

3. Konteks Aplikasi

Mari beralih ke beberapa kode Kotlin dan tulis konteks aplikasi Spring Boot yang sudah kita kenal:

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

Kami melihat anotasi @SpringBootApplication kami yang sudah dikenal . Ini adalah anotasi yang sama yang akan kita gunakan di kelas Java.

Di bawah ini kami memiliki definisi kelas untuk kelas KotlinDemoApplication kami . Di Kotlin, cakupan default untuk kelas adalah publik sehingga kita bisa mengabaikannya. Selain itu, jika kelas tidak memiliki variabel dan fungsi, itu dapat dideklarasikan tanpa tanda kurung kurawal. Jadi, intinya, kita baru saja mendefinisikan kelas.

Pindah ke metode. Ini adalah metode titik masuk Java standar, di Jawa: public static void main (String [] args).

Sekali lagi, metode atau fungsi bersifat publik secara default, jadi kami tidak perlu mendeklarasikannya di sini. Selain itu, fungsi yang tidak mengembalikan apa pun tidak perlu menentukan jenis pengembalian kosong.

Dan terakhir, fungsi apa pun yang ditentukan di luar tubuh kelas secara otomatis statis . Ini membuat fungsi ini memenuhi syarat untuk eksekusi startup.

Sekarang mari kita jalankan aplikasi kita dari direktori root menggunakan mvn spring-boot: run . Aplikasi harus mulai, dan kita akan melihat aplikasi kita berjalan pada port 8080.

Selanjutnya, mari buat pengontrol.

4. Pengontrol

Mari kita lihat menambahkan pengontrol ke layanan kita:

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

Tidak terlalu jauh berbeda dengan pengontrol Spring standar tetapi kode yang pasti lebih sedikit. Mari tambahkan kelas dan kasus uji untuk pengontrol ini untuk memvalidasi pekerjaan kita:

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

Tes ini menunjukkan salah satu fitur Kotlin yang sangat kuat - keamanan nol! Variabel Kotlin yang bisa nol harus dideklarasikan menggunakan '?'. Kompilator kemudian mengetahui bahwa pengkodean defensif diperlukan sebelum mengakses properti itu.

Dalam pengujian kami, TestRestTemplate didefinisikan sebagai jenis nullable, dan setiap kali kami mengaksesnya, kami melakukannya menggunakan operator penggabungan null "?". - yang akan mengembalikan null jika objek yang dipanggil adalah null.

Ini menjelaskan penggunaan null dalam program dan memaksa pengembang untuk menulis kode aman saat bekerja dengannya.

Selanjutnya, mari tambahkan layanan dan mengintegrasikannya ke pengontrol kami.

5. Layanan

Seperti yang mungkin bisa Anda tebak sekarang, layanan kami akan sangat mudah ditambahkan ke dalam proyek kami. Ayo lakukan sekarang:

@Service class HelloService { fun getHello(): String { return "hello service" } }

Layanan yang cukup sederhana di sini dengan satu fungsi yang mengembalikan String. Selanjutnya, mari hubungkan layanan kita ke pengontrol dan gunakan untuk mengembalikan nilai:

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

Ahh, kelihatannya bagus! Di Kotlin, konstruktor utama dapat didefinisikan sejajar dengan deklarasi kelas. Kami telah menghilangkan anotasi @Autowired dari konstruktor kami karena tidak wajib sejak beberapa waktu.

Parameter tersebut secara otomatis diubah ke bidang di kelas. Kotlin mereka disebut properti. Tidak ada pengambil atau penyetel yang ditentukan; mereka dibuat secara otomatis. Anda dapat, tentu saja, mengganti default ini jika Anda mau.

In Kotlin, properties in classes and variables in functions can be defined using var or val. Var indicates a mutable property, and val indicates a final one. This allows the compiler to check for illegal access. Since our HelloService is a singleton, we wire it up as a val to prevent mutation.

Next, let's add a test for this controller method:

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

Lastly, let's look at what a POJO looks like in Kotlin.

6. Kotlin Data Class

In Java, we represent data objects with plain old Java objects, the POJO. In Kotlin we have something that lets us express this type of object more concisely – a data class.

Let's write a data object to return in our controller:

data class HelloDto(val greeting: String)

That was no trick. I'm not omitting anything from our class. With the data modifier, we get a lot of benefits. This keyword automatically creates an equals/hashcode pair, a toString function, and a copy function. All that from a 53 character one-liner!

Now let's add a method to return our new data class:

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

The data modifier does not add a default constructor, which is important for certain libraries like Jackson. To support this type of class we have added the jackson-module-kotlin to our POM file to support marshaling. This was done during section 2, and you can see the dependency there.

Finally, let's add a test for this controller function:

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

7. Conclusion

Di artikel ini, kami melihat dukungan Kotlin di Spring Boot 2.x. Kami melihat dari contoh bahwa Kotlin dapat menyederhanakan dan menyempurnakan aplikasi kami dengan memaksa kami untuk menulis kode yang lebih pendek dan lebih aman.

Kotlin juga mendukung beberapa fitur luar biasa seperti kelas data, ekstensi kelas, dan sepenuhnya kompatibel dengan kode Java yang ada. Ini berarti Anda dapat menulis kode Kotlin dan memanggilnya dari kelas Java Anda dan sebaliknya. Selain itu, Kotlin dibangun dari awal untuk mendapatkan dukungan yang fantastis dalam IDE, dan memang demikian.

Ada banyak alasan untuk mencoba Kotlin, dan dengan dukungan Google dan Spring, sekarang saatnya untuk memeriksanya. Beri tahu kami apa yang Anda putuskan untuk dibuat menggunakan itu!

Selalu, Anda dapat menemukan kode sumber di GitHub.