Spring Boot - Kotlin

Overview

Github: https://github.com/gitorko/project03

Code

 1package com.demo.project03
 2
 3import com.demo.project03.domain.Customer
 4import com.demo.project03.repo.CustomerRepository
 5import org.slf4j.Logger
 6import org.slf4j.LoggerFactory
 7import org.springframework.boot.CommandLineRunner
 8import org.springframework.boot.autoconfigure.SpringBootApplication
 9import org.springframework.boot.runApplication
10import org.springframework.context.annotation.Bean
11
12@SpringBootApplication
13class Main {
14    private val log: Logger = LoggerFactory.getLogger(this::class.java)
15
16    @Bean
17    fun onStart(repo: CustomerRepository) = CommandLineRunner {
18        log.info("Seeding!")
19        val customer = Customer(0, "Jack", 35)
20        repo.save(customer)
21    }
22}
23
24fun main(args: Array<String>) {
25    runApplication<Main>(*args)
26}
 1package com.demo.project03.controller
 2
 3import com.demo.project03.domain.Customer
 4import com.demo.project03.repo.CustomerRepository
 5import org.slf4j.Logger
 6import org.slf4j.LoggerFactory
 7import org.springframework.beans.factory.annotation.Autowired
 8import org.springframework.web.bind.annotation.GetMapping
 9import org.springframework.web.bind.annotation.PostMapping
10import org.springframework.web.bind.annotation.RequestBody
11import org.springframework.web.bind.annotation.RestController
12
13@RestController
14class HomeController {
15
16    private val log: Logger = LoggerFactory.getLogger(this::class.java)
17
18    @Autowired
19    lateinit var repo: CustomerRepository
20
21    @GetMapping("/customer")
22    fun getCustomer(): MutableIterable<Customer> {
23        log.info("Getting customers!")
24        return repo.findAll()
25    }
26
27    @PostMapping("/customer")
28    fun save(@RequestBody customer: Customer): Customer {
29        return repo.save(customer)
30    }
31}
 1package com.demo.project03.domain
 2
 3import org.springframework.data.annotation.Id
 4import java.time.LocalDateTime
 5import javax.persistence.Entity
 6import javax.persistence.GeneratedValue
 7import javax.persistence.GenerationType
 8import javax.persistence.Table
 9
10@Entity
11@Table(name = "customer")
12data class Customer(
13        @javax.persistence.Id @Id
14        @GeneratedValue(strategy = GenerationType.IDENTITY)
15        val id: Long = 0,
16        val name: String,
17        val age: Int,
18        val createdAt: LocalDateTime = LocalDateTime.now(),
19)
1package com.demo.project03.repo
2
3import com.demo.project03.domain.Customer
4import org.springframework.data.jpa.repository.JpaRepository
5import org.springframework.stereotype.Repository
6
7@Repository
8interface CustomerRepository : JpaRepository<Customer, Long>

Postman

Import the postman collection to postman

Postman Collection

Setup

Project03

kotlin spring boot rest

https://github.com/gitorko/project03

Version

Check version

1$java --version
2openjdk 17.0.3 2022-04-19 LTS

Postgres DB

1docker run -p 5432:5432 --name pg-container -e POSTGRES_PASSWORD=password -d postgres:9.6.10
2docker ps
3docker exec -it pg-container psql -U postgres -W postgres
4CREATE USER test WITH PASSWORD 'test@123';
5CREATE DATABASE "test-db" WITH OWNER "test" ENCODING UTF8 TEMPLATE template0;
6grant all PRIVILEGES ON DATABASE "test-db" to test;
7
8docker stop pg-container
9docker start pg-container

Dev

To run the backend in dev mode.

1./gradlew clean build
2./gradlew bootRun

Prod

To run as a single jar, both UI and backend are bundled to single uber jar.

1./gradlew bootJar
2java -jar build/libs/project03-1.0.0.jar

References

https://kotlinlang.org/docs/jvm-spring-boot-restful.html

comments powered by Disqus