interdimensional-service is a Spring Boot microservice that wraps the Rick and Morty API using Hexagonal Architecture and CQRS (Query side).
The service goes beyond a simple proxy:
- It introduces MongoDB-based read cache for Characters, Episodes and Locations.
- External API calls are only made on cache miss.
- Retrieved data is persisted in MongoDB for future queries.
If it looks overengineered for Rick & Mortyโฆ
Yes. That is entirely intentional.
The project follows Hexagonal Architecture (Ports & Adapters) + CQRS (Query side).
Pure business models, framework-agnostic.
CharacterEpisodeLocation
No Spring, no persistence annotations.
Contains use cases and orchestration logic.
CharacterQueryPortEpisodeQueryPortLocationQueryPortGetHealthQueryPort
- External API access:
LoadCharacterPortLoadEpisodePortLoadLocationPort
- Mongo cache access:
LoadCharacterCachePortLoadEpisodeCachePortLoadLocationCachePort
CharacterQueryServiceEpisodeQueryServiceLocationQueryServiceGetHealthQueryService
Responsibilities:
- Validate inputs
- Normalize pagination
- Query Mongo cache first
- Fallback to external API
- Persist results in Mongo
- Throw explicit domain-level exceptions
CharacterNotFoundExceptionEpisodeNotFoundExceptionLocationNotFoundException
All technical details live here.
- Controllers:
CharacterControllerEpisodeControllerLocationControllerHealthController
- DTOs:
CharacterResponseDtoEpisodeResponseDtoLocationResponseDto
- Error handling:
RestExceptionHandlerErrorResponse
CharacterApiAdapterEpisodeApiAdapterLocationApiAdapter
Uses WebClient to consume the Rick & Morty API.
- Documents:
CharacterDocumentEpisodeDocumentLocationDocument
- Repositories:
CharacterMongoRepositoryEpisodeMongoRepositoryLocationMongoRepository
- Adapters:
CharacterMongoAdapterEpisodeMongoAdapterLocationMongoAdapter
Mongo acts as a read-through cache:
- Query Mongo
- If not found โ query external API
- Persist result in Mongo
- Return domain model
โโโโmain
โ โโโโjava
โ โ โโโโcom
โ โ โโโโinterdimensional
โ โ โ InterdimensionalServiceApplication.java
โ โ โ
โ โ โโโโapplication
โ โ โ โโโโcommand
โ โ โ โโโโquery
โ โ โ โโโโexception
โ โ โ โ CharacterNotFoundException.java
โ โ โ โ EpisodeNotFoundException.java
โ โ โ โ LocationNotFoundException.java
โ โ โ โ
โ โ โ โโโโports
โ โ โ โ โโโโcharacter
โ โ โ โ โ CharacterQueryPort.java
โ โ โ โ โ LoadCharacterCachePort.java
โ โ โ โ โ LoadCharacterPort.java
โ โ โ โ โ
โ โ โ โ โโโโepisode
โ โ โ โ โ EpisodeQueryPort.java
โ โ โ โ โ LoadEpisodeCachePort.java
โ โ โ โ โ LoadEpisodePort.java
โ โ โ โ โ
โ โ โ โ โโโโhealth
โ โ โ โ โ GetHealthQueryPort.java
โ โ โ โ โ
โ โ โ โ โโโโlocation
โ โ โ โ LoadLocationCachePort.java
โ โ โ โ LoadLocationPort.java
โ โ โ โ LocationQueryPort.java
โ โ โ โ
โ โ โ โโโโservice
โ โ โ CharacterQueryService.java
โ โ โ EpisodeQueryService.java
โ โ โ GetHealthQueryService.java
โ โ โ LocationQueryService.java
โ โ โ
โ โ โโโโdomain
โ โ โ โโโโcharacter
โ โ โ โ Character.java
โ โ โ โ
โ โ โ โโโโepisode
โ โ โ โ Episode.java
โ โ โ โ
โ โ โ โโโโlocation
โ โ โ Location.java
โ โ โ
โ โ โโโโinfrastructure
โ โ โโโโadapters
โ โ โ โโโโin
โ โ โ โ โโโโrest
โ โ โ โ โ HealthController.java
โ โ โ โ โ
โ โ โ โ โโโโcharacter
โ โ โ โ โ CharacterController.java
โ โ โ โ โ CharacterResponseDto.java
โ โ โ โ โ
โ โ โ โ โโโโepisode
โ โ โ โ โ EpisodeController.java
โ โ โ โ โ EpisodeResponseDto.java
โ โ โ โ โ
โ โ โ โ โโโโerror
โ โ โ โ โ ErrorResponse.java
โ โ โ โ โ RestExceptionHandler.java
โ โ โ โ โ
โ โ โ โ โโโโlocation
โ โ โ โ LocationController.java
โ โ โ โ LocationResponseDto.java
โ โ โ โ
โ โ โ โโโโout
โ โ โ โโโโevents
โ โ โ โโโโhttp
โ โ โ โ โโโโcharacter
โ โ โ โ โ CharacterApiAdapter.java
โ โ โ โ โ CharacterPageResponse.java
โ โ โ โ โ CharacterResponse.java
โ โ โ โ โ
โ โ โ โ โโโโepisode
โ โ โ โ โ EpisodeApiAdapter.java
โ โ โ โ โ EpisodePageResponse.java
โ โ โ โ โ EpisodeResponse.java
โ โ โ โ โ
โ โ โ โ โโโโlocation
โ โ โ โ LocationApiAdapter.java
โ โ โ โ LocationPageResponse.java
โ โ โ โ LocationResponse.java
โ โ โ โ
โ โ โ โโโโjpa
โ โ โ โโโโmongo
โ โ โ โโโโcharacter
โ โ โ โ CharacterDocument.java
โ โ โ โ CharacterMongoAdapter.java
โ โ โ โ CharacterMongoRepository.java
โ โ โ โ
โ โ โ โโโโepisode
โ โ โ โ EpisodeDocument.java
โ โ โ โ EpisodeMongoAdapter.java
โ โ โ โ EpisodeMongoRepository.java
โ โ โ โ
โ โ โ โโโโlocation
โ โ โ LocationDocument.java
โ โ โ LocationMongoAdapter.java
โ โ โ LocationMongoRepository.java
โ โ โ
โ โ โโโโconfiguration
โ โ CorsProperties.java
โ โ GlobalCorsConfig.java
โ โ OpenApiConfig.java
โ โ WebClientConfig.java
โ โ
โ โโโโresources
โ application-dev.yml
โ application-prod.yml
โ application.yml
โ
โโโโtest
โโโโjava
โโโโcom
โโโโinterdimensional
โโโโapplication
โ โโโโquery
โ โโโโservice
โ CharacterQueryServiceTest.java
โ EpisodeQueryServiceTest.java
โ LocationQueryServiceTest.java
โ
โโโโinfrastructure
โ โโโโadapters
โ โโโโin
โ โ โโโโrest
โ โ โ HealthControllerTest.java
โ โ โ
โ โ โโโโcharacter
โ โ โ CharacterControllerTest.java
โ โ โ
โ โ โโโโepisode
โ โ โ EpisodeControllerTest.java
โ โ โ
โ โ โโโโlocation
โ โ LocationControllerTest.java
โ โ
โ โโโโout
โ โโโโcharacter
โ โ CharacterApiAdapterTest.java
โ โ
โ โโโโepisode
โ โ EpisodeApiAdapterTest.java
โ โ
โ โโโโlocation
โ LocationApiAdapterTest.java
โ
โโโโintegration
CharacterIntegrationTest.java
EpisodeIntegrationTest.java
LocationIntegrationTest.java
GET /api/v1/characters/{id}GET /api/v1/characters?page=1&name=Rick&status=alive
GET /api/v1/episodes/{id}GET /api/v1/episodes?page=1&name=Pilot
GET /api/v1/locations/{id}GET /api/v1/locations?page=1&name=Earth
GET /health
- Unit tests: Focus on application services and domain logic.
- Controller slice tests: Use
MockMvcto verify HTTP contracts. - Adapter tests: Verify correct mapping and error handling.
- Integration tests (End-to-End): - Full context load (
@SpringBootTest).- MockWebServer running on fixed ports to simulate the external API.
- MongoDB (Testcontainers or Embedded) with explicit database cleanup between tests to ensure cache consistency.
| Component | Version |
|---|---|
| Java | 21 |
| Spring Boot | 3.3.x |
| Spring Web MVC | REST |
| Spring WebFlux | WebClient |
| Spring Data MongoDB | Cache |
| JUnit 5 | Testing |
| MockWebServer | External API |
| Lombok | Boilerplate |
| OpenAPI | Swagger UI |
mvn clean verify
mvn spring-boot:run- Swagger: http://localhost:8080/swagger-ui/index.html
- Health:
/health
- Command side (CQRS)
- Write persistence (JPA)
- Observability
- Metrics & tracing
MIT โ free to use across dimensions.