1概要

1月にSpringエコシステムで大きな発表がありました。

  • KotlinのサポートはSpring Framework 5 ** に向けられています。これは、Spring Boot 2.xがKotlinをファーストクラスでサポートすることを意味します。

PivotalのチームはScalaやGroovyなどのJVM言語を受け入れていることで知られているので、これはもちろん予想外のことではありません。

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


2セットアップ

** 2.1. 環境+

**

Kotlinはhttps://kotlinlang.org/docs/tutorials/getting-started.html[IntelliJ]、https://kotlinlang.org/docs/tutorials/getting-started-eclipse.html[Eclipse]などで開発をサポートしています。

command line

指示に従って、環境に合わせて環境を設定します。


2.2. セットアップ

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

<dependency>
    <groupId>org.jetbrains.kotlin</groupId>
    <artifactId>kotlin-stdlib-jre8</artifactId>
    <version>1.1.2</version>
</dependency>
<dependency>
    <groupId>org.jetbrains.kotlin</groupId>
    <artifactId>kotlin-reflect</artifactId>
    <version>1.1.2</version>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.module</groupId>
    <artifactId>jackson-module-kotlin</artifactId>
    <version>1.1.2</version>
</dependency>

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

<sourceDirectory>${project.basedir}/src/main/kotlin</sourceDirectory>
<testSourceDirectory>${project.basedir}/src/test/kotlin</testSourceDirectory>

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

Kotlinのモジュールとソースをコンパイルするには、


https://search.maven.org/classic/#search%7Cgav%7C1%7Cg%3A%22org.jetbrains.kotlin%22%20AND%20a%3A%22kotlin-を使用する必要があります。

maven-plugin%22[kotlin-maven-plugin]:

<plugin>
    <artifactId>kotlin-maven-plugin</artifactId>
    <groupId>org.jetbrains.kotlin</groupId>
    <version>1.1.2</version>
    <configuration>
        <compilerPlugins>
            <plugin>spring</plugin>
        </compilerPlugins>
        <jvmTarget>1.8</jvmTarget>
    </configuration>
    <executions>
        <execution>
            <id>compile</id>
            <phase>compile</phase>
            <goals>
                <goal>compile</goal>
            </goals>
        </execution>
        <execution>
            <id>test-compile</id>
            <phase>test-compile</phase>
            <goals>
                <goal>test-compile</goal>
            </goals>
        </execution>
    </executions>
    <dependencies>
        <dependency>
            <groupId>org.jetbrains.kotlin</groupId>
            <artifactId>kotlin-maven-allopen</artifactId>
            <version>1.1.2</version>
        </dependency>
    </dependencies>
</plugin>

それでは、Kotlinアプリケーションを構築するために必要なものはすべて揃いました。

参考のために:あなたは

Maven Central

(https://search.maven.org/classic/#search%7Cgav%7C1%7Cg%3A%22org.springframework.boot%22%20AND%20a%3A%の最新バージョンを見つけることができます22spring-boot-starter-web%22[spring-boot-starter-web]、https://search.maven.org/classic/#search%7Cgav%7C1%7Cg%3A%22org.jetbrains.kotlin%22% 20AND%20a%3A%22kotlin-stdlib-jre8%22[kotlin-stdlib-jre8]、https://search.maven.org/classic/#search%7Cgav%7C1%7Cg%3A%22org.jetbrains.kotlin% 22%20AND%20a%3A%22kotlin-reflect%22[kotlin-reflect]、https://search.maven.org/classic/#search%7Cgav%7C1%7Cg%3A%22com.fasterxml.jackson.module% 22%20AND%20a%3A%22jackson-module-kotlin%22[jackson-module-kotlin]、https://search.maven.org/classic/#search%7Cgav%7C1%7Cg%3A%22org.springframework。 boot%22%20AND%20a%3A%22spring-boot-start-test-test%22[test])。

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

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

**

Kotlinのコードに飛び込んで、よく知られたSpring Bootのアプリケーションコンテキストを書きましょう。

@SpringBootApplication
class KotlinDemoApplication

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

よく知られている

@ SpringBootApplication

アノテーションを見ました。これは、Javaクラスで使用するのと同じアノテーションです。

その下に、

KotlinDemoApplication

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

方法に移ります。これは、Javaにおける標準のJavaエントリポイントメソッドです。

public static void main(String[]args).

繰り返しますが、メソッドや関数はデフォルトで公開されているので、ここで宣言する必要はありません。さらに、何も返さない関数は、void戻り型を指定する必要はありません。

そして最後に、** クラスの本体の外側で定義された関数は自動的に静的になります。これにより、この関数は起動実行に適したものになります。

それでは、

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の使用が明確になり、開発者がそれらを扱うときに安全なコードを書くように強制されます。

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


5サービス

ご想像のとおり、私たちのサービスは私たちのプロジェクトに追加するのがとても簡単になります。今それをしましょう:

@Service
class HelloService {

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

Stringを返す単一の関数を使用した、ここでは非常に単純なサービスです。

次に、サービスをコントローラに接続し、それを使用して値を返します。

@RestController
class HelloController(val helloService: HelloService) {

   //...

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

ああ、それはいいね! Kotlinでは、メインコンストラクタはクラス宣言とインラインで定義できます。コンストラクタから

@ Autowired

アノテーションを省略しました。これはしばらくの間必須ではないためです。

これらのパラメータは自動的にクラス内のフィールドに変換されます。

コトリン彼らはプロパティと呼ばれています。ゲッターやセッターは定義されていません。それらは自動的に作成されます。もちろん、必要に応じてこれらのデフォルトを上書きすることもできます。

Kotlinでは、クラスのプロパティと関数の変数は

var

または

val

を使って定義できます。


Var

は可変プロパティ、

val

は最後のプロパティを表します

これにより、コンパイラは不正なアクセスをチェックできます。

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. コトリンデータクラス

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

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

data class HelloDto(val greeting: String)

それはトリックではありませんでした。私たちのクラスから何も省略していません。データ修飾子を使用すると、多くの利点が得られます。このキーワードは

equals/hashcode

ペア、

toString

関数、およびcopy関数を自動的に作成します。 53文字のワンライナーからのすべてです。

それでは、新しいデータクラスを返すメソッドを追加しましょう。

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

データ修飾子はデフォルトのコンストラクタを追加しません。これはJacksonのような特定のライブラリにとって重要です。このタイプのクラスをサポートするために、マーシャリングをサポートするためにPOMファイルに

jackson-module-kotlin

を追加しました。これはセクション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がそれを支持している今、それをチェックする時が来ました。あなたがそれを使って構築することに決めたものを教えてください!

常に、あなたはソースコードhttps://github.com/eugenp/tutorials/tree/master/spring-5-mvc[over on GitHub]を見つけることができる。