How sartrebrasil/poc-multi-module-arch-hexagonal-springboot works
This is a Spring Boot, multi-module Java proof of concept for a hexagonal person-management API. A client submits person CRUD or paginated-search requests; the controller maps HTTP data to domain objects and calls the service, which delegates persistence through a database port to a MySQL adapter. The README also documents Kafka producer/consumer modules and an observability stack. Those optional integrations are represented, but their runtime wiring is not established by the sampled excerpts; configuration and edge limits are noted rather than inferred.
Main entry points: PersonController.java Person REST API · PersonMySQLAdapter.java MySQL adapter · PersonServicePortImpl.java Person service · AppBeansConfig.java Bean wiring
Components 24
API and startup
- Application launcher
ms-launcher/src/main/java/io/github/wesleyosantos91/Application.java - Bean wiring
ms-launcher/src/main/java/io/github/wesleyosantos91/configuration/AppBeansConfig.java - Person REST API
application/src/main/java/io/github/wesleyosantos91/api/v1/controller/PersonController.java - HTTP mapper
application/src/main/java/io/github/wesleyosantos91/api/v1/mapper/PersonHttpMapper.java - API requests
application/src/main/java/io/github/wesleyosantos91/api/v1/request/PersonRequest.java - Search request
application/src/main/java/io/github/wesleyosantos91/api/v1/request/PersonQueryRequest.java - API response
application/src/main/java/io/github/wesleyosantos91/api/v1/response/PersonResponse.java - Exception handler
application/src/main/java/io/github/wesleyosantos91/api/exception/GlobalDefaultExceptionHandler.java
Domain core
- Person service
domain/src/main/java/io/github/wesleyosantos91/core/service/PersonServicePortImpl.java - Service port
domain/src/main/java/io/github/wesleyosantos91/ports/api/PersonServicePort.java - Person domain
domain/src/main/java/io/github/wesleyosantos91/core/domain/PersonDomain.java - Database port
domain/src/main/java/io/github/wesleyosantos91/ports/spi/PersonDatabasePort.java - Domain exceptions
domain/src/main/java/io/github/wesleyosantos91/core/exception/ResourceNotFoundException.java
MySQL persistence
- MySQL adapter
infrastructure/datastore-mysql/src/main/java/io/github/wesleyosantos91/adapter/PersonMySQLAdapter.java - Persistence mapper
infrastructure/datastore-mysql/src/main/java/io/github/wesleyosantos91/mapper/PersonMapper.java - Person repository
infrastructure/datastore-mysql/src/main/java/io/github/wesleyosantos91/repository/PersonRepository.java - Person entity
infrastructure/datastore-mysql/src/main/java/io/github/wesleyosantos91/entity/PersonEntity.java - MySQL database
Messaging and observability
- Kafka producer
infrastructure/kafka-producer/src/main/java/io/github/wesleyosantos91/kafka/KafkaPersonProducer.java - Kafka consumer
infrastructure/kafka-consumer/src/main/java/io/github/wesleyosantos91/kafka/KafkaPersonConsumer.java - Kafka broker
- Observability stack
config - Jaeger configuration
ms-launcher/src/main/java/io/github/wesleyosantos91/configuration/JaegerConfig.java
Other components
- API client
Connections 23
- API client → Person REST API: sends requests
application/src/main/java/io/github/wesleyosantos91/api/v1/controller/PersonController.java - Application launcher → Bean wiring: boots with
- Bean wiring → Person service: registers
ms-launcher/src/main/java/io/github/wesleyosantos91/configuration/AppBeansConfig.java - Bean wiring → MySQL adapter: registers
ms-launcher/src/main/java/io/github/wesleyosantos91/configuration/AppBeansConfig.java - Person REST API → Service port: calls
application/src/main/java/io/github/wesleyosantos91/api/v1/controller/PersonController.java - Person REST API → HTTP mapper: maps data
application/src/main/java/io/github/wesleyosantos91/api/v1/controller/PersonController.java - HTTP mapper → Person domain: maps to
application/src/main/java/io/github/wesleyosantos91/api/v1/mapper/PersonHttpMapper.java - Person REST API → API requests: accepts
application/src/main/java/io/github/wesleyosantos91/api/v1/controller/PersonController.java - Person REST API → Search request: accepts
application/src/main/java/io/github/wesleyosantos91/api/v1/controller/PersonController.java - Person REST API → API response: returns
application/src/main/java/io/github/wesleyosantos91/api/v1/controller/PersonController.java - Service port → Person service: implemented by
domain/src/main/java/io/github/wesleyosantos91/core/service/PersonServicePortImpl.java - Person service → Database port: delegates
domain/src/main/java/io/github/wesleyosantos91/core/service/PersonServicePortImpl.java - Person service → Domain exceptions: raises
domain/src/main/java/io/github/wesleyosantos91/core/service/PersonServicePortImpl.java - MySQL adapter → Database port: implements
infrastructure/datastore-mysql/src/main/java/io/github/wesleyosantos91/adapter/PersonMySQLAdapter.java - MySQL adapter → Person repository: queries
infrastructure/datastore-mysql/src/main/java/io/github/wesleyosantos91/adapter/PersonMySQLAdapter.java - MySQL adapter → Persistence mapper: maps data
infrastructure/datastore-mysql/src/main/java/io/github/wesleyosantos91/adapter/PersonMySQLAdapter.java - Persistence mapper → Person entity: maps to
infrastructure/datastore-mysql/src/main/java/io/github/wesleyosantos91/mapper/PersonMapper.java - Person repository → Person entity: persists
infrastructure/datastore-mysql/src/main/java/io/github/wesleyosantos91/repository/PersonRepository.java - MySQL adapter → MySQL database: reads and writes
- Exception handler → Domain exceptions: handles
application/src/main/java/io/github/wesleyosantos91/api/exception/GlobalDefaultExceptionHandler.java - Kafka producer → Kafka broker: publishes
- Kafka broker → Kafka consumer: delivers messages
- Jaeger configuration → Observability stack: configures tracing