Minimalny interfejs REST w Springu

Andrzej Galiński · 2021-02-01

Cel: napisać minimalną aplikację, która będzie odpowiadała tekstem na żądanie GET.

Rozwiązanie:

Struktura:

rest-minimal
├── build.gradle.kts
└── src
    └── main
        └── kotlin
            └── dev
                └── galinski
                    └── jedendziennie
                        └── restminimal
                            ├── App.kt
                            └── Controller.kt

App.kt

package dev.galinski.jedendziennie.restminimal

import org.springframework.boot.autoconfigure.SpringBootApplication
import org.springframework.boot.runApplication

@SpringBootApplication
class RestMinimalApplication { }

fun main(args: Array<String>) {
    runApplication<RestMinimalApplication>(*args)
}

Controller.kt

package dev.galinski.jedendziennie.restminimal

import org.springframework.web.bind.annotation.GetMapping
import org.springframework.web.bind.annotation.RestController

@RestController
class MinController {

    @GetMapping("/")
    fun main(): String {
        return "minim"
    }
}
  • @SpringBootApplication - anotacja 3 w 1, włącza wszystko co trzeba, żeby w danej klasie działała Springowa autokonfiguracja.
  • Anotacje @RestController i cała rodzina @Mapping służą do definiowania rutingu zapytań do odp. klas i metod.

Budowanie

Konfiguracja gradle’a - nie całkiem minimalna (w prawdziwym projekcie lepiej użyć Spring Initializera).

build.gradle.kts

import org.jetbrains.kotlin.gradle.tasks.KotlinCompile

plugins {
    kotlin("jvm") version "1.4.21"
    kotlin("plugin.spring") version "1.4.21"
    id("org.springframework.boot") version "2.2.2.RELEASE"
    id("io.spring.dependency-management") version "1.0.8.RELEASE"
    id("application")
}

java.sourceCompatibility = JavaVersion.VERSION_1_8

repositories {
    mavenCentral()
}

dependencies {
    implementation("org.springframework.boot:spring-boot-starter-web")
    implementation("org.jetbrains.kotlin:kotlin-reflect")
}

tasks.withType<KotlinCompile> {
    kotlinOptions {
        jvmTarget = "1.8"
    }
}
application {
    mainClassName = "dev.galinski.jedendziennie.restminimal.AppKt"
}

Warto zauważyć:

  • Spring (Boot?) wymaga swojej własnej wtyczki do zarządzania zależnościami. Bez niej się nie zbuduje, nawet jeśli nie jest używana jawnie.
  • Spring wymaga też kotlinowej biblioteki do refleksji i podania wersji Javy.