This is an automated email from the ASF dual-hosted git repository.

epugh pushed a commit to branch branch_10x
in repository https://gitbox.apache.org/repos/asf/solr.git


The following commit(s) were added to refs/heads/branch_10x by this push:
     new 3f5919218b1 Use ObjectMapper from SolrJacksonMapper in 
CachingJsonMessageBodyReader (#4370)
3f5919218b1 is described below

commit 3f5919218b14235fedce94f518cd0dba715d79e9
Author: Renato Haeberli <[email protected]>
AuthorDate: Sat Jun 13 17:31:08 2026 +0200

    Use ObjectMapper from SolrJacksonMapper in CachingJsonMessageBodyReader 
(#4370)
    
    Co-authored-by: Eric Pugh <[email protected]>
---
 .../org/apache/solr/jersey/JerseyApplications.java |  4 +-
 .../org/apache/solr/jersey/MessageBodyReaders.java |  3 +-
 .../solr/jersey/PostRequestLoggingFilterTest.java  | 46 ++++++++++++++++++++++
 3 files changed, 50 insertions(+), 3 deletions(-)

diff --git a/solr/core/src/java/org/apache/solr/jersey/JerseyApplications.java 
b/solr/core/src/java/org/apache/solr/jersey/JerseyApplications.java
index 6eed07d2af8..559788b31a5 100644
--- a/solr/core/src/java/org/apache/solr/jersey/JerseyApplications.java
+++ b/solr/core/src/java/org/apache/solr/jersey/JerseyApplications.java
@@ -43,14 +43,14 @@ public class JerseyApplications {
 
       // Request and response serialization/deserialization
       // TODO: could these be singletons to save per-request object creations?
-      register(JacksonJsonProvider.class, 1);
+      register(MessageBodyReaders.CachingJsonMessageBodyReader.class, 1);
+      register(JacksonJsonProvider.class, 2);
       register(MessageBodyWriters.JavabinMessageBodyWriter.class, 5);
       register(MessageBodyWriters.XmlMessageBodyWriter.class, 5);
       register(MessageBodyWriters.CsvMessageBodyWriter.class, 5);
       register(MessageBodyWriters.RawMessageBodyWriter.class, 5);
       register(MessageBodyWriters.PrometheusMessageBodyWriter.class, 5);
       register(MessageBodyWriters.OpenmetricsMessageBodyWriter.class, 5);
-      register(MessageBodyReaders.CachingJsonMessageBodyReader.class, 2);
       register(SolrJacksonMapper.class);
 
       // Request lifecycle logic
diff --git a/solr/core/src/java/org/apache/solr/jersey/MessageBodyReaders.java 
b/solr/core/src/java/org/apache/solr/jersey/MessageBodyReaders.java
index 3a8f60d84e7..a47f0dc6597 100644
--- a/solr/core/src/java/org/apache/solr/jersey/MessageBodyReaders.java
+++ b/solr/core/src/java/org/apache/solr/jersey/MessageBodyReaders.java
@@ -48,7 +48,8 @@ public class MessageBodyReaders {
       implements MessageBodyReader<Object> {
     @Override
     public MessageBodyReader<Object> getDelegate() {
-      return new 
JacksonJsonProvider().configure(JsonParser.Feature.ALLOW_COMMENTS, true);
+      return new JacksonJsonProvider(SolrJacksonMapper.getObjectMapper())
+          .configure(JsonParser.Feature.ALLOW_COMMENTS, true);
     }
   }
 
diff --git 
a/solr/core/src/test/org/apache/solr/jersey/PostRequestLoggingFilterTest.java 
b/solr/core/src/test/org/apache/solr/jersey/PostRequestLoggingFilterTest.java
index 54d44fd80be..06e6e3e74d3 100644
--- 
a/solr/core/src/test/org/apache/solr/jersey/PostRequestLoggingFilterTest.java
+++ 
b/solr/core/src/test/org/apache/solr/jersey/PostRequestLoggingFilterTest.java
@@ -21,12 +21,19 @@ import static 
org.apache.solr.jersey.MessageBodyReaders.CachingDelegatingMessage
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
 
+import com.fasterxml.jackson.databind.ObjectMapper;
 import jakarta.ws.rs.container.ContainerRequestContext;
+import jakarta.ws.rs.core.MediaType;
 import jakarta.ws.rs.core.MultivaluedHashMap;
 import jakarta.ws.rs.core.UriInfo;
+import java.io.ByteArrayInputStream;
+import java.lang.annotation.Annotation;
+import java.nio.charset.StandardCharsets;
 import java.util.List;
 import org.apache.solr.SolrTestCaseJ4;
+import org.apache.solr.client.api.model.CreateCollectionRequestBody;
 import org.apache.solr.client.api.model.CreateReplicaRequestBody;
+import 
org.glassfish.jersey.jackson.internal.jackson.jaxrs.json.JacksonJsonProvider;
 import org.junit.BeforeClass;
 import org.junit.Test;
 
@@ -96,6 +103,45 @@ public class PostRequestLoggingFilterTest extends 
SolrTestCaseJ4 {
     assertEquals("paramName1=paramValue1&paramName2=paramValue2", 
queryParamStr);
   }
 
+  @Test
+  @SuppressWarnings("unchecked")
+  public void 
testCachingJsonMessageBodyReaderDelegateUsesConfiguredObjectMapper()
+      throws Exception {
+    final var delegate = new 
MessageBodyReaders.CachingJsonMessageBodyReader().getDelegate();
+
+    // Mapper SolrJacksonMapper.createObjectMapper creates a mapper with 
FAIL_ON_UNKNOWN_PROPERTIES
+    // set to false, hence we expect a json with an unknown field to be 
deserialized without any
+    // exception
+    final var entityStream =
+        new ByteArrayInputStream(
+            "{\"name\": \"test\", \"unknownField\": \"someValue\"}"
+                .getBytes(StandardCharsets.UTF_8));
+
+    final var result =
+        (CreateCollectionRequestBody)
+            delegate.readFrom(
+                (Class<Object>) (Class<?>) CreateCollectionRequestBody.class,
+                CreateCollectionRequestBody.class,
+                new Annotation[0],
+                MediaType.APPLICATION_JSON_TYPE,
+                new MultivaluedHashMap<>(),
+                entityStream);
+
+    assertEquals("test", result.name);
+  }
+
+  @Test
+  public void testCachingJsonMessageBodyReaderDelegateReusingObjectMapper() {
+    final var delegate =
+        (JacksonJsonProvider) new 
MessageBodyReaders.CachingJsonMessageBodyReader().getDelegate();
+    final var delegate2 =
+        (JacksonJsonProvider) new 
MessageBodyReaders.CachingJsonMessageBodyReader().getDelegate();
+
+    ObjectMapper mapper1 = delegate2.locateMapper(Object.class, 
MediaType.APPLICATION_JSON_TYPE);
+    ObjectMapper mapper2 = delegate.locateMapper(Object.class, 
MediaType.APPLICATION_JSON_TYPE);
+    assertSame(mapper1, mapper2);
+  }
+
   @Test
   public void testRequestBodyStringIsEmptyIfNoRequestBodyFound() {
     // NOTE: no request body is set on the context.

Reply via email to