A modular and extensible Java Spring Boot application for executing external REST API requests with automatic audit logging, provider-specific authentication, and a strategy-based execution model.
- ✅ Strategy pattern for REST API request execution
- 🔐 Token-based authentication (decorated via
TokenManager) - 🧾 Persistent API audit trail with request/response metadata
- 🔍 Dynamic support for multiple providers via
TokenManagerFactory - 🧼 Sensitive data masking before logging or persisting
- 🌐 Extensible provider helper structure (
ProviderXRestHelper) - 📊 Clean, logged request lifecycle with response validation
.
├── model/
│ └── Provider.java
│ └── ApiAuditTrail.java
│
├── dto/
│ └── ProviderXRestDto.java
│
├── service/
│ ├── ApiAuditTrailService.java
│ ├── ApiAuditTrailServiceImpl.java
│ └── TokenManager.java
│
├── strategy/
│ ├── RestRequestStrategy.java
│ ├── ProviderXCheckAccount.java
│ └── ProviderXTokenDecoratedStrategy.java
│
├── factory/
│ └── TokenManagerFactory.java
│
├── helper/
│ └── RestHelper.java
│ └── ProviderXRestHelper.java
│
├── repository/
│ └── ApiAuditTrailRepository.java
│
├── token/
│ └── ProviderXTokenManager.java
│
└── RestFoundationDemoApplication.java
-
Define a Request Strategy Create a class implementing
RestRequestStrategy<REQ, RES>for a specific provider (e.g.,ProviderXCheckAccount). -
Decorate with Token Logic Use
ProviderXTokenDecoratedStrategyto inject tokens and modify the base URL before execution. -
Execute with Helper Call
ProviderXRestHelper.execute(...), which delegates toRestHelper. -
Audit Logging Every request/response is logged and saved into
api_audit_trail_tbl, with sensitive fields masked.
RestRequestStrategy<CheckAccountReqDto, CheckAccountRespDto> strategy = new ProviderXCheckAccount();
providerXRestHelper.execute(strategy);- Token is fetched via
ProviderXTokenManager - Request is wrapped with auth headers
- Response is validated for
statusCode: SUCCESS - Audit record is saved with masked request/response
| Field | Description |
|---|---|
| id | Primary key |
| correlationId | Request correlation ID |
| method | HTTP method |
| url | Request URL |
| requestHeaders | Serialized and sanitized headers |
| requestBody | Serialized and sanitized body |
| responseStatus | HTTP status code |
| responseBody | Serialized and sanitized response |
| responseHeaders | Response headers |
| status | SUCCESS or FAILED |
| errorMessage | Error details if any |
| durationMs | Execution time in ms |
| createdAt | Timestamp |
| createdBy | Auto-set by JPA auditing |
- Java 17+
- Spring Boot
- Spring Data JPA
- Lombok
- SLF4J Logging
- Jackson (for JSON parsing)
- PostgreSQL / MySQL (any JPA-supported DB)
These fields are masked in logs/audit:
passwordtokensecretauthorizationapiKey
Sharif 🔗 https://github.com/sharifrahim
- Implement
ProviderXTokenManager.getToken() - Add support for additional providers in
TokenManagerFactory - Externalize base URLs via
application.yml
# Build and run
./mvnw spring-boot:run
# API behavior is executed programmatically, not exposed as controller (yet)To support a new provider:
- Create a new
EnuminProvider.java - Implement
TokenManager - Add to
TokenManagerFactory - Define a
RestRequestStrategyfor your API endpoint - Optionally create a
RestHelperwrapper class (likeProviderXRestHelper)