Перейти к основному содержимому

Spring Boot на Kotlin — первая программа

Разработчику Архитектору

Spring Boot на Kotlin — первая программа

На JVM Spring Boot — популярный каркас для веб-сервисов, безопасности, работы с БД и облаком. Kotlin в Spring — полноценный язык: те же стартеры, что в Java, плюс data class, null-safety и короче контроллеры.

СтекКогда выбирать
KtorKotlin-native, явные маршруты, лёгкий старт
Spring Boot + KotlinКоманда на Spring, нужны Security, Data JPA, Spring Cloud

Java-версия сценария: 271.md. Обзор Spring: 27.md.

Перед стартом: первая программа на Kotlin.


Словарь терминов

ТерминПростыми словами
SpringКонтейнер, который создаёт объекты (бины) и связывает зависимости.
Spring BootSpring + автоконфигурация + встроенный Tomcat — быстрый старт.
СтартерГотовый набор зависимостей (spring-boot-starter-web).
@RestControllerКласс с HTTP-методами, ответ — JSON.
@ServiceСлой бизнес-логики.
Dependency InjectionSpring передаёт HelloService в конструктор контроллера.

Что получится

GET http://localhost:8080/api/hello?name=Анна → JSON {"message":"Привет, Анна!"}.


Проект (Gradle Kotlin DSL)

start.spring.io: Kotlin, Gradle, Spring Web, Java 17.

plugins {
kotlin("jvm") version "1.9.24"
kotlin("plugin.spring") version "1.9.24"
id("org.springframework.boot") version "3.3.0"
id("io.spring.dependency-management") version "1.1.5"
}

java {
toolchain { languageVersion.set(JavaLanguageVersion.of(17)) }
}

dependencies {
implementation("org.springframework.boot:spring-boot-starter-web")
testImplementation("org.springframework.boot:spring-boot-starter-test")
}

kotlin("plugin.spring") делает классы с аннотациями Spring открытыми для прокси — вручную писать open на каждый класс не нужно.


Точка входа

package com.example.demo

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

@SpringBootApplication
class DemoApplication

fun main(args: Array<String>) {
runApplication<DemoApplication>(*args)
}
ЭлементСмысл
@SpringBootApplicationВключить сканирование компонентов и автоконфигурацию.
runApplication<DemoApplication>(*args)Kotlin-обёртка над SpringApplication.run.
*argsРаспаковка массива аргументов в vararg.

Модель и сервис

data class HelloResponse(val message: String)

@Service
class HelloService {
fun greet(name: String?): HelloResponse {
val who = name?.trim().takeUnless { it.isNullOrEmpty() } ?: "мир"
return HelloResponse("Привет, $who!")
}
}

Разбор greet:

  1. name?.trim() — если name == null, всё выражение null.
  2. takeUnless { it.isNullOrEmpty() } — отбросить пустую строку после trim.
  3. ?: "мир" — значение по умолчанию.
  4. data class — Jackson (JSON) сериализует поле message автоматически.

Контроллер

@RestController
@RequestMapping("/api")
class HelloController(private val service: HelloService) {

@GetMapping("/hello")
fun hello(@RequestParam(required = false) name: String?): HelloResponse =
service.greet(name)
}
АннотацияРоль
@RestControllerОтветы методов → тело HTTP (JSON).
@RequestMapping("/api")Префикс для всех методов класса.
@GetMapping("/hello")Обработчик GET /api/hello.
@RequestParamПараметр из query: ?name=Анна.
Конструктор HelloServiceConstructor injection — рекомендуемый стиль Spring.

Сравнение с Ktor: в 221.md маршруты в блоке routing { get(...) }; в Spring — аннотации на методах.


Запуск и проверка

./gradlew bootRun
curl -s "http://localhost:8080/api/hello?name=Анна"

В IDEA: Run DemoApplicationKt.


Kotlin и Java в одном проекте

  • Java-классы вызываются из Kotlin без обёрток.
  • Для JPA: kotlin("plugin.jpa") или allOpen / noArg.
  • Nullable Kotlin на границе с Java-кодом без аннотаций — риск NPE: проверяйте вход. Подробнее: 233.md.

Частые ошибки

СимптомПричина
Invalid bean definitionКласс final без plugin.spring
404Неверный @RequestMapping или порт
Кракозябры в JSONUTF-8: server.servlet.encoding.charset=UTF-8 в application.properties

Что попробовать

  1. spring-boot-starter-data-jpaJava JPA.
  2. Spring Security на том же проекте.
  3. Сравнить объём кода с Ktor на том же API.

Дальше

Kotlin ↔ Java · Ktor · корутины · о разделе


См. также

Другие статьи этого же раздела в боковом меню (как на странице «О разделе»).