スプリングブーツとコトリン

春のブーツとコトリン

1. 概要

1月に春のエコシステムで大きな発表がありました:Kotlin support is coming to Spring Framework 5。 これは、Spring Boot 2.xがKotlinをサポートすることを意味します。

PivotalのチームはScalaやGroovyなどのJVM言語を受け入れていることで知られているため、これは当然のことです。

Spring Bootアプリ2.xを使用してKotlinアプリを作成しましょう!

2. セットアップ

2.1. 環境

Kotlinは、IntelliJEclipse、およびcommand lineでの開発をサポートしています。 指示に従って、設定に基づいて環境をセットアップします。

2.2. セットアップ

まず、Spring Boot 2プロジェクトを作成し、POMを変更して、依存関係を持つJavaとKotlinのバージョンを指定するエントリを含めます。


    org.jetbrains.kotlin
    kotlin-stdlib-jre8
    1.1.2


    org.jetbrains.kotlin
    kotlin-reflect
    1.1.2


    com.fasterxml.jackson.module
    jackson-module-kotlin
    1.1.2

Kotlinのソースファイルとテストファイルのファイルの場所を指定していることに注意してください。

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

Kotlinファイルが異なる場所にある場合、POMでこれらのエントリを変更する必要があります。

Kotlinモジュールとソースをコンパイルするには、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
        
    

さて、これでKotlinアプリケーションを構築するために必要なものはすべて揃いました。 参考:最新バージョンのMaven Centralspring-boot-starter-webkotlin-stdlib-jre8kotlin-reflectjackson-module-kotlintest)を見つけることができます。

次に、アプリケーションコンテキストを設定しましょう。

3. アプリケーションコンテキスト

Kotlinコードに飛び込んで、おなじみのSpringBootアプリケーションコンテキストを書いてみましょう。

@SpringBootApplication
class KotlinDemoApplication

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

おなじみの@SpringBootApplicationアノテーションが表示されます。 これは、Javaクラスで使用するのと同じ注釈です。

その下に、KotlinDemoApplicationクラスのクラス定義があります。 Kotlinでは、クラスのデフォルトスコープはパブリックなので、省略できます。 さらに、クラスに変数や関数がない場合は、中括弧なしで宣言できます。 したがって、本質的に、クラスを定義したばかりです。

メソッドに移ります。 これは、Javaの標準的なJavaエントリポイントメソッドです:public static void main(String[] args).

繰り返しになりますが、メソッドまたは関数はデフォルトでパブリックなので、ここで宣言する必要はありません。 さらに、functions that do not return anything do not need to specify a void return type.

そして最後に、any function defined outside the body of a class is automatically static。 これにより、この関数はスタートアップ実行に適格になります。

次に、mvn spring-boot: runを使用してルートディレクトリからアプリケーションを実行しましょう。 アプリケーションが起動し、ポート8080で実行されているアプリケーションが表示されます。

次に、コントローラーを作成しましょう。

4. コントローラ

私たちのサービスにコントローラーを追加する方法を見てみましょう。

@RestController
class HelloController {

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

標準のSpringコントローラーとそれほど違いはありませんが、確かに少ないコードです。 このコントローラーのテストクラスとケースを追加して、作業を検証しましょう。

@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")
    }
}

このテストは、Kotlinの非常に強力な機能の1つであるヌルセーフティを示しています。 nullにできるKotlin変数は、??を使用して宣言する必要があります。 コンパイラは、そのプロパティにアクセスする前に、防御的なコーディングが必要であることを認識します。

このテストでは、TestRestTemplateはnull許容型として定義されており、アクセスするたびに、null合体演算子「?」を使用してアクセスします。 –呼び出されたオブジェクトがnullの場合、nullを返します。

これにより、プログラムでのヌルの使用が明確になり、開発者はそれらを使用して安全なコードを書く必要があります。

次に、サービスを追加して、それをコントローラーに統合しましょう。

5. サービス

おそらくご想像のとおり、私たちのサービスはプロジェクトに非常に簡単に追加できます。 それでは、それをやってみましょう。

@Service
class HelloService {

    fun getHello(): String {
        return "hello service"
    }
}

ここでは、文字列を返す単一の関数を使用した非常に単純なサービスです。 次に、サービスをコントローラーに接続し、それを使用して値を返します。

@RestController
class HelloController(val helloService: HelloService) {

    // ...

    @GetMapping("/hello-service")
    fun helloKotlinService(): String {
        return helloService.getHello()
    }
}

ああ、いいね! Kotlinでは、メインコンストラクターをクラス宣言でインラインで定義できます。 コンストラクターから@Autowiredアノテーションを省略しました。これは、しばらくの間、必須ではないためです。

これらのパラメーターは、クラスのフィールドに自動的に変換されます。 Kotlinはプロパティと呼ばれます。 定義されたゲッターまたはセッターはありません。それらは自動的に作成されます。 もちろん、必要に応じてこれらのデフォルトをオーバーライドできます。

Kotlinでは、クラスのプロパティと関数の変数は、varまたはvalを使用して定義できます。 Var indicates a mutable property, and val indicates a final one.これにより、コンパイラは不正アクセスをチェックできます。 HelloServiceはシングルトンであるため、突然変異を防ぐためにvalとして接続します。

次に、このコントローラーメソッドのテストを追加しましょう。

@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")
}

最後に、KotlinでPOJOがどのように表示されるかを見てみましょう。

6. Kotlinデータクラス

Javaでは、データオブジェクトをPOJOという単純な古いJavaオブジェクトで表します。 Kotlinには、このタイプのオブジェクトをより簡潔に表現できるもの、つまりデータクラスがあります。

コントローラに返すデータオブジェクトを書いてみましょう。

data class HelloDto(val greeting: String)

それはトリックではありませんでした。 私はクラスから何も省略していません。 データ修飾子を使用すると、多くの利点が得られます。 このキーワードは、equals/hashcodeペア、toString関数、およびコピー関数を自動的に作成します。 53文字のワンライナーからのすべて!

次に、新しいデータクラスを返すメソッドを追加しましょう。

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

データ修飾子はデフォルトのコンストラクターを追加しません。これは、ジャクソンのような特定のライブラリーにとって重要です。 このタイプのクラスをサポートするために、マーシャリングをサポートするためにjackson-module-kotlinをPOMファイルに追加しました。 これはセクション2で行われたもので、依存関係を確認できます。

最後に、このコントローラー関数のテストを追加しましょう。

@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. 結論

この記事では、Spring Boot 2.xでのKotlinサポートについて説明しました。 例から、Kotlinはより短く安全なコードを書くことを強制することで、アプリケーションを単純化および強化できることがわかりました。

Kotlinは、データクラス、クラス拡張などの驚くべき機能もサポートしており、既存のJavaコードと完全に互換性があります。 つまり、Kotlinコードを記述して、Javaクラスから呼び出したり、その逆も可能です。 さらに、KotlinはIDEで素晴らしいサポートを提供するためにゼロから構築されました。

Kotlinを試してみるには多くの理由があります。GoogleとSpringがそれを支援しているので、今こそ試してみましょう。 あなたがそれを使用して構築することに決めたものを教えてください!

常に、ソースコードover on GitHubを見つけることができます。