A Spring Boot REST API for an ecommerce delivery platform — manages users, user delivery addresses (with geospatial "nearby" search), products, and orders.
| Component | Choice |
|---|---|
| Language / Build | Java 21, Maven |
| Framework | Spring Boot 3.4.3 (Web, Data JPA, Security, DevTools) |
| Database | PostgreSQL + PostGIS (geospatial queries) |
| Schema management | Liquibase |
| Query building | QueryDSL (generates type-safe Q* classes) |
| Boilerplate | Lombok |
src/main/java/com/dwardel/
├── controller/ REST endpoints
├── service/ Business logic
├── repository/ Spring Data JPA repositories
├── model/ JPA entities
├── dto/ Data Transfer Objects returned to clients
src/main/resources/
├── application.properties App + DB configuration
├── liquibase.properties Used only for generating changelogs from an existing DB
└── db/ Liquibase changelogs (create-tables, insert-rows, data-dictionary)
Request flow: Controller → Service → Repository (JPA) → PostgreSQL
- JDK 21
- Maven 3.9+ (or use the included
./mvnwif present) - PostgreSQL 14+ with the PostGIS extension available
Create the database and enable PostGIS:
CREATE DATABASE ecommerce;
\c ecommerce
CREATE EXTENSION IF NOT EXISTS postgis;Update credentials in src/main/resources/application.properties if they differ from your local setup:
spring.datasource.url=jdbc:postgresql://localhost:5432/ecommerce
spring.datasource.username=postgres
spring.datasource.password=rootSchema and seed data are managed by Liquibase and applied automatically on application startup (spring.liquibase.enabled=true, changelog: db/data-dictionary.xml) — no manual migration step is required.
mvn clean installThis compiles the project and generates QueryDSL Q* classes (used for complex joins/criteria queries) into target/generated-sources.
mvn spring-boot:runOr run the packaged jar:
mvn clean package
java -jar target/delivery-0.0.1-SNAPSHOT.jarOn successful startup you'll see Spring Boot's banner followed by:
Started DeliveryApplication in x.xxx seconds
The app runs on http://localhost:8080 by default.
Spring Security is enabled with a single default in-memory user (configured in application.properties):
Username: admin
Password: admin123
Every endpoint requires HTTP Basic Auth with these credentials, e.g. add -u admin:admin123 to curl calls or configure Basic Auth in Postman.
curl -u admin:admin123 http://localhost:8080/Welcome to my Spring Boot application!
curl -u admin:admin123 http://localhost:8080/users[
{ "id": 1, "email": "john@example.com" }
]curl -u admin:admin123 http://localhost:8080/users/1curl -u admin:admin123 http://localhost:8080/users/1/addresscurl -u admin:admin123 -X POST http://localhost:8080/users \
-H "Content-Type: application/json" \
-d '{"email":"jane@example.com","password":"secret"}'{ "id": 2, "email": "jane@example.com" }curl -u admin:admin123 http://localhost:8080/api/products[
{ "id": 1, "name": "Wireless Mouse", "description": "Ergonomic mouse", "price": 19.99, "stockQuantity": 100 }
]curl -u admin:admin123 -X POST "http://localhost:8080/api/user-address/save?userId=1&address=221B%20Baker%20St&latitude=51.5237&longitude=-0.1585&placeId=abc123"Returns all addresses within radius meters of the given coordinates (uses PostGIS distance calculation).
curl -u admin:admin123 "http://localhost:8080/api/user-address/nearby?latitude=51.5237&longitude=-0.1585&radius=5000"curl -u admin:admin123 http://localhost:8080/api/user-addressmvn testspring.jpa.hibernate.ddl-auto=none— schema changes are managed exclusively through Liquibase, not Hibernate auto-DDL.spring.jpa.show-sql=trueand debug-level Hibernate logging are enabled by default for local development; disable them for production.liquibase.properties(and themvn liquibase:generateChangeLog ...command in it) is only used to generate a changelog by diffing against an existing database — it is not needed for normal startup.- HikariCP connection pool is tuned via
spring.datasource.hikari.*properties inapplication.properties.