From 0230131dde2c4619d93e9721b7d8725d140f38b7 Mon Sep 17 00:00:00 2001 From: YongwuHe <38196495+YongwuHe@users.noreply.github.com> Date: Thu, 12 Oct 2023 11:06:46 +0800 Subject: [PATCH] fix: jackson deserialization is case-insensitive (#300) --- .../serializer/JacksonSerializer.java | 1 - .../serializer/JacksonSerializerTest.java | 33 +++++++++++++++++++ .../dynamic/common/DynamicClassExtractor.java | 3 +- .../common/DynamicClassExtractorTest.java | 8 +++++ 4 files changed, 43 insertions(+), 2 deletions(-) diff --git a/arex-instrumentation-foundation/src/main/java/io/arex/foundation/serializer/JacksonSerializer.java b/arex-instrumentation-foundation/src/main/java/io/arex/foundation/serializer/JacksonSerializer.java index ac7324e12..280f6ebc0 100644 --- a/arex-instrumentation-foundation/src/main/java/io/arex/foundation/serializer/JacksonSerializer.java +++ b/arex-instrumentation-foundation/src/main/java/io/arex/foundation/serializer/JacksonSerializer.java @@ -177,7 +177,6 @@ private void configMapper() { MAPPER.configure(DeserializationFeature.FAIL_ON_IGNORED_PROPERTIES, false); MAPPER.configure(DeserializationFeature.FAIL_ON_NULL_FOR_PRIMITIVES, false); MAPPER.configure(DeserializationFeature.READ_UNKNOWN_ENUM_VALUES_AS_NULL, true); - MAPPER.configure(MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES, true); } private void customTimeFormatSerializer(SimpleModule module) { diff --git a/arex-instrumentation-foundation/src/test/java/io/arex/foundation/serializer/JacksonSerializerTest.java b/arex-instrumentation-foundation/src/test/java/io/arex/foundation/serializer/JacksonSerializerTest.java index 3b154184f..011623a7f 100644 --- a/arex-instrumentation-foundation/src/test/java/io/arex/foundation/serializer/JacksonSerializerTest.java +++ b/arex-instrumentation-foundation/src/test/java/io/arex/foundation/serializer/JacksonSerializerTest.java @@ -149,4 +149,37 @@ void testFastUtil() throws Throwable { assertNotNull(deserializeJackTestType); } + @Test + void testCaseSensitiveProperties() throws Throwable { + final CaseSensitive caseSensitive = new CaseSensitive(); + caseSensitive.setAmountPaid("100"); + caseSensitive.setAmountpaid("200"); + final String jackJson = JacksonSerializer.INSTANCE.serialize(caseSensitive); + final CaseSensitive deserializeJackTestType = JacksonSerializer.INSTANCE.deserialize(jackJson, CaseSensitive.class); + assertNotNull(deserializeJackTestType); + assertEquals("100", deserializeJackTestType.getAmountPaid()); + assertEquals("200", deserializeJackTestType.getAmountpaid()); + } + + static class CaseSensitive { + private String amountPaid; + private String amountpaid; + + public String getAmountPaid() { + return amountPaid; + } + + public void setAmountPaid(String amountPaid) { + this.amountPaid = amountPaid; + } + + public String getAmountpaid() { + return amountpaid; + } + + public void setAmountpaid(String amountpaid) { + this.amountpaid = amountpaid; + } + } + } \ No newline at end of file diff --git a/arex-instrumentation/dynamic/arex-dynamic-common/src/main/java/io/arex/inst/dynamic/common/DynamicClassExtractor.java b/arex-instrumentation/dynamic/arex-dynamic-common/src/main/java/io/arex/inst/dynamic/common/DynamicClassExtractor.java index 2904588ec..5bae2fa40 100644 --- a/arex-instrumentation/dynamic/arex-dynamic-common/src/main/java/io/arex/inst/dynamic/common/DynamicClassExtractor.java +++ b/arex-instrumentation/dynamic/arex-dynamic-common/src/main/java/io/arex/inst/dynamic/common/DynamicClassExtractor.java @@ -289,9 +289,10 @@ private boolean needRecord() { size = Array.getLength(result); } if (size > RESULT_SIZE_MAX) { + String methodInfo = methodSignatureKey == null ? buildDuplicateMethodKey() : methodSignatureKey; LogManager.warn(NEED_RECORD_TITLE, StringUtil.format("do not record method, cuz result size:%s > max limit: %s, method info: %s", - String.valueOf(size), String.valueOf(RESULT_SIZE_MAX), methodSignatureKey)); + String.valueOf(size), String.valueOf(RESULT_SIZE_MAX), methodInfo)); return false; } } catch (Throwable e) { diff --git a/arex-instrumentation/dynamic/arex-dynamic-common/src/test/java/io/arex/inst/dynamic/common/DynamicClassExtractorTest.java b/arex-instrumentation/dynamic/arex-dynamic-common/src/test/java/io/arex/inst/dynamic/common/DynamicClassExtractorTest.java index bb6019324..b2b516dde 100644 --- a/arex-instrumentation/dynamic/arex-dynamic-common/src/test/java/io/arex/inst/dynamic/common/DynamicClassExtractorTest.java +++ b/arex-instrumentation/dynamic/arex-dynamic-common/src/test/java/io/arex/inst/dynamic/common/DynamicClassExtractorTest.java @@ -42,6 +42,7 @@ import java.util.stream.Stream; import org.mockito.stubbing.Answer; +import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNull; import static org.junit.jupiter.api.Assertions.assertThrows; @@ -438,4 +439,11 @@ void invalidOperation() throws Throwable { final MockResult replay = extractor.replay(); assertEquals(MockResult.IGNORE_MOCK_RESULT, replay); } + + @Test + void emptyMethodKeyAndExceedSize() throws NoSuchMethodException { + Method testEmptyArgs = DynamicClassExtractorTest.class.getDeclaredMethod("invalidOperation"); + DynamicClassExtractor extractor = new DynamicClassExtractor(testEmptyArgs, new Object[0]); + assertDoesNotThrow(() -> extractor.recordResponse(new int[1001])); + } }