From a018b699180ab6750a766a95d707a0bc95fd8a6c Mon Sep 17 00:00:00 2001 From: Aditya Alif Nugraha Date: Wed, 22 Oct 2025 15:31:20 +0200 Subject: [PATCH] fix: restore @JsonAnyGetter functionality for additionalFields serialization The ObjectMapper configuration added in PR #205 set PropertyAccessor.GETTER visibility to NONE, which disabled ALL getter methods including those annotated with @JsonAnyGetter. This broke serialization of additionalFields in channels and messages, causing custom object fields to appear as empty. Changed to use field-based serialization while still respecting explicit Jackson annotations (@JsonAnyGetter, @JsonProperty, etc): - Set PropertyAccessor.ALL to NONE (disable auto-detection) - Set PropertyAccessor.FIELD to ANY (use field-based serialization) This preserves the intent of PR #205 (avoiding getter auto-detection) while fixing additionalFields serialization. Fixes: #205 --- .../chat/java/services/framework/DefaultClient.java | 5 +++-- src/test/java/io/getstream/chat/java/AppTest.java | 3 ++- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/main/java/io/getstream/chat/java/services/framework/DefaultClient.java b/src/main/java/io/getstream/chat/java/services/framework/DefaultClient.java index a975e7d2a..14302b5c8 100644 --- a/src/main/java/io/getstream/chat/java/services/framework/DefaultClient.java +++ b/src/main/java/io/getstream/chat/java/services/framework/DefaultClient.java @@ -104,8 +104,9 @@ private Retrofit buildRetrofitClient() { return chain.proceed(request); }); final ObjectMapper mapper = new ObjectMapper(); - // do not encode getter methods in json - mapper.setVisibility(PropertyAccessor.GETTER, JsonAutoDetect.Visibility.NONE); + // Use field-based serialization but respect @JsonProperty and @JsonAnyGetter annotations + mapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.NONE); + mapper.setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY); mapper.configure( DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, hasFailOnUnknownProperties(extendedProperties)); diff --git a/src/test/java/io/getstream/chat/java/AppTest.java b/src/test/java/io/getstream/chat/java/AppTest.java index 458753a57..0457c8a9d 100644 --- a/src/test/java/io/getstream/chat/java/AppTest.java +++ b/src/test/java/io/getstream/chat/java/AppTest.java @@ -279,7 +279,8 @@ void whenUpdatingAppSettingsWithPendingMessageEventHook_thenNoException() throws void whenEncodingAppConfig_thenNoNullFields() { var appConfig = App.update().internalBuild(); final ObjectMapper mapper = new ObjectMapper(); - mapper.setVisibility(PropertyAccessor.GETTER, JsonAutoDetect.Visibility.NONE); + mapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.NONE); + mapper.setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY); String json = Assertions.assertDoesNotThrow(() -> mapper.writeValueAsString(appConfig));