Skip to content

Add support for multitenancy in SQL DAO#37

Merged
kaushalaroraharman merged 28 commits intomainfrom
17-feat-abstractroutingdatasource-implementation-for-multitenancy
Dec 18, 2025
Merged

Add support for multitenancy in SQL DAO#37
kaushalaroraharman merged 28 commits intomainfrom
17-feat-abstractroutingdatasource-implementation-for-multitenancy

Conversation

@kaushalaroraharman
Copy link
Contributor

Please refer to our contributing docs for any questions on submitting a pull request.
Issues are required for both bug fixes and features.

Resolves #17


Describe behaviour before the change

  • SQL DAO can connect to only one Postgres database in a singe deployment, with only one configuration available for datasource

Describe behaviour after the change

  • SQL DAO now supports multitenancy wherein multiple Postgres database configurations can be provided and multiple datasources for each of the database connection will be created. Requests will be routed to the respective database based upon tenant-ID in request headers via Spring's abstract data source routing.

Pull request checklist

  • I have read the CONTRIBUTING.md
  • My code follows the code style of this project
  • Tests for the changes have been added (for bug fixes / features)
  • All new and existing tests passed.
  • Docs have been reviewed and added / updated if needed (for bug fixes / features)

Does this introduce a breaking change?

  • Yes
  • No

ihussainbadshah and others added 23 commits October 29, 2025 10:31
…tasource-implementation-for-multitenancy

Feature 17 Multitenancy support in sql-dao library
…tasource-implementation-for-multitenancy

Update version to 1.9-feat-17-1-SNAPSHOT
…tasource-implementation-for-multitenancy

Feature 17 SQL DAO MultiTenancy Support.
Update GitHub Actions workflow for secret checks
…tasource-implementation-for-multitenancy

Feature 17 Fixed Javadoc issues
…tasource-implementation-for-multitenancy

Feature 17 SQL DAO Multitenancy Support.
…tasource-implementation-for-multitenancy

Feature #17 abstractroutingdatasource implementation for multitenancy
…tasource-implementation-for-multitenancy

GitHub Feature #17 Added DependsOn to prevent a race condition.
…tasource-implementation-for-multitenancy

GitHub Feature #17 Changed TenantRoutingDataSource to fix multitenanc…
…multi.tenant.ids & Replaced hardcoded values with constants.
…tasource-implementation-for-multitenancy

Feature #17 SQL DAO Multitenancy Support - Assigned default value to …
@kaushalaroraharman kaushalaroraharman added this to the 1.2.0 milestone Dec 10, 2025
@kaushalaroraharman kaushalaroraharman self-assigned this Dec 10, 2025
@kaushalaroraharman kaushalaroraharman added the enhancement New feature or request label Dec 10, 2025
@kaushalaroraharman kaushalaroraharman linked an issue Dec 10, 2025 that may be closed by this pull request
1 task
@github-actions
Copy link

🔍 EOL Dependencies Check Results

🔍 Dependencies End-of-Life Report

Generated on 2025-12-10 07:50:35 UTC

📊 Summary

Status Count Description
❌ EOL 2 Dependencies that have reached end-of-life
⚠️ Approaching EOL 0 Dependencies approaching EOL within threshold
✅ Supported 1 Dependencies with active support
❓ Untracked 45 Dependencies that could not be tracked
Total 48 All checked dependencies

❌ End-of-Life Dependencies

These dependencies have reached their end-of-life and should be updated immediately:

Product Version Dependency EOL Date LTS
spring-framework 6.1.14 org.springframework:spring-expression 2025-06-30
spring-boot 3.2.5 org.springframework.boot:spring-boot 2024-12-31

✅ Supported Dependencies

Click to expand untracked dependencies
Product Version Dependency EOL Date LTS
log4j 2.21.1 org.apache.logging.log4j:log4j-to-slf4j False

❓ Untracked Dependencies

Click to expand untracked dependencies

These dependencies could not be tracked, as they were not found in the EOL database:

