Introduction
Spring and Kotlin combine together to create a powerhouse when it comes to rapid application development. The Spring project is a powerful framework that allows you to develop an application quickly with as little boilerplate and configuration code as possible. Kotlin is a language that is developed Jetbrains that focuses on code readability and conciseness. This guide will show you how to build a RESTful web service using Spring Boot and Kotlin.
Getting Started
We will use a Maven project to mranage the resources that this application will need. Your project will need the following folder skeleton before you can continue.

After you have created your project skeleton you can continue.
pom.xml
The pom.xml file is used by Maven to manage all of your project dependencies. You can copy and paste this code into your pom.xml file, which will pull in all of the Spring Boot and Kotlin dependencies.
4.0.0
stonesoupprogramming
BuildingRESTfulWebService
1.0-SNAPSHOT
1.2.31
org.springframework.boot
spring-boot-starter-parent
2.0.0.RELEASE
org.jetbrains.kotlin
kotlin-stdlib-jdk8
${kotlin.version}
org.jetbrains.kotlin
kotlin-reflect
${kotlin.version}
org.reflections
reflections
0.9.10
org.jetbrains.kotlin
kotlin-test
${kotlin.version}
test
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-starter-test
test
com.jayway.jsonpath
json-path
test
src/main/kotlin
org.springframework.boot
spring-boot-maven-plugin
org.jetbrains.kotlin
kotlin-maven-plugin
${kotlin.version}
compile
compile
compile
test-compile
test-compile
test-compile
1.8
spring-releases
https://repo.spring.io/libs-release
spring-releases
https://repo.spring.io/libs-release
Application.kt
Kotlin is a language that is meant to be concise, which plays to our advantage. We will hold all of our classes inside of the Application.kt file.
package com.stonesoupprogramming.spring.boot
import org.springframework.boot.SpringApplication
import org.springframework.boot.autoconfigure.SpringBootApplication
import org.springframework.web.bind.annotation.RequestMapping
import org.springframework.web.bind.annotation.RequestParam
import org.springframework.web.bind.annotation.RestController
import java.util.concurrent.atomic.AtomicLong
/**
* This class gets converted into JSON and serves as our data model.
* We can use Kotlin's data class feature to make it only one line of code.
*/
data class Greeting (val id : Long, val content : String)
/**
* The @RestController annotation tells the Spring Environment to
* use this class to handle REST requests. That means that it will handle
* HTTP requests but does not use a view technology to write the response.
* Instead, an instance of Greeting is simply converted into JSON and written
* to the HTTP response body.
*/
@RestController
class GreetingController {
private val counter : AtomicLong = AtomicLong()
/**
* The @RequestMapping signals that this method will handle
* HTTP requests to /greeting. We can narrow it down to GET, POST, PUT, etc
* when we want different methods to handle different requests
* at this endpoint.
*
* The name parameter is annotated with @RequestParam which has
* two arguments. The name argument maps the request parameter name to
* the name argument in this method. The defaultValue will populate
* name with the value "World" if the request does not have a name argument.
*/
@RequestMapping("/greeting")
fun greeting(@RequestParam(value="name", defaultValue="World") name : String) : Greeting {
return Greeting(counter.incrementAndGet(), "Hello $name")
}
}
/**
* The @SpringBootApplication is a meta annotation that makes
* this application executable.
*/
@SpringBootApplication
open class Application
/**
* Now we just need an entry point to the program.
*/
fun main(args : Array){
SpringApplication.run(Application::class.java, *args)
}
Let’s break the code down into each piece.
Greeting
Greeting is a data class that has two fields, id and content. Kotlin introduced data classes to cut down on boilerplate code when using POJOs (Plain old java object). It will have all of the getters, equals, hashcode, and toString() as well as a constructor. This class will get converted into JSON and written to the response body later on in the application.
GreetingController
Spring works on a Model, View, Controller architecture so it uses Controller classes to map web requests to backend code. In this case, we are using @RestController to specify that we are not using a view technology to generate HTML and are instead going to write JSON to the HTML response body.
This class only has one method, greeting, which is annotated with @RequestMapping. You will use @RequestMapping to map HTTP requests to a method in the class. In our case, we are mapping all requests (GET, PUT, POST, DELETE) to /greeting to our greeting method. The greeting method has one argument, name, which is also annotated with @RequestParam.
The @RequestParam has two arguments, value which specifies the name of the argument in the request and the default value if the argument is not present in the request. In our case, we also called the request parameter name and we have it default to World. Inside of the method, we return a new instance of Greeting and then return it. The Spring environment will see to the details of converting it to JSON and writing it to the response.
Application
We also have an empty Application class that is marked with the @SpringBootApplication annotation. This is a meta-annotation that pulls in all of the annotations that are needed to make this program executable. We using it in the main function to start the program.
Finishing
After you start the application, you can point your browser to
http://localhost:8080/greeting and then http://localhost:8080/greeting?name=User to see the JSON output of this application.
Sources
https://spring.io/guides/gs/rest-service/
https://kotlinlang.org/docs/reference/
Source
The source code for this project is available on my github here: https://github.com/archer920/BuildingRESTfulWebService