From 2c6e5ec78c6977051f25ef144a3817c8f44e949c Mon Sep 17 00:00:00 2001 From: Jan Bernitt Date: Thu, 16 Jul 2026 16:11:44 +0200 Subject: [PATCH 1/2] fix: exclude non-persisted inherited properties from Schema [DHIS2-21374] (#24467) * fix: exclude non-persisted inherited properties from Schema [DHIS2-21374] * fix: refine detection * fix: handle properties without getter --- .../java/org/hisp/dhis/schema/Property.java | 2 ++ .../JacksonPropertyIntrospector.java | 18 ++++++++++++++++++ 2 files changed, 20 insertions(+) diff --git a/dhis-2/dhis-api/src/main/java/org/hisp/dhis/schema/Property.java b/dhis-2/dhis-api/src/main/java/org/hisp/dhis/schema/Property.java index 4dabd7abd1e7..c546e5ed720a 100644 --- a/dhis-2/dhis-api/src/main/java/org/hisp/dhis/schema/Property.java +++ b/dhis-2/dhis-api/src/main/java/org/hisp/dhis/schema/Property.java @@ -86,6 +86,8 @@ public class Property implements Ordered, Klass { */ private boolean persisted; + @Getter @Setter private boolean isTransient; + /** Name of collection wrapper. */ private String collectionName; diff --git a/dhis-2/dhis-services/dhis-service-schema/src/main/java/org/hisp/dhis/schema/introspection/JacksonPropertyIntrospector.java b/dhis-2/dhis-services/dhis-service-schema/src/main/java/org/hisp/dhis/schema/introspection/JacksonPropertyIntrospector.java index 4dca028ecc68..19d34d072d2a 100644 --- a/dhis-2/dhis-services/dhis-service-schema/src/main/java/org/hisp/dhis/schema/introspection/JacksonPropertyIntrospector.java +++ b/dhis-2/dhis-services/dhis-service-schema/src/main/java/org/hisp/dhis/schema/introspection/JacksonPropertyIntrospector.java @@ -47,6 +47,7 @@ import java.lang.annotation.Annotation; import java.lang.reflect.Field; import java.lang.reflect.Method; +import java.lang.reflect.Modifier; import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; import java.util.ArrayList; @@ -69,6 +70,7 @@ import org.hisp.dhis.schema.Property; import org.hisp.dhis.schema.SchemaService; import org.hisp.dhis.system.util.ReflectionUtils; +import org.hisp.dhis.translation.Translatable; import org.springframework.util.ClassUtils; /** @@ -115,6 +117,20 @@ public void introspect(Class type, Map properties) { if (persistedProperties.containsKey(fieldName)) { initFromPersistedProperty(property, persistedProperties.get(fieldName)); + } else { + Method getter = property.getGetterMethod(); + if (getter != null) { + Class declaringClass = getter.getDeclaringClass(); + if (declaringClass.getName().startsWith("Base") + && !property.isTransient() + && (!getter.isAnnotationPresent(Translatable.class) + || !persistedProperties.containsKey( + getter.getAnnotation(Translatable.class).propertyName()))) { + // this is assumed to be an inherited property that is not persisted, + // so we skip it and do not add it + continue; + } + } } initFromDescription(property); @@ -222,6 +238,7 @@ private static void initFromEnumConstants(Property property) { private static void initFromPersistedProperty(Property property, Property persisted) { property.setPersisted(true); property.setWritable(true); + property.setTransient(false); property.setFieldName(persisted.getFieldName()); property.setUnique(persisted.isUnique()); property.setRequired(persisted.isRequired()); @@ -329,6 +346,7 @@ private static List collectProperties(Class type) { property.setName(name); property.setFieldName(fieldName); + property.setTransient(Modifier.isTransient(field.getModifiers())); property.setSetterMethod(findSetterMethod(fieldName, type, field.getType())); property.setGetterMethod(findGetterMethod(fieldName, type)); property.setNamespace(trimToNull(jsonProperty.namespace())); From b3796519504272bb229f5bebfed2e36cc4ad1660 Mon Sep 17 00:00:00 2001 From: Jan Bernitt Date: Mon, 20 Jul 2026 09:47:39 +0200 Subject: [PATCH 2/2] fix: replace lombok with getter/setters --- .../src/main/java/org/hisp/dhis/schema/Property.java | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/dhis-2/dhis-api/src/main/java/org/hisp/dhis/schema/Property.java b/dhis-2/dhis-api/src/main/java/org/hisp/dhis/schema/Property.java index c546e5ed720a..960719d27633 100644 --- a/dhis-2/dhis-api/src/main/java/org/hisp/dhis/schema/Property.java +++ b/dhis-2/dhis-api/src/main/java/org/hisp/dhis/schema/Property.java @@ -86,7 +86,7 @@ public class Property implements Ordered, Klass { */ private boolean persisted; - @Getter @Setter private boolean isTransient; + private boolean isTransient; /** Name of collection wrapper. */ private String collectionName; @@ -331,6 +331,16 @@ public void setPersisted(boolean persisted) { this.persisted = persisted; } + @JsonProperty + @JacksonXmlProperty(namespace = DxfNamespaces.DXF_2_0) + public boolean isTransient() { + return isTransient; + } + + public void setTransient(boolean isTransient) { + this.isTransient = isTransient; + } + @JsonProperty @JacksonXmlProperty(namespace = DxfNamespaces.DXF_2_0) public String getCollectionName() {