# in28minutes/spring-web-services architecture

> Architecture diagram of the GitHub repository in28minutes/spring-web-services, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-09-30). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/in28minutes/spring-web-services
- Repository: https://github.com/in28minutes/spring-web-services

## Overview

This repository is a set of Spring learning applications; its documented product focus is REST and SOAP services, with smaller Spring, Spring Boot, and JPA examples alongside them. The main user workflow is a client request routed to a REST resource or SOAP endpoint, then handled and returned as a response; REST also demonstrates versioning, filtering, exception handling, security, and JPA-backed resources. Source excerpts and the index confirm selected model/repository relationships, but do not expose all runtime wiring, so uncertain links are omitted.

Main entry points: [`restful-web-services-v2/src/main/java/com/in28minutes/rest/webservices/restfulwebservices/user`](https://github.com/in28minutes/spring-web-services/tree/master/restful-web-services-v2/src/main/java/com/in28minutes/rest/webservices/restfulwebservices/user) (REST resources), [`soap-web-services/src/main/java/com/in28minutes/soap/webservices/soapcoursemanagement/soap/CourseDetailsEndpoint.java`](https://github.com/in28minutes/spring-web-services/blob/master/soap-web-services/src/main/java/com/in28minutes/soap/webservices/soapcoursemanagement/soap/CourseDetailsEndpoint.java) (Course SOAP endpoint), [`restful-web-services-v2/src/main/java/com/in28minutes/rest/webservices/restfulwebservices/user/User.java`](https://github.com/in28minutes/spring-web-services/blob/master/restful-web-services-v2/src/main/java/com/in28minutes/rest/webservices/restfulwebservices/user/User.java) (User and posts), [`jpa-in-10-steps/src/main/java/com/in28minutes/springboot/learnjpaandhibernate/course/Course.java`](https://github.com/in28minutes/spring-web-services/blob/master/jpa-in-10-steps/src/main/java/com/in28minutes/springboot/learnjpaandhibernate/course/Course.java) (Course entity)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_rest["REST services"]
  node_rest_api["REST resources"]
  node_hello["Hello endpoints"]
  node_versioning["API versioning"]
  node_filtering["Response filtering"]
  node_user_model["User and posts<br/>[User.java]"]
  node_user_store["User JPA repository"]
  node_post_store["Post JPA repository"]
  node_memory_users[("In-memory users")]
  node_error_handling["Error handling"]
  node_security["REST security"]
end

subgraph group_soap["SOAP services"]
  node_soap_endpoint["Course SOAP endpoint"]
  node_soap_contract["SOAP contract types<br/>[CourseDetails.java]"]
  node_soap_service["Course service"]
  node_soap_model["Course model<br/>[Course.java]"]
  node_soap_config["SOAP configuration"]
end

subgraph group_learning["Spring learning examples"]
  node_jpa_entity["Course entity<br/>[Course.java]"]
  node_jpa_repository["Course JPA repository"]
  node_jdbc_repository["Course JDBC repository"]
  node_springdata_repository["Spring Data repository"]
  node_game_runner["Game runner<br/>[GameRunner.java]"]
  node_game_console["Gaming console API<br/>[GamingConsole.java]"]
  node_game_implementations["Game implementations<br/>[PacmanGame.java]"]
  node_currency_config["Currency configuration"]
  node_currency_endpoint["Configuration endpoint"]
end

node_client(("Service client"))
node_soap_client(("SOAP client"))

node_client -.->|"requests resources"| node_rest_api
node_client -.->|"calls endpoints"| node_hello
node_client -->|"selects version"| node_versioning
node_client -->|"requests filtered data"| node_filtering
node_rest_api -.->|"uses in-memory data"| node_memory_users
node_rest_api -.->|"uses persistence"| node_user_store
node_rest_api -.->|"exposes user data"| node_user_model
node_user_store -->|"maps entity"| node_user_model
node_post_store -->|"maps post entity"| node_user_model
node_soap_client -.->|"sends SOAP request"| node_soap_endpoint
node_soap_endpoint -.->|"delegates course work"| node_soap_service
node_soap_service -->|"stores course records"| node_soap_model
node_soap_config -.->|"configures endpoint"| node_soap_endpoint
node_game_runner -->|"invokes controls"| node_game_console
node_game_implementations -->|"implements interface"| node_game_console
node_currency_endpoint -->|"returns configuration"| node_currency_config
node_jpa_repository -->|"persists entity"| node_jpa_entity
node_jdbc_repository -->|"maps course"| node_jpa_entity
node_springdata_repository -->|"manages entity"| node_jpa_entity

click node_rest_api "https://github.com/in28minutes/spring-web-services/tree/master/restful-web-services-v2/src/main/java/com/in28minutes/rest/webservices/restfulwebservices/user"
click node_hello "https://github.com/in28minutes/spring-web-services/blob/master/restful-web-services-v2/src/main/java/com/in28minutes/rest/webservices/restfulwebservices/helloworld/HelloWorldController.java"
click node_versioning "https://github.com/in28minutes/spring-web-services/blob/master/restful-web-services-v2/src/main/java/com/in28minutes/rest/webservices/restfulwebservices/versioning/VersioningPersonController.java"
click node_filtering "https://github.com/in28minutes/spring-web-services/blob/master/restful-web-services-v2/src/main/java/com/in28minutes/rest/webservices/restfulwebservices/filtering/FilteringController.java"
click node_user_model "https://github.com/in28minutes/spring-web-services/blob/master/restful-web-services-v2/src/main/java/com/in28minutes/rest/webservices/restfulwebservices/user/User.java"
click node_user_store "https://github.com/in28minutes/spring-web-services/blob/master/restful-web-services-v2/src/main/java/com/in28minutes/rest/webservices/restfulwebservices/jpa/UserRepository.java"
click node_post_store "https://github.com/in28minutes/spring-web-services/blob/master/restful-web-services-v2/src/main/java/com/in28minutes/rest/webservices/restfulwebservices/jpa/PostRepository.java"
click node_memory_users "https://github.com/in28minutes/spring-web-services/blob/master/restful-web-services-v2/src/main/java/com/in28minutes/rest/webservices/restfulwebservices/user/UserDaoService.java"
click node_error_handling "https://github.com/in28minutes/spring-web-services/blob/master/restful-web-services-v2/src/main/java/com/in28minutes/rest/webservices/restfulwebservices/exception/CustomizedResponseEntityExceptionHandler.java"
click node_security "https://github.com/in28minutes/spring-web-services/blob/master/restful-web-services-v2/src/main/java/com/in28minutes/rest/webservices/restfulwebservices/security/SpringSecurityConfiguration.java"
click node_soap_endpoint "https://github.com/in28minutes/spring-web-services/blob/master/soap-web-services/src/main/java/com/in28minutes/soap/webservices/soapcoursemanagement/soap/CourseDetailsEndpoint.java"
click node_soap_contract "https://github.com/in28minutes/spring-web-services/blob/master/soap-web-services/src/main/java/com/in28minutes/courses/CourseDetails.java"
click node_soap_service "https://github.com/in28minutes/spring-web-services/blob/master/soap-web-services/src/main/java/com/in28minutes/soap/webservices/soapcoursemanagement/soap/service/CourseDetailsService.java"
click node_soap_model "https://github.com/in28minutes/spring-web-services/blob/master/soap-web-services/src/main/java/com/in28minutes/soap/webservices/soapcoursemanagement/soap/bean/Course.java"
click node_soap_config "https://github.com/in28minutes/spring-web-services/blob/master/soap-web-services/src/main/java/com/in28minutes/soap/webservices/soapcoursemanagement/soap/WebServiceConfig.java"
click node_jpa_entity "https://github.com/in28minutes/spring-web-services/blob/master/jpa-in-10-steps/src/main/java/com/in28minutes/springboot/learnjpaandhibernate/course/Course.java"
click node_jpa_repository "https://github.com/in28minutes/spring-web-services/blob/master/jpa-in-10-steps/src/main/java/com/in28minutes/springboot/learnjpaandhibernate/course/jpa/CourseJpaRepository.java"
click node_jdbc_repository "https://github.com/in28minutes/spring-web-services/blob/master/jpa-in-10-steps/src/main/java/com/in28minutes/springboot/learnjpaandhibernate/course/jdbc/CourseJdbcRepository.java"
click node_springdata_repository "https://github.com/in28minutes/spring-web-services/blob/master/jpa-in-10-steps/src/main/java/com/in28minutes/springboot/learnjpaandhibernate/course/springdatajpa/CourseSpringDataJpaRepository.java"
click node_game_runner "https://github.com/in28minutes/spring-web-services/blob/master/spring-in-10-steps/src/main/java/com/in28minutes/spring/learnspringframework/game/GameRunner.java"
click node_game_console "https://github.com/in28minutes/spring-web-services/blob/master/spring-in-10-steps/src/main/java/com/in28minutes/spring/learnspringframework/game/GamingConsole.java"
click node_game_implementations "https://github.com/in28minutes/spring-web-services/blob/master/spring-in-10-steps/src/main/java/com/in28minutes/spring/learnspringframework/game/PacmanGame.java"
click node_currency_config "https://github.com/in28minutes/spring-web-services/blob/master/springboot-in-10-steps/src/main/java/com/in28minutes/springboot/learnspringboot/CurrencyServiceConfiguration.java"
click node_currency_endpoint "https://github.com/in28minutes/spring-web-services/blob/master/springboot-in-10-steps/src/main/java/com/in28minutes/springboot/learnspringboot/CurrencyConfigurationController.java"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_rest_api,node_hello,node_versioning,node_filtering,node_user_model,node_user_store,node_post_store,node_memory_users,node_error_handling,node_security,node_client,node_soap_client toneBlue
class node_soap_endpoint,node_soap_contract,node_soap_service,node_soap_model,node_soap_config toneAmber
class node_jpa_entity,node_jpa_repository,node_jdbc_repository,node_springdata_repository,node_game_runner,node_game_console,node_game_implementations,node_currency_config,node_currency_endpoint toneMint
```

## Components

### REST services

- [REST resources](https://github.com/in28minutes/spring-web-services/tree/master/restful-web-services-v2/src/main/java/com/in28minutes/rest/webservices/restfulwebservices/user): `restful-web-services-v2/src/main/java/com/in28minutes/rest/webservices/restfulwebservices/user`
- [Hello endpoints](https://github.com/in28minutes/spring-web-services/blob/master/restful-web-services-v2/src/main/java/com/in28minutes/rest/webservices/restfulwebservices/helloworld/HelloWorldController.java): `restful-web-services-v2/src/main/java/com/in28minutes/rest/webservices/restfulwebservices/helloworld/HelloWorldController.java`
- [API versioning](https://github.com/in28minutes/spring-web-services/blob/master/restful-web-services-v2/src/main/java/com/in28minutes/rest/webservices/restfulwebservices/versioning/VersioningPersonController.java): `restful-web-services-v2/src/main/java/com/in28minutes/rest/webservices/restfulwebservices/versioning/VersioningPersonController.java`
- [Response filtering](https://github.com/in28minutes/spring-web-services/blob/master/restful-web-services-v2/src/main/java/com/in28minutes/rest/webservices/restfulwebservices/filtering/FilteringController.java): `restful-web-services-v2/src/main/java/com/in28minutes/rest/webservices/restfulwebservices/filtering/FilteringController.java`
- [User and posts](https://github.com/in28minutes/spring-web-services/blob/master/restful-web-services-v2/src/main/java/com/in28minutes/rest/webservices/restfulwebservices/user/User.java): `restful-web-services-v2/src/main/java/com/in28minutes/rest/webservices/restfulwebservices/user/User.java`
- [User JPA repository](https://github.com/in28minutes/spring-web-services/blob/master/restful-web-services-v2/src/main/java/com/in28minutes/rest/webservices/restfulwebservices/jpa/UserRepository.java): `restful-web-services-v2/src/main/java/com/in28minutes/rest/webservices/restfulwebservices/jpa/UserRepository.java`
- [Post JPA repository](https://github.com/in28minutes/spring-web-services/blob/master/restful-web-services-v2/src/main/java/com/in28minutes/rest/webservices/restfulwebservices/jpa/PostRepository.java): `restful-web-services-v2/src/main/java/com/in28minutes/rest/webservices/restfulwebservices/jpa/PostRepository.java`
- [In-memory users](https://github.com/in28minutes/spring-web-services/blob/master/restful-web-services-v2/src/main/java/com/in28minutes/rest/webservices/restfulwebservices/user/UserDaoService.java): `restful-web-services-v2/src/main/java/com/in28minutes/rest/webservices/restfulwebservices/user/UserDaoService.java`
- [Error handling](https://github.com/in28minutes/spring-web-services/blob/master/restful-web-services-v2/src/main/java/com/in28minutes/rest/webservices/restfulwebservices/exception/CustomizedResponseEntityExceptionHandler.java): `restful-web-services-v2/src/main/java/com/in28minutes/rest/webservices/restfulwebservices/exception/CustomizedResponseEntityExceptionHandler.java`
- [REST security](https://github.com/in28minutes/spring-web-services/blob/master/restful-web-services-v2/src/main/java/com/in28minutes/rest/webservices/restfulwebservices/security/SpringSecurityConfiguration.java): `restful-web-services-v2/src/main/java/com/in28minutes/rest/webservices/restfulwebservices/security/SpringSecurityConfiguration.java`

### SOAP services

- [Course SOAP endpoint](https://github.com/in28minutes/spring-web-services/blob/master/soap-web-services/src/main/java/com/in28minutes/soap/webservices/soapcoursemanagement/soap/CourseDetailsEndpoint.java): `soap-web-services/src/main/java/com/in28minutes/soap/webservices/soapcoursemanagement/soap/CourseDetailsEndpoint.java`
- [SOAP contract types](https://github.com/in28minutes/spring-web-services/blob/master/soap-web-services/src/main/java/com/in28minutes/courses/CourseDetails.java): `soap-web-services/src/main/java/com/in28minutes/courses/CourseDetails.java`
- [Course service](https://github.com/in28minutes/spring-web-services/blob/master/soap-web-services/src/main/java/com/in28minutes/soap/webservices/soapcoursemanagement/soap/service/CourseDetailsService.java): `soap-web-services/src/main/java/com/in28minutes/soap/webservices/soapcoursemanagement/soap/service/CourseDetailsService.java`
- [Course model](https://github.com/in28minutes/spring-web-services/blob/master/soap-web-services/src/main/java/com/in28minutes/soap/webservices/soapcoursemanagement/soap/bean/Course.java): `soap-web-services/src/main/java/com/in28minutes/soap/webservices/soapcoursemanagement/soap/bean/Course.java`
- [SOAP configuration](https://github.com/in28minutes/spring-web-services/blob/master/soap-web-services/src/main/java/com/in28minutes/soap/webservices/soapcoursemanagement/soap/WebServiceConfig.java): `soap-web-services/src/main/java/com/in28minutes/soap/webservices/soapcoursemanagement/soap/WebServiceConfig.java`

### Spring learning examples

- [Course entity](https://github.com/in28minutes/spring-web-services/blob/master/jpa-in-10-steps/src/main/java/com/in28minutes/springboot/learnjpaandhibernate/course/Course.java): `jpa-in-10-steps/src/main/java/com/in28minutes/springboot/learnjpaandhibernate/course/Course.java`
- [Course JPA repository](https://github.com/in28minutes/spring-web-services/blob/master/jpa-in-10-steps/src/main/java/com/in28minutes/springboot/learnjpaandhibernate/course/jpa/CourseJpaRepository.java): `jpa-in-10-steps/src/main/java/com/in28minutes/springboot/learnjpaandhibernate/course/jpa/CourseJpaRepository.java`
- [Course JDBC repository](https://github.com/in28minutes/spring-web-services/blob/master/jpa-in-10-steps/src/main/java/com/in28minutes/springboot/learnjpaandhibernate/course/jdbc/CourseJdbcRepository.java): `jpa-in-10-steps/src/main/java/com/in28minutes/springboot/learnjpaandhibernate/course/jdbc/CourseJdbcRepository.java`
- [Spring Data repository](https://github.com/in28minutes/spring-web-services/blob/master/jpa-in-10-steps/src/main/java/com/in28minutes/springboot/learnjpaandhibernate/course/springdatajpa/CourseSpringDataJpaRepository.java): `jpa-in-10-steps/src/main/java/com/in28minutes/springboot/learnjpaandhibernate/course/springdatajpa/CourseSpringDataJpaRepository.java`
- [Game runner](https://github.com/in28minutes/spring-web-services/blob/master/spring-in-10-steps/src/main/java/com/in28minutes/spring/learnspringframework/game/GameRunner.java): `spring-in-10-steps/src/main/java/com/in28minutes/spring/learnspringframework/game/GameRunner.java`
- [Gaming console API](https://github.com/in28minutes/spring-web-services/blob/master/spring-in-10-steps/src/main/java/com/in28minutes/spring/learnspringframework/game/GamingConsole.java): `spring-in-10-steps/src/main/java/com/in28minutes/spring/learnspringframework/game/GamingConsole.java`
- [Game implementations](https://github.com/in28minutes/spring-web-services/blob/master/spring-in-10-steps/src/main/java/com/in28minutes/spring/learnspringframework/game/PacmanGame.java): `spring-in-10-steps/src/main/java/com/in28minutes/spring/learnspringframework/game/PacmanGame.java`
- [Currency configuration](https://github.com/in28minutes/spring-web-services/blob/master/springboot-in-10-steps/src/main/java/com/in28minutes/springboot/learnspringboot/CurrencyServiceConfiguration.java): `springboot-in-10-steps/src/main/java/com/in28minutes/springboot/learnspringboot/CurrencyServiceConfiguration.java`
- [Configuration endpoint](https://github.com/in28minutes/spring-web-services/blob/master/springboot-in-10-steps/src/main/java/com/in28minutes/springboot/learnspringboot/CurrencyConfigurationController.java): `springboot-in-10-steps/src/main/java/com/in28minutes/springboot/learnspringboot/CurrencyConfigurationController.java`

### Other components

- **Service client**
- **SOAP client**

## Connections

- Service client → REST resources: requests resources
- Service client → Hello endpoints: calls endpoints
- Service client → API versioning: selects version (evidence: `restful-web-services-v2/src/main/java/com/in28minutes/rest/webservices/restfulwebservices/versioning/VersioningPersonController.java`)
- Service client → Response filtering: requests filtered data (evidence: `restful-web-services-v2/src/main/java/com/in28minutes/rest/webservices/restfulwebservices/filtering/FilteringController.java`)
- REST resources → In-memory users: uses in-memory data (evidence: `restful-web-services-v2/src/main/java/com/in28minutes/rest/webservices/restfulwebservices/user/UserDaoService.java`)
- REST resources → User JPA repository: uses persistence (evidence: `restful-web-services-v2/src/main/java/com/in28minutes/rest/webservices/restfulwebservices/jpa/UserRepository.java`)
- REST resources → User and posts: exposes user data (evidence: `restful-web-services-v2/src/main/java/com/in28minutes/rest/webservices/restfulwebservices/user/UserDaoService.java`)
- User JPA repository → User and posts: maps entity (evidence: `restful-web-services-v2/src/main/java/com/in28minutes/rest/webservices/restfulwebservices/jpa/UserRepository.java`)
- Post JPA repository → User and posts: maps post entity (evidence: `restful-web-services-v2/src/main/java/com/in28minutes/rest/webservices/restfulwebservices/jpa/PostRepository.java`)
- SOAP client → Course SOAP endpoint: sends SOAP request
- Course SOAP endpoint → Course service: delegates course work
- Course service → Course model: stores course records (evidence: `soap-web-services/src/main/java/com/in28minutes/soap/webservices/soapcoursemanagement/soap/service/CourseDetailsService.java`)
- SOAP configuration → Course SOAP endpoint: configures endpoint
- Game runner → Gaming console API: invokes controls (evidence: `spring-in-10-steps/src/main/java/com/in28minutes/spring/learnspringframework/game/GameRunner.java`)
- Game implementations → Gaming console API: implements interface (evidence: `spring-in-10-steps/src/main/java/com/in28minutes/spring/learnspringframework/game/PacmanGame.java`)
- Configuration endpoint → Currency configuration: returns configuration (evidence: `springboot-in-10-steps/src/main/java/com/in28minutes/springboot/learnspringboot/CurrencyConfigurationController.java`)
- Course JPA repository → Course entity: persists entity (evidence: `jpa-in-10-steps/src/main/java/com/in28minutes/springboot/learnjpaandhibernate/course/jpa/CourseJpaRepository.java`)
- Course JDBC repository → Course entity: maps course (evidence: `jpa-in-10-steps/src/main/java/com/in28minutes/springboot/learnjpaandhibernate/course/jdbc/CourseJdbcRepository.java`)
- Spring Data repository → Course entity: manages entity (evidence: `jpa-in-10-steps/src/main/java/com/in28minutes/springboot/learnjpaandhibernate/course/springdatajpa/CourseSpringDataJpaRepository.java`)
