Skip to content

Real World Spring Boot Web Application Example with tons of ready to use features

Notifications You must be signed in to change notification settings

gtiwari333/spring-boot-web-application-sample

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

A Spring Boot Web Application Sample with tons of ready-to-use features. This can be used as starter for bigger projects.

Variations

App Architecture:

Foo

Included Features/Samples

MicroService:

  • Exposing and implementing Open Feign clients
  • Spring Cloud Contract (WIP)

Spring MVC:

  • Public and internal pages
  • MVC with thymeleaf templating
  • Live update of thymeleaf templates for local development
  • HTML fragments, reusable pagination component using Thymeleaf parameterized fragments
  • webjar - bootstrap4 + jquery
  • Custom Error page
  • Request logger filter
  • Swagger API Docs with UI ( http://localhost:8081/swagger-ui.html)
  • @RestControllerAdvice, @ControllerAdvice demo
  • CRUD UI + File upload/download
  • favicon handler

Security:

  • Account management with KeyCloak
  • Spring Security
  • User/User_Authority entity and repository/services
    • login, logout, home pages based on user role
  • Domain object Access security check on update/delete using custom PermissionEvaluator
  • private pages based on user roles
  • public home page -- view all notes by all
  • Limit max number of record in a paged request

Persistence/Search:

  • Data JPA with User/Authority/Note/ReceivedFile entities, example of EntityGraph
  • MySQL or any other SQL db can be configured for prod/docker etc profiles
  • (in old code) H2 db for local, Console enabled for local ( http://localhost:8081/h2-console/, db url: jdbc:h2:mem:testdb, username: sa)
  • jOOQ integration with code generation based on JPA entity
  • Liquibase database migration

Test:

  • Unit/integration with JUnit 5, Mockito and Spring Test
  • Tests with Spock Framework (Groovy 4, Spock 2)
  • e2e with Selenide, fixtures. default data generated using Spring
  • Load test with Gatling/Scala
  • Architecture tests using ArchUnit
  • file upload/download e2e test with Selenide
  • TestContainers to perform realistic integration test
  • Reset DB and Cache between test
  • Assert expected query count during integration test

Misc:

  • Code Generation: lombok, mapstruct
  • Message Queue using ActiveMQ Artemis
  • Approval/flagging api - message based
  • Nested comment
  • Cache implemented
  • Zipkin tracing
  • Websocket implemented to show article/comment review status/notifications..

Future: do more stuff

  • CQRS with event store/streaming
  • Spring Cloud Contract integration (WIP)
  • Docker-compose deploy/kubernetes
  • Visitors log - IP, browser, etc
  • Centralized error reporting
  • Geo-Spatial query for visitors
  • Grafana Dashboard, @Timed and more ...
  • logback LevelChangePropagator integration
  • logback error email
  • logback rolling policy
  • Integrate Markdown editor for writing notes
  • rate limit by IP on public API ( article api )
  • Fetch user's avatar
  • UI improvement
  • S3 file upload, test with localstack TestContainers
  • nested comment query/performance fix
  • Signup UI
  • vendor neutral security with OIDC
  • JfrUnit ( WIP )

Requirements

  • JDK 17+
  • Lombok configured on IDE
  • Maven
  • Docker
    • Make sure docker is started and running
    • Run $ sudo chmod 666 /var/run/docker.sock if you get error like this "Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running? (Details: [13] Permission denied)"

How to Run

It contains following applications:

  • main-app
  • email-service (optional)
  • report-service (optional)
  • trend-service (optional)
  • content-checker (optional)

Note you will need to create a database named 'seedapp' in your mysql server

Option 1 - run with manually started KeyCloak, ActiveMQ and MySQL servers

  • Run mvn clean install at root
  • Run docker-compose -f config/docker-compose.yml up at root to start docker containers
  • Go to main-app folder and run mvn to start the application

Option 2 - automatically start KeyCloak, ActiveMQ and MySQL using TestContainer while application is starting

  • Run mvn clean install at root
  • Go to main-app folder and run mvn -Pdev,withTestContainer to start the application

Option 3 - run from IDE

  • import into your IDE and compile the full project and run the Application.java on main-app module
  • Update run configuration to run maven goal wro4j:run Before Launch. It should be after 'Build'

Run Tests (use ./mvnw instead of mvn if you want to use maven wrapper)

It uses TestContainers, which requires Docker to be installed locally.

Running full tests

mvn clean verify

Running unit tests only (it uses maven surefire plugin)

mvn compiler:testCompile resources:testResources surefire:test

Running integration tests only (it uses maven-failsafe-plugin)

mvn compiler:testCompile resources:testResources failsafe:integration-test

Code Quality

The error-prone runs at compile time.
The modernizer checkstyle and spotbugs plugin are run as part of maven test-compile lifecycle phase. use `mvn spotbugs:gui' to
SonarQube scan

Run sonarqube server using docker docker run -e SONAR_ES_BOOTSTRAP_CHECKS_DISABLE=true -p 9000:9000 sonarqube:latest

Perform scan: mvn sonar:sonar mvn sonar:sonar -Dsonar.login=admin -Dsonar.password=admin

View Reports in SonarQube web ui:

  • visit http://localhost:9000
  • default login and password are admin, you will be asked to change password after logging in with default username/password
  • (optional) change sonarqube admin password without logging in: curl -u admin:admin -X POST "http://localhost:9000/api/users/change_password?login=admin&previousPassword=admin&password=NEW_PASSWORD"
  • if you change the password, make sure the update -Dsonar.password=admin when you run sonarqube next time

Dependency vulnerability scan

Owasp dependency check plugin is configured. Run mvn dependency-check:check to run scan and open dependency-check-report.html from target to see the report.

Run Tests Faster by using parallel maven build

mvn -T 5 clean package

Once the application starts, open http://localhost:8081 on your browser. The default username/passwords are listed on : gt.app.Application.initData, which are:

  • system/pass
  • user1/pass
  • user2/pass

Screenshots:

Public View

Read Article with nested comment/discussion

Logged in Feed View

Logged in User's Article List View

Admin User's Review Page to approve/disapprove flagged posts

Review Page

New Article

Dependency/plugin version checker

  • mvn versions:display-dependency-updates
  • mvn versions:display-plugin-updates