Product Version Dependency Reason
guava 9999.0-empty-to-avoid-conflict-with-guava com.google.guava:listenablefuture Product not found in EOL database
jackson 2.15.3 com.fasterxml.jackson.datatype:jackson-datatype-jsr310 Product not found in EOL database
snakeyaml 2.0 org.yaml:snakeyaml Product not found in EOL database
logback 1.5.5 ch.qos.logback:logback-classic Product not found in EOL database
slf4j 2.0.13 org.slf4j:jul-to-slf4j Product not found in EOL database
hibernate 6.0.6.Final org.hibernate.common:hibernate-commons-annotations Product not found in EOL database
byte-buddy 1.14.11 net.bytebuddy:byte-buddy Product not found in EOL database
apache-commons 3.13.0 org.apache.commons:commons-lang3 Product not found in EOL database
org.glassfish.jaxb 4.0.2 org.glassfish.jaxb:jaxb-core No mapping rule found for this groupId
javax.el 3.0.0 javax.el:javax.el-api No mapping rule found for this groupId
io.prometheus 0.6.0 io.prometheus:simpleclient_httpserver No mapping rule found for this groupId
org.javassist 3.21.0-GA org.javassist:javassist No mapping rule found for this groupId
com.google.errorprone 2.26.1 com.google.errorprone:error_prone_annotations No mapping rule found for this groupId
org.aspectj 1.9.22 org.aspectj:aspectjweaver No mapping rule found for this groupId
jakarta.transaction 2.0.1 jakarta.transaction:jakarta.transaction-api No mapping rule found for this groupId
org.eclipse.angus 2.0.0 org.eclipse.angus:angus-activation No mapping rule found for this groupId
com.zaxxer 5.0.1 com.zaxxer:HikariCP No mapping rule found for this groupId
org.postgresql 42.7.3 org.postgresql:postgresql No mapping rule found for this groupId
org.projectlombok 1.18.28 org.projectlombok:lombok No mapping rule found for this groupId
com.google.j2objc 3.0.0 com.google.j2objc:j2objc-annotations No mapping rule found for this groupId
org.glassfish.jaxb 4.0.2 org.glassfish.jaxb:txw2 No mapping rule found for this groupId
io.prometheus 0.6.0 io.prometheus:simpleclient_hotspot No mapping rule found for this groupId
com.sun.istack 4.1.1 com.sun.istack:istack-commons-runtime No mapping rule found for this groupId
org.jboss.logging 3.5.0.Final org.jboss.logging:jboss-logging No mapping rule found for this groupId
io.prometheus 0.6.0 io.prometheus:simpleclient_common No mapping rule found for this groupId
org.reflections 0.9.11 org.reflections:reflections No mapping rule found for this groupId
com.fasterxml 1.5.1 com.fasterxml:classmate No mapping rule found for this groupId
org.antlr 4.13.0 org.antlr:antlr4-runtime No mapping rule found for this groupId
io.micrometer 1.12.11 io.micrometer:micrometer-observation No mapping rule found for this groupId
io.dropwizard.metrics 4.2.19 io.dropwizard.metrics:metrics-healthchecks No mapping rule found for this groupId
org.checkerframework 3.42.0 org.checkerframework:checker-qual No mapping rule found for this groupId
io.micrometer 1.12.11 io.micrometer:micrometer-commons No mapping rule found for this groupId
jakarta.persistence 3.1.0 jakarta.persistence:jakarta.persistence-api No mapping rule found for this groupId
io.prometheus 0.6.0 io.prometheus:simpleclient No mapping rule found for this groupId
jakarta.activation 2.1.3 jakarta.activation:jakarta.activation-api No mapping rule found for this groupId
com.google.code.findbugs 3.0.2 com.google.code.findbugs:jsr305 No mapping rule found for this groupId
io.prometheus 0.6.0 io.prometheus:simpleclient_servlet No mapping rule found for this groupId
io.dropwizard.metrics 4.2.19 io.dropwizard.metrics:metrics-core No mapping rule found for this groupId
jakarta.xml.bind 4.0.2 jakarta.xml.bind:jakarta.xml.bind-api No mapping rule found for this groupId
org.glassfish.jaxb 4.0.2 org.glassfish.jaxb:jaxb-runtime No mapping rule found for this groupId
jakarta.inject 2.0.1 jakarta.inject:jakarta.inject-api No mapping rule found for this groupId
jakarta.annotation 2.0.0 jakarta.annotation:jakarta.annotation-api No mapping rule found for this groupId
org.glassfish.web 2.2.6 org.glassfish.web:javax.el No mapping rule found for this groupId
javax.annotation 1.2 javax.annotation:javax.annotation-api No mapping rule found for this groupId
io.smallrye 3.1.2 io.smallrye:jandex No mapping rule found for this groupId

