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¶mName2=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.