From e58cb1ec78e7dfb7175c1567f2e4cfd2342cdb4e Mon Sep 17 00:00:00 2001 From: netroms Date: Thu, 2 Nov 2023 16:54:07 +0800 Subject: [PATCH] fix: identify persistent classes with an INT id field in the cache invalidation system (#15554) Co-authored-by: Morten Hansen (cherry picked from commit d72d3d47dbedb9c4d7eb8c20f4cbdc8ffa66b52f) --- .../redis/CacheInvalidationListener.java | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/dhis-2/dhis-support/dhis-support-cache-invalidation/src/main/java/org/hisp/dhis/cacheinvalidation/redis/CacheInvalidationListener.java b/dhis-2/dhis-support/dhis-support-cache-invalidation/src/main/java/org/hisp/dhis/cacheinvalidation/redis/CacheInvalidationListener.java index db95b9a27c2f..ba64360e4c4d 100644 --- a/dhis-2/dhis-support/dhis-support-cache-invalidation/src/main/java/org/hisp/dhis/cacheinvalidation/redis/CacheInvalidationListener.java +++ b/dhis-2/dhis-support/dhis-support-cache-invalidation/src/main/java/org/hisp/dhis/cacheinvalidation/redis/CacheInvalidationListener.java @@ -29,6 +29,7 @@ import io.lettuce.core.pubsub.RedisPubSubListener; import java.io.Serializable; +import java.lang.reflect.Field; import java.util.Objects; import lombok.extern.slf4j.Slf4j; import org.hisp.dhis.cacheinvalidation.BaseCacheEvictionService; @@ -36,7 +37,6 @@ import org.hisp.dhis.dataelement.DataElement; import org.hisp.dhis.dataset.CompleteDataSetRegistration; import org.hisp.dhis.dataset.DataSet; -import org.hisp.dhis.datastatistics.DataStatisticsEvent; import org.hisp.dhis.datavalue.DataValue; import org.hisp.dhis.organisationunit.OrganisationUnit; import org.hisp.dhis.period.Period; @@ -134,9 +134,18 @@ private Serializable getEntityId(String message) throws ClassNotFoundException { return getTrackedEntityAttributeValueId(idPart); } else if (CompleteDataSetRegistration.class.isAssignableFrom(entityClass)) { return getCompleteDataSetRegistrationId(idPart); - } else if (DataStatisticsEvent.class.isAssignableFrom(entityClass)) { - return Integer.parseInt(idPart); } else { + try { + // Best effort to try to identify classes with int IDs. + Field idField = entityClass.getDeclaredField("id"); + Class idType = idField.getType(); + if (idType == int.class) { + return Integer.parseInt(idPart); + } + } catch (NoSuchFieldException e) { + // Ignore this exception, as it's expected unless it's a class with an int ID. + } + // In most cases the ID will be a long. return Long.parseLong(idPart); } }