🔧 Recommendations

Immediate Action Required

  • Update all EOL dependencies to supported versions
  • Check for security vulnerabilities in EOL dependencies
  • Plan migration timeline for breaking changes

Useful Resources

@kaushalaroraharman
Copy link
Contributor Author

Code Review comments with GPT-5.1-Codex-Max:

PR Review Comments for eclipse-ecsp/sql-dao PR #37

Category: Configuration Management, Severity: Critical -> In PostgresDbConfig.initializeDataSourcesForTenants, tenantIds are taken directly from @Value("${multitenancy.tenant.ids}") split on commas; missing/blank values (e.g., trailing commas or absent property) yield an empty tenantId and the loop attempts to build a DataSource for "". Add validation to filter out blanks and fail fast on empty IDs before initializing data sources.

Category: Testing, Severity: Critical -> In TenantContextTest, multiple tests set System.setProperty("multitenancy.enabled", "true") (e.g., testSetAndGetCurrentTenant, testMultipleTenantChanges, testThreadIsolation, testConcurrentAccess, testTenantPreservationDuringException, testTryWithResourcesPattern) without clearing it. The JVM-wide property leaks across tests and can cause nondeterministic failures. Wrap each set in try/finally with System.clearProperty(...) or clear it in @AfterEach.

Category: Testing, Severity: Moderate -> PostgresDbMultiTenantMetricsExporterIntegrationTest.testMetricsContinuousUpdate relies on fixed Thread.sleep delays (3s + 6s). This slows the suite and remains brittle if scheduler timing shifts. Replace sleeps with an Awaitility wait on the metric value (e.g., await().atMost(10, TimeUnit.SECONDS).untilAsserted(() -> assertTrue(postgresDbGuage.get(...) >= 0));) to make the test deterministic and faster.

Copy link
Contributor Author

@kaushalaroraharman kaushalaroraharman left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Review comments added.

*/
@Configuration
@EnableScheduling
@Component("postgresDbConfig")
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Adding @component alongside already present @configuration is redundant; Remove @component unless required for a very specific reason, in that case remove @configuration

ExecutorService executor = Executors.newFixedThreadPool(threadCount);
List<CompletableFuture<Void>> futures = new ArrayList<>();

