From b285ae3f48a6dc935e46609e8f1256a1ef94a8b8 Mon Sep 17 00:00:00 2001 From: Thach Le Date: Thu, 24 Jul 2025 14:21:53 +0700 Subject: [PATCH 1/3] reuse-objectmapper-defaultjsonparser Refactor DefaultJsonParser to use a single static ObjectMapper instance instead of creating new instances for each method call, improving performance and memory usage. --- .../java/io/lettuce/core/json/DefaultJsonParser.java | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/main/java/io/lettuce/core/json/DefaultJsonParser.java b/src/main/java/io/lettuce/core/json/DefaultJsonParser.java index dd20fa41ca..6ef4db1551 100644 --- a/src/main/java/io/lettuce/core/json/DefaultJsonParser.java +++ b/src/main/java/io/lettuce/core/json/DefaultJsonParser.java @@ -25,6 +25,8 @@ */ public class DefaultJsonParser implements JsonParser { + private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper(); + @Override public JsonValue loadJsonValue(ByteBuffer bytes) { return new UnproccessedJsonValue(bytes, this); @@ -52,9 +54,8 @@ public JsonArray createJsonArray() { @Override public JsonValue fromObject(Object object) { - ObjectMapper objectMapper = new ObjectMapper(); try { - JsonNode root = objectMapper.valueToTree(object); + JsonNode root = OBJECT_MAPPER.valueToTree(object); return DelegateJsonValue.wrap(root); } catch (IllegalArgumentException e) { throw new RedisJsonException("Failed to process the provided object as JSON", e); @@ -66,9 +67,8 @@ private JsonValue parse(String value) { return DelegateJsonValue.wrap(NullNode.getInstance()); } - ObjectMapper mapper = new ObjectMapper(); try { - JsonNode root = mapper.readTree(value); + JsonNode root = OBJECT_MAPPER.readTree(value); return DelegateJsonValue.wrap(root); } catch (JsonProcessingException e) { throw new RedisJsonException( @@ -81,11 +81,10 @@ private JsonValue parse(ByteBuffer byteBuffer) { return DelegateJsonValue.wrap(NullNode.getInstance()); } - ObjectMapper mapper = new ObjectMapper(); try { byte[] bytes = new byte[byteBuffer.remaining()]; byteBuffer.get(bytes); - JsonNode root = mapper.readTree(bytes); + JsonNode root = OBJECT_MAPPER.readTree(bytes); return DelegateJsonValue.wrap(root); } catch (IOException e) { throw new RedisJsonException("Failed to process the provided value as JSON", e); From 34b563be9ccf1ec756eed142b9a25149807b68fc Mon Sep 17 00:00:00 2001 From: Thach Le Date: Mon, 4 Aug 2025 20:03:54 +0700 Subject: [PATCH 2/3] Allow injection of custom ObjectMapper in DefaultJsonParser --- .../lettuce/core/json/DefaultJsonParser.java | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/src/main/java/io/lettuce/core/json/DefaultJsonParser.java b/src/main/java/io/lettuce/core/json/DefaultJsonParser.java index 6ef4db1551..7a0785208e 100644 --- a/src/main/java/io/lettuce/core/json/DefaultJsonParser.java +++ b/src/main/java/io/lettuce/core/json/DefaultJsonParser.java @@ -25,7 +25,18 @@ */ public class DefaultJsonParser implements JsonParser { - private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper(); + private final ObjectMapper objectMapper; + + public DefaultJsonParser() { + objectMapper = new ObjectMapper(); + } + + public DefaultJsonParser(ObjectMapper objectMapper) { + if (objectMapper == null) { + throw new IllegalArgumentException("ObjectMapper must not be null"); + } + this.objectMapper = objectMapper; + } @Override public JsonValue loadJsonValue(ByteBuffer bytes) { @@ -55,7 +66,7 @@ public JsonArray createJsonArray() { @Override public JsonValue fromObject(Object object) { try { - JsonNode root = OBJECT_MAPPER.valueToTree(object); + JsonNode root = objectMapper.valueToTree(object); return DelegateJsonValue.wrap(root); } catch (IllegalArgumentException e) { throw new RedisJsonException("Failed to process the provided object as JSON", e); @@ -68,7 +79,7 @@ private JsonValue parse(String value) { } try { - JsonNode root = OBJECT_MAPPER.readTree(value); + JsonNode root = objectMapper.readTree(value); return DelegateJsonValue.wrap(root); } catch (JsonProcessingException e) { throw new RedisJsonException( @@ -84,7 +95,7 @@ private JsonValue parse(ByteBuffer byteBuffer) { try { byte[] bytes = new byte[byteBuffer.remaining()]; byteBuffer.get(bytes); - JsonNode root = OBJECT_MAPPER.readTree(bytes); + JsonNode root = objectMapper.readTree(bytes); return DelegateJsonValue.wrap(root); } catch (IOException e) { throw new RedisJsonException("Failed to process the provided value as JSON", e); From 713a5d2cee028d3cb7e5242a4b1c6f7d367e423e Mon Sep 17 00:00:00 2001 From: Tihomir Mateev Date: Thu, 7 Aug 2025 15:02:48 +0300 Subject: [PATCH 3/3] Add JavaDoc --- src/main/java/io/lettuce/core/json/DefaultJsonParser.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/main/java/io/lettuce/core/json/DefaultJsonParser.java b/src/main/java/io/lettuce/core/json/DefaultJsonParser.java index 7a0785208e..8348e54e33 100644 --- a/src/main/java/io/lettuce/core/json/DefaultJsonParser.java +++ b/src/main/java/io/lettuce/core/json/DefaultJsonParser.java @@ -27,10 +27,18 @@ public class DefaultJsonParser implements JsonParser { private final ObjectMapper objectMapper; + /** + * Create a new instance of the {@link DefaultJsonParser} initialing a {@link ObjectMapper} with defaults. + */ public DefaultJsonParser() { objectMapper = new ObjectMapper(); } + /** + * Create a new instance of the {@link DefaultJsonParser} using the provided {@link ObjectMapper}. + * + * @param objectMapper the {@link ObjectMapper} to use + */ public DefaultJsonParser(ObjectMapper objectMapper) { if (objectMapper == null) { throw new IllegalArgumentException("ObjectMapper must not be null");