Skip to content

kenfj/todoapp-spring

Repository files navigation

Spring Boot REST API Demo Todo App

Features

  • Java 17
  • Spring Boot 3
  • Spring Web REST API
  • Java record DTO
  • HTTP PATCH using Java record
  • Spring Data JDBC ListCrudRepository
  • Spring Data JDBC custom SQL query
  • Spring Data JDBC ListQueryByExampleExecutor
  • Spring Data JDBC pagination, sort and filter
  • Spring Data JDBC Event Listener to log to history table
  • Flyway DB migration
  • h2 MODE=MySQL file DB for dev and in-memory DB for test
  • RFC7807 ProblemDetail RestControllerAdvice using ResponseEntityExceptionHandler
  • RFC7807 ProblemDetail i18n custom message in messages.properties
  • HTTP Client using @HttpExchange
  • Custom properties in application.properties
  • unit tests with coverage report

Maven Packages in pom.xml

  • org.springframework.boot
    • spring-boot-starter-web
    • spring-boot-starter-webflux
    • spring-boot-starter-validation
    • spring-boot-starter-data-jdbc
    • spring-boot-devtools
    • spring-boot-starter-test
    • spring-boot-starter-security
    • spring-boot-configuration-processor
  • com.h2database
  • org.flywaydb
  • org.springdoc

Quick Start

java -version
# openjdk version "17.0.8.1" 2023-08-22 LTS

mvn --version
# Apache Maven 3.9.4

mvn spring-boot:run

curl http://localhost:8080/todos

Spring Initializr

https://start.spring.io/

  • Spring Web
  • Spring Data JDBC
  • H2 Database
  • Flyway Migration
  • Spring Boot DevTools

Setup JDK Maven

# MacOS .zshrc sample
export JAVA_HOME=`/usr/libexec/java_home -v 17`
export PATH=${JAVA_HOME}/bin:${PATH}
export PATH=~/Downloads/apache-maven-3.9.4/bin:${PATH}

Test

mvn clean test site

python -m http.server --directory ./target/site/
# unit tests report at http://localhost:8000/

python -m http.server --directory ./target/site/jacoco/ 3000
# coverage report at http://localhost:3000/

# verify if the coverage is above the minimum for CI
mvn clean verify

DB Migration

  • Note: 3 type of DB initialization
    • schema version: Flyway V files
    • reference data: Flyway R file
    • dev mock data: Spring built-in data.sql
      • test specific data: @Sql annotation
  • in Dev: auto migration when server started
  • in Prod: manual migration by Flyway plugin
export FLYWAY_URL="jdbc:h2:file:./target/demodb;MODE=MySQL;AUTO_SERVER=TRUE"
export FLYWAY_USER=sa
export FLYWAY_PASSWORD=

mvn flyway:info
mvn flyway:migrate
mvn flyway:validate

Upgrade Maven Packages

# display dependency updates
mvn versions:display-dependency-updates

# display plugin updates
mvn versions:display-plugin-updates

# update pom.xml as suggested
# c.f. VSCode Redhat Dependency Analytics extension

# show dependency-tree
mvn dependency:tree
mvn dependency:tree -Dincludes=org.slf4j:slf4j-api

# find unused dependencies
mvn dependency:analyze

# upgrade to release (latest stable non-SNAPSHOT)
mvn versions:use-latest-releases
# upgrade to newest possible (includes unstable SNAPSHOT)
mvn versions:use-latest-versions

Reference

About

sample todo app spring boot backend

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published