for (String tenantId : tenantIds) {
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This will throw NPE if tenantIDs is null. It is being checked at line#195, but only at that line. Check if you tenantIds are available before calling initializeDataSourcesForTenants method, otherwise the whole method call can be skipped.

futures.add(CompletableFuture.runAsync(() -> {
try {
DataSource tenantDataSource = initDataSource(tenantId,
multiTenantDbProperties.getTenants().get(tenantId));
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why do you need a separate property for tenantIDs? We already have all the IDs if you iterate through the keys under multiTenantDbProperties.getTenants(). Having another tenantIDs list from properties seems redundant.

public class MultiTenantDatabaseProperties {

/** Map of tenant IDs to their database properties */
private Map<String, TenantDatabaseProperties> tenants = new HashMap<>();
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

MultiTenantDatabaseProperties currently expects property names as tenant.tenants.tenantA.propertyName. Instead, we should have tenant.tenantA.propertyName. The additional tenants in property name is redundant.
Can be done by Expose a Map bean bound to the prefix:

@configuration
public class TenantConfig {

@bean
@ConfigurationProperties(prefix = "tenant")
public Map<String, TenantDatabaseProperties> tenants() { return new HashMap<>(); } }

Now properties like tenant.tenantA.jdbc-url will be bound as map entries, and we can skip the additional tenants in property names.

DatabaseProperties tenantDbProperties =
multiTenantDbProperties.getTenants().get(tenantId);
credsProviderMap.put(tenantId,
(CredentialsProvider) utils.getClassInstance(tenantDbProperties.getCredentialProviderBeanName()));
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

utils.getClassInstance can throw unhandled SqlDaoException if the class is not loaded by the given name from tenantDbProperties.getCredentialProviderBeanName(). If there are 3 tenants, and load fails for the first one, because of unhandled exception it won't proceed for the other 2 tenants, even if they had valid credential provider bean names configured.

LOGGER.info("Multitenancy is disabled. Using default tenant credentials provider.");
credsProviderMap.put(MultitenantConstants.DEFAULT_TENANT_ID,
(CredentialsProvider) utils.getClassInstance(defaultDbProperties.getCredentialProviderBeanName()));
} else {
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Return credsProviderMap from the if block, instead of writing an else block to reduce conditional complexity.

Map<String, TenantDatabaseProperties> tenants = multiTenantDbProperties.getTenants();
if (tenants == null || tenants.isEmpty()) {
LOGGER.info("Executing credentials refresh job for default tenant.");
executeCredsRefreshForTenant(MultitenantConstants.DEFAULT_TENANT_ID,
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can't we have a default tenantID in properties - "tenant.default.propertyName"? This will map default tenantID with properties in MultiTenantDatabaseProperties, and we can avoid conditions for checking if tenantID is present or not, which is present at multiple places and explicitly adding and managing separate configuration for DEFAULT_TENANT_ID in the code.

dbProperties.setConnectionRetryCount(connectionRetryCount);
connection = createConnections(tenantId, dbProperties);
if (connection != null && !connection.isValid(1)) {
Thread.sleep(connectionRetryDelay);
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thread.sleep(connectionRetryDelay) is current at two places, one here, and another in the catch block. Instead, this can be placed once at the start of try block, since this method is called only if createConnection fails, we should wait the delay time before the first retry as well.

private String rootCrtPath;
@Bean("targetDataSources")
@DependsOn("credentialsProvider")
public Map<Object, Object> constructTargetDataSources() {
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This bean will always have TenantID (String) as key and dataSource as value, as such the map can be defined accordingly Map<String, DataSource>, instead of keeping it generic Object, unless required for any specific reason. This will avoid unnecessary checks and casting in code.

* @version 1.1
* @since 2025-10-28
*/
public class PostgresMultiTenantCredentialsProvider implements CredentialsProvider {
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Add Test to name of this class

ihussainbadshah and others added 3 commits December 18, 2025 09:39
@github-actions
Copy link

🔍 EOL Dependencies Check Results

🔍 Dependencies End-of-Life Report

Generated on 2025-12-18 13:07:47 UTC

📊 Summary

Status Count Description
❌ EOL 2 Dependencies that have reached end-of-life
⚠️ Approaching EOL 0 Dependencies approaching EOL within threshold
✅ Supported 1 Dependencies with active support
❓ Untracked 45 Dependencies that could not be tracked
Total 48 All checked dependencies

❌ End-of-Life Dependencies

These dependencies have reached their end-of-life and should be updated immediately:

Product Version Dependency EOL Date LTS
spring-framework 6.1.14 org.springframework:spring-expression 2025-06-30
spring-boot 3.2.5 org.springframework.boot:spring-boot 2024-12-31

✅ Supported Dependencies

Click to expand untracked dependencies
Product Version Dependency EOL Date LTS
log4j 2.21.1 org.apache.logging.log4j:log4j-to-slf4j False

❓ Untracked Dependencies

Click to expand untracked dependencies

These dependencies could not be tracked, as they were not found in the EOL database:

Product Version Dependency Reason
guava 9999.0-empty-to-avoid-conflict-with-guava com.google.guava:listenablefuture Product not found in EOL database
jackson 2.15.3 com.fasterxml.jackson.datatype:jackson-datatype-jsr310 Product not found in EOL database
snakeyaml 2.0 org.yaml:snakeyaml Product not found in EOL database
logback 1.5.5 ch.qos.logback:logback-classic Product not found in EOL database
slf4j 2.0.13 org.slf4j:jul-to-slf4j Product not found in EOL database
hibernate 6.0.6.Final org.hibernate.common:hibernate-commons-annotations Product not found in EOL database
byte-buddy 1.14.11 net.bytebuddy:byte-buddy Product not found in EOL database
apache-commons 3.13.0 org.apache.commons:commons-lang3 Product not found in EOL database
org.glassfish.jaxb 4.0.2 org.glassfish.jaxb:jaxb-core No mapping rule found for this groupId
javax.el 3.0.0 javax.el:javax.el-api No mapping rule found for this groupId
io.prometheus 0.6.0 io.prometheus:simpleclient_httpserver No mapping rule found for this groupId
org.javassist 3.21.0-GA org.javassist:javassist No mapping rule found for this groupId
com.google.errorprone 2.26.1 com.google.errorprone:error_prone_annotations No mapping rule found for this groupId
org.aspectj 1.9.22 org.aspectj:aspectjweaver No mapping rule found for this groupId
jakarta.transaction 2.0.1 jakarta.transaction:jakarta.transaction-api No mapping rule found for this groupId
org.eclipse.angus 2.0.0 org.eclipse.angus:angus-activation No mapping rule found for this groupId
com.zaxxer 5.0.1 com.zaxxer:HikariCP No mapping rule found for this groupId
org.postgresql 42.7.3 org.postgresql:postgresql No mapping rule found for this groupId
org.projectlombok 1.18.28 org.projectlombok:lombok No mapping rule found for this groupId
com.google.j2objc 3.0.0 com.google.j2objc:j2objc-annotations No mapping rule found for this groupId
org.glassfish.jaxb 4.0.2 org.glassfish.jaxb:txw2 No mapping rule found for this groupId
io.prometheus 0.6.0 io.prometheus:simpleclient_hotspot No mapping rule found for this groupId
com.sun.istack 4.1.1 com.sun.istack:istack-commons-runtime No mapping rule found for this groupId
org.jboss.logging 3.5.0.Final org.jboss.logging:jboss-logging No mapping rule found for this groupId
io.prometheus 0.6.0 io.prometheus:simpleclient_common No mapping rule found for this groupId
org.reflections 0.9.11 org.reflections:reflections No mapping rule found for this groupId
com.fasterxml 1.5.1 com.fasterxml:classmate No mapping rule found for this groupId
org.antlr 4.13.0 org.antlr:antlr4-runtime No mapping rule found for this groupId
io.micrometer 1.12.11 io.micrometer:micrometer-observation No mapping rule found for this groupId
io.dropwizard.metrics 4.2.19 io.dropwizard.metrics:metrics-healthchecks No mapping rule found for this groupId
org.checkerframework 3.42.0 org.checkerframework:checker-qual No mapping rule found for this groupId
io.micrometer 1.12.11 io.micrometer:micrometer-commons No mapping rule found for this groupId
jakarta.persistence 3.1.0 jakarta.persistence:jakarta.persistence-api No mapping rule found for this groupId
io.prometheus 0.6.0 io.prometheus:simpleclient No mapping rule found for this groupId
jakarta.activation 2.1.3 jakarta.activation:jakarta.activation-api No mapping rule found for this groupId
com.google.code.findbugs 3.0.2 com.google.code.findbugs:jsr305 No mapping rule found for this groupId
io.prometheus 0.6.0 io.prometheus:simpleclient_servlet No mapping rule found for this groupId
io.dropwizard.metrics 4.2.19 io.dropwizard.metrics:metrics-core No mapping rule found for this groupId
jakarta.xml.bind 4.0.2 jakarta.xml.bind:jakarta.xml.bind-api No mapping rule found for this groupId
org.glassfish.jaxb 4.0.2 org.glassfish.jaxb:jaxb-runtime No mapping rule found for this groupId
jakarta.inject 2.0.1 jakarta.inject:jakarta.inject-api No mapping rule found for this groupId
jakarta.annotation 2.0.0 jakarta.annotation:jakarta.annotation-api No mapping rule found for this groupId
org.glassfish.web 2.2.6 org.glassfish.web:javax.el No mapping rule found for this groupId
javax.annotation 1.2 javax.annotation:javax.annotation-api No mapping rule found for this groupId
io.smallrye 3.1.2 io.smallrye:jandex No mapping rule found for this groupId

🔧 Recommendations

Immediate Action Required

  • Update all EOL dependencies to supported versions
  • Check for security vulnerabilities in EOL dependencies
  • Plan migration timeline for breaking changes

Useful Resources

Sanath Madhav and others added 2 commits December 18, 2025 15:37
Adding support for dynamic refresh and addition/updation/removal of data sources at runtime
@github-actions
Copy link

🔍 EOL Dependencies Check Results

🔍 Dependencies End-of-Life Report

Generated on 2025-12-18 15:55:50 UTC

📊 Summary

Status Count Description
❌ EOL 2 Dependencies that have reached end-of-life
⚠️ Approaching EOL 0 Dependencies approaching EOL within threshold
✅ Supported 1 Dependencies with active support
❓ Untracked 45 Dependencies that could not be tracked
Total 48 All checked dependencies

❌ End-of-Life Dependencies

These dependencies have reached their end-of-life and should be updated immediately:

Product Version Dependency EOL Date LTS
spring-framework 6.1.14 org.springframework:spring-expression 2025-06-30
spring-boot 3.2.5 org.springframework.boot:spring-boot 2024-12-31

✅ Supported Dependencies

Click to expand untracked dependencies
Product Version Dependency EOL Date LTS
log4j 2.21.1 org.apache.logging.log4j:log4j-to-slf4j False

❓ Untracked Dependencies

Click to expand untracked dependencies

These dependencies could not be tracked, as they were not found in the EOL database:

Product Version Dependency Reason
guava 9999.0-empty-to-avoid-conflict-with-guava com.google.guava:listenablefuture Product not found in EOL database
jackson 2.15.3 com.fasterxml.jackson.datatype:jackson-datatype-jsr310 Product not found in EOL database
snakeyaml 2.0 org.yaml:snakeyaml Product not found in EOL database
logback 1.5.5 ch.qos.logback:logback-classic Product not found in EOL database
slf4j 2.0.13 org.slf4j:jul-to-slf4j Product not found in EOL database
hibernate 6.0.6.Final org.hibernate.common:hibernate-commons-annotations Product not found in EOL database
byte-buddy 1.14.11 net.bytebuddy:byte-buddy Product not found in EOL database
apache-commons 3.13.0 org.apache.commons:commons-lang3 Product not found in EOL database
org.glassfish.jaxb 4.0.2 org.glassfish.jaxb:jaxb-core No mapping rule found for this groupId
javax.el 3.0.0 javax.el:javax.el-api No mapping rule found for this groupId
io.prometheus 0.6.0 io.prometheus:simpleclient_httpserver No mapping rule found for this groupId
org.javassist 3.21.0-GA org.javassist:javassist No mapping rule found for this groupId
com.google.errorprone 2.26.1 com.google.errorprone:error_prone_annotations No mapping rule found for this groupId
org.aspectj 1.9.22 org.aspectj:aspectjweaver No mapping rule found for this groupId
jakarta.transaction 2.0.1 jakarta.transaction:jakarta.transaction-api No mapping rule found for this groupId
org.eclipse.angus 2.0.0 org.eclipse.angus:angus-activation No mapping rule found for this groupId
com.zaxxer 5.0.1 com.zaxxer:HikariCP No mapping rule found for this groupId
org.postgresql 42.7.3 org.postgresql:postgresql No mapping rule found for this groupId
org.projectlombok 1.18.28 org.projectlombok:lombok No mapping rule found for this groupId
com.google.j2objc 3.0.0 com.google.j2objc:j2objc-annotations No mapping rule found for this groupId
org.glassfish.jaxb 4.0.2 org.glassfish.jaxb:txw2 No mapping rule found for this groupId
io.prometheus 0.6.0 io.prometheus:simpleclient_hotspot No mapping rule found for this groupId
com.sun.istack 4.1.1 com.sun.istack:istack-commons-runtime No mapping rule found for this groupId
org.jboss.logging 3.5.0.Final org.jboss.logging:jboss-logging No mapping rule found for this groupId
io.prometheus 0.6.0 io.prometheus:simpleclient_common No mapping rule found for this groupId
org.reflections 0.9.11 org.reflections:reflections No mapping rule found for this groupId
com.fasterxml 1.5.1 com.fasterxml:classmate No mapping rule found for this groupId
org.antlr 4.13.0 org.antlr:antlr4-runtime No mapping rule found for this groupId
io.micrometer 1.12.11 io.micrometer:micrometer-observation No mapping rule found for this groupId
io.dropwizard.metrics 4.2.19 io.dropwizard.metrics:metrics-healthchecks No mapping rule found for this groupId
org.checkerframework 3.42.0 org.checkerframework:checker-qual No mapping rule found for this groupId
io.micrometer 1.12.11 io.micrometer:micrometer-commons No mapping rule found for this groupId
jakarta.persistence 3.1.0 jakarta.persistence:jakarta.persistence-api No mapping rule found for this groupId
io.prometheus 0.6.0 io.prometheus:simpleclient No mapping rule found for this groupId
jakarta.activation 2.1.3 jakarta.activation:jakarta.activation-api No mapping rule found for this groupId
com.google.code.findbugs 3.0.2 com.google.code.findbugs:jsr305 No mapping rule found for this groupId
io.prometheus 0.6.0 io.prometheus:simpleclient_servlet No mapping rule found for this groupId
io.dropwizard.metrics 4.2.19 io.dropwizard.metrics:metrics-core No mapping rule found for this groupId
jakarta.xml.bind 4.0.2 jakarta.xml.bind:jakarta.xml.bind-api No mapping rule found for this groupId
org.glassfish.jaxb 4.0.2 org.glassfish.jaxb:jaxb-runtime No mapping rule found for this groupId
jakarta.inject 2.0.1 jakarta.inject:jakarta.inject-api No mapping rule found for this groupId
jakarta.annotation 2.0.0 jakarta.annotation:jakarta.annotation-api No mapping rule found for this groupId
org.glassfish.web 2.2.6 org.glassfish.web:javax.el No mapping rule found for this groupId
javax.annotation 1.2 javax.annotation:javax.annotation-api No mapping rule found for this groupId
io.smallrye 3.1.2 io.smallrye:jandex No mapping rule found for this groupId

🔧 Recommendations

Immediate Action Required

  • Update all EOL dependencies to supported versions
  • Check for security vulnerabilities in EOL dependencies
  • Plan migration timeline for breaking changes

Useful Resources

@kaushalaroraharman
Copy link
Contributor Author

Reviewed and Approved.

@kaushalaroraharman kaushalaroraharman merged commit e7d0fd7 into main Dec 18, 2025
7 of 8 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancement New feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[FEAT]: AbstractRoutingDataSource implementation for Multitenancy

3 participants