Skip to content

Commit d115f36

Browse files
committed
Use JsonMapper instead of ObjectMapper when relevant
This commit updates Jackson 3 support to use JsonMapper instead of ObjectMapper in converter, codec and view constructors. Closes gh-35282
1 parent bde806b commit d115f36

File tree

17 files changed

+94
-105
lines changed

17 files changed

+94
-105
lines changed

spring-jms/src/main/java/org/springframework/jms/support/converter/JacksonJsonMessageConverter.java

Lines changed: 16 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,6 @@
3232
import jakarta.jms.TextMessage;
3333
import org.jspecify.annotations.Nullable;
3434
import tools.jackson.databind.JavaType;
35-
import tools.jackson.databind.ObjectMapper;
3635
import tools.jackson.databind.ObjectWriter;
3736
import tools.jackson.databind.cfg.MapperBuilder;
3837
import tools.jackson.databind.json.JsonMapper;
@@ -63,7 +62,7 @@ public class JacksonJsonMessageConverter implements SmartMessageConverter, BeanC
6362
public static final String DEFAULT_ENCODING = "UTF-8";
6463

6564

66-
private final ObjectMapper objectMapper;
65+
private final JsonMapper jsonMapper;
6766

6867
private MessageType targetType = MessageType.BYTES;
6968

@@ -86,17 +85,17 @@ public class JacksonJsonMessageConverter implements SmartMessageConverter, BeanC
8685
* {@link MapperBuilder#findModules(ClassLoader)}.
8786
*/
8887
public JacksonJsonMessageConverter() {
89-
this.objectMapper = JsonMapper.builder().findAndAddModules(JacksonJsonMessageConverter.class.getClassLoader()).build();
88+
this.jsonMapper = JsonMapper.builder().findAndAddModules(JacksonJsonMessageConverter.class.getClassLoader()).build();
9089
}
9190

9291
/**
93-
* Construct a new instance with the provided {@link ObjectMapper}.
92+
* Construct a new instance with the provided {@link JsonMapper}.
9493
* @see JsonMapper#builder()
9594
* @see MapperBuilder#findModules(ClassLoader)
9695
*/
97-
public JacksonJsonMessageConverter(ObjectMapper objectMapper) {
98-
Assert.notNull(objectMapper, "ObjectMapper must not be null");
99-
this.objectMapper = objectMapper;
96+
public JacksonJsonMessageConverter(JsonMapper jsonMapper) {
97+
Assert.notNull(jsonMapper, "JsonMapper must not be null");
98+
this.jsonMapper = jsonMapper;
10099
}
101100

102101
/**
@@ -173,9 +172,9 @@ public Message toMessage(Object object, Session session) throws JMSException, Me
173172
Message message;
174173
try {
175174
message = switch (this.targetType) {
176-
case TEXT -> mapToTextMessage(object, session, this.objectMapper.writer());
177-
case BYTES -> mapToBytesMessage(object, session, this.objectMapper.writer());
178-
default -> mapToMessage(object, session, this.objectMapper.writer(), this.targetType);
175+
case TEXT -> mapToTextMessage(object, session, this.jsonMapper.writer());
176+
case BYTES -> mapToBytesMessage(object, session, this.jsonMapper.writer());
177+
default -> mapToMessage(object, session, this.jsonMapper.writer(), this.targetType);
179178
};
180179
}
181180
catch (IOException ex) {
@@ -206,10 +205,10 @@ public Message toMessage(Object object, Session session, @Nullable Class<?> json
206205
throws JMSException, MessageConversionException {
207206

208207
if (jsonView != null) {
209-
return toMessage(object, session, this.objectMapper.writerWithView(jsonView));
208+
return toMessage(object, session, this.jsonMapper.writerWithView(jsonView));
210209
}
211210
else {
212-
return toMessage(object, session, this.objectMapper.writer());
211+
return toMessage(object, session, this.jsonMapper.writer());
213212
}
214213
}
215214

@@ -363,7 +362,7 @@ protected Object convertFromTextMessage(TextMessage message, JavaType targetJava
363362
throws JMSException, IOException {
364363

365364
String body = message.getText();
366-
return this.objectMapper.readValue(body, targetJavaType);
365+
return this.jsonMapper.readValue(body, targetJavaType);
367366
}
368367

369368
/**
@@ -386,15 +385,15 @@ protected Object convertFromBytesMessage(BytesMessage message, JavaType targetJa
386385
if (encoding != null) {
387386
try {
388387
String body = new String(bytes, encoding);
389-
return this.objectMapper.readValue(body, targetJavaType);
388+
return this.jsonMapper.readValue(body, targetJavaType);
390389
}
391390
catch (UnsupportedEncodingException ex) {
392391
throw new MessageConversionException("Cannot convert bytes to String", ex);
393392
}
394393
}
395394
else {
396395
// Jackson internally performs encoding detection, falling back to UTF-8.
397-
return this.objectMapper.readValue(bytes, targetJavaType);
396+
return this.jsonMapper.readValue(bytes, targetJavaType);
398397
}
399398
}
400399

@@ -437,11 +436,11 @@ protected JavaType getJavaTypeForMessage(Message message) throws JMSException {
437436
}
438437
Class<?> mappedClass = this.idClassMappings.get(typeId);
439438
if (mappedClass != null) {
440-
return this.objectMapper.constructType(mappedClass);
439+
return this.jsonMapper.constructType(mappedClass);
441440
}
442441
try {
443442
Class<?> typeClass = ClassUtils.forName(typeId, this.beanClassLoader);
444-
return this.objectMapper.constructType(typeClass);
443+
return this.jsonMapper.constructType(typeClass);
445444
}
446445
catch (Throwable ex) {
447446
throw new MessageConversionException("Failed to resolve type id [" + typeId + "]", ex);

spring-messaging/src/main/java/org/springframework/messaging/converter/JacksonJsonMessageConverter.java

Lines changed: 22 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@
2727
import tools.jackson.core.JsonEncoding;
2828
import tools.jackson.core.JsonGenerator;
2929
import tools.jackson.databind.JavaType;
30-
import tools.jackson.databind.ObjectMapper;
3130
import tools.jackson.databind.cfg.MapperBuilder;
3231
import tools.jackson.databind.json.JsonMapper;
3332

@@ -52,7 +51,7 @@ public class JacksonJsonMessageConverter extends AbstractMessageConverter {
5251
private static final MimeType[] DEFAULT_MIME_TYPES = new MimeType[] {
5352
new MimeType("application", "json"), new MimeType("application", "*+json")};
5453

55-
private final ObjectMapper objectMapper;
54+
private final JsonMapper jsonMapper;
5655

5756

5857
/**
@@ -73,35 +72,35 @@ public JacksonJsonMessageConverter() {
7372
*/
7473
public JacksonJsonMessageConverter(MimeType... supportedMimeTypes) {
7574
super(supportedMimeTypes);
76-
this.objectMapper = JsonMapper.builder().findAndAddModules(JacksonJsonMessageConverter.class.getClassLoader()).build();
75+
this.jsonMapper = JsonMapper.builder().findAndAddModules(JacksonJsonMessageConverter.class.getClassLoader()).build();
7776
}
7877

7978
/**
80-
* Construct a new instance with the provided {@link ObjectMapper}.
79+
* Construct a new instance with the provided {@link JsonMapper}.
8180
* @see JsonMapper#builder()
8281
* @see MapperBuilder#findModules(ClassLoader)
8382
*/
84-
public JacksonJsonMessageConverter(ObjectMapper objectMapper) {
85-
this(objectMapper, DEFAULT_MIME_TYPES);
83+
public JacksonJsonMessageConverter(JsonMapper jsonMapper) {
84+
this(jsonMapper, DEFAULT_MIME_TYPES);
8685
}
8786

8887
/**
89-
* Construct a new instance with the provided {@link ObjectMapper} and the
88+
* Construct a new instance with the provided {@link JsonMapper} and the
9089
* provided {@link MimeType}s.
9190
* @see JsonMapper#builder()
9291
* @see MapperBuilder#findModules(ClassLoader)
9392
*/
94-
public JacksonJsonMessageConverter(ObjectMapper objectMapper, MimeType... supportedMimeTypes) {
93+
public JacksonJsonMessageConverter(JsonMapper jsonMapper, MimeType... supportedMimeTypes) {
9594
super(supportedMimeTypes);
96-
Assert.notNull(objectMapper, "ObjectMapper must not be null");
97-
this.objectMapper = objectMapper;
95+
Assert.notNull(jsonMapper, "JsonMapper must not be null");
96+
this.jsonMapper = jsonMapper;
9897
}
9998

10099
/**
101-
* Return the underlying {@code ObjectMapper} for this converter.
100+
* Return the underlying {@code JsonMapper} for this converter.
102101
*/
103-
protected ObjectMapper getObjectMapper() {
104-
return this.objectMapper;
102+
protected JsonMapper getJsonMapper() {
103+
return this.jsonMapper;
105104
}
106105

107106
@Override
@@ -122,7 +121,7 @@ protected boolean supports(Class<?> clazz) {
122121

123122
@Override
124123
protected @Nullable Object convertFromInternal(Message<?> message, Class<?> targetClass, @Nullable Object conversionHint) {
125-
JavaType javaType = this.objectMapper.constructType(getResolvedType(targetClass, conversionHint));
124+
JavaType javaType = this.jsonMapper.constructType(getResolvedType(targetClass, conversionHint));
126125
Object payload = message.getPayload();
127126
Class<?> view = getSerializationView(conversionHint);
128127
try {
@@ -131,19 +130,19 @@ protected boolean supports(Class<?> clazz) {
131130
}
132131
else if (payload instanceof byte[] bytes) {
133132
if (view != null) {
134-
return this.objectMapper.readerWithView(view).forType(javaType).readValue(bytes);
133+
return this.jsonMapper.readerWithView(view).forType(javaType).readValue(bytes);
135134
}
136135
else {
137-
return this.objectMapper.readValue(bytes, javaType);
136+
return this.jsonMapper.readValue(bytes, javaType);
138137
}
139138
}
140139
else {
141140
// Assuming a text-based source payload
142141
if (view != null) {
143-
return this.objectMapper.readerWithView(view).forType(javaType).readValue(payload.toString());
142+
return this.jsonMapper.readerWithView(view).forType(javaType).readValue(payload.toString());
144143
}
145144
else {
146-
return this.objectMapper.readValue(payload.toString(), javaType);
145+
return this.jsonMapper.readValue(payload.toString(), javaType);
147146
}
148147
}
149148
}
@@ -161,12 +160,12 @@ else if (payload instanceof byte[] bytes) {
161160
if (byte[].class == getSerializedPayloadClass()) {
162161
ByteArrayOutputStream out = new ByteArrayOutputStream(1024);
163162
JsonEncoding encoding = getJsonEncoding(getMimeType(headers));
164-
try (JsonGenerator generator = this.objectMapper.createGenerator(out, encoding)) {
163+
try (JsonGenerator generator = this.jsonMapper.createGenerator(out, encoding)) {
165164
if (view != null) {
166-
this.objectMapper.writerWithView(view).writeValue(generator, payload);
165+
this.jsonMapper.writerWithView(view).writeValue(generator, payload);
167166
}
168167
else {
169-
this.objectMapper.writeValue(generator, payload);
168+
this.jsonMapper.writeValue(generator, payload);
170169
}
171170
payload = out.toByteArray();
172171
}
@@ -175,10 +174,10 @@ else if (payload instanceof byte[] bytes) {
175174
// Assuming a text-based target payload
176175
Writer writer = new StringWriter(1024);
177176
if (view != null) {
178-
this.objectMapper.writerWithView(view).writeValue(writer, payload);
177+
this.jsonMapper.writerWithView(view).writeValue(writer, payload);
179178
}
180179
else {
181-
this.objectMapper.writeValue(writer, payload);
180+
this.jsonMapper.writeValue(writer, payload);
182181
}
183182
payload = writer.toString();
184183
}

spring-test/src/test/java/org/springframework/test/json/AbstractJsonContentAssertTests.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@
4545
import org.skyscreamer.jsonassert.JSONCompareMode;
4646
import org.skyscreamer.jsonassert.JSONCompareResult;
4747
import org.skyscreamer.jsonassert.comparator.JSONComparator;
48-
import tools.jackson.databind.ObjectMapper;
48+
import tools.jackson.databind.json.JsonMapper;
4949

5050
import org.springframework.core.io.ByteArrayResource;
5151
import org.springframework.core.io.ClassPathResource;
@@ -86,7 +86,7 @@ class AbstractJsonContentAssertTests {
8686
private static final String DIFFERENT = loadJson("different.json");
8787

8888
private static final HttpMessageContentConverter jsonContentConverter = HttpMessageContentConverter.of(
89-
new JacksonJsonHttpMessageConverter(new ObjectMapper()));
89+
new JacksonJsonHttpMessageConverter(new JsonMapper()));
9090

9191
private static final JsonComparator comparator = JsonAssert.comparator(JsonCompareMode.LENIENT);
9292

spring-test/src/test/java/org/springframework/test/json/JsonPathValueAssertTests.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@
2727
import org.jspecify.annotations.Nullable;
2828
import org.junit.jupiter.api.Nested;
2929
import org.junit.jupiter.api.Test;
30-
import tools.jackson.databind.ObjectMapper;
30+
import tools.jackson.databind.json.JsonMapper;
3131

3232
import org.springframework.http.converter.json.JacksonJsonHttpMessageConverter;
3333
import org.springframework.test.http.HttpMessageContentConverter;
@@ -206,7 +206,7 @@ void asMapWithNullFails() {
206206
class ConvertToTests {
207207

208208
private static final HttpMessageContentConverter jsonContentConverter = HttpMessageContentConverter.of(
209-
new JacksonJsonHttpMessageConverter(new ObjectMapper()));
209+
new JacksonJsonHttpMessageConverter(new JsonMapper()));
210210

211211
@Test
212212
void convertToWithoutHttpMessageConverter() {

spring-test/src/test/java/org/springframework/test/util/JsonPathExpectationsHelperTests.java

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@
2727
import org.junit.jupiter.params.ParameterizedTest;
2828
import org.junit.jupiter.params.provider.ValueSource;
2929
import tools.jackson.databind.JavaType;
30-
import tools.jackson.databind.ObjectMapper;
30+
import tools.jackson.databind.json.JsonMapper;
3131

3232
import org.springframework.core.ParameterizedTypeReference;
3333

@@ -385,14 +385,14 @@ public record Member(String name) {}
385385
*/
386386
private static class JacksonMappingProvider implements MappingProvider {
387387

388-
private final ObjectMapper objectMapper;
388+
private final JsonMapper jsonMapper;
389389

390390
public JacksonMappingProvider() {
391-
this(new ObjectMapper());
391+
this(new JsonMapper());
392392
}
393393

394-
public JacksonMappingProvider(ObjectMapper objectMapper) {
395-
this.objectMapper = objectMapper;
394+
public JacksonMappingProvider(JsonMapper jsonMapper) {
395+
this.jsonMapper = jsonMapper;
396396
}
397397

398398

@@ -402,7 +402,7 @@ public <T> T map(Object source, Class<T> targetType, Configuration configuration
402402
return null;
403403
}
404404
try {
405-
return objectMapper.convertValue(source, targetType);
405+
return jsonMapper.convertValue(source, targetType);
406406
}
407407
catch (Exception ex) {
408408
throw new MappingException(ex);
@@ -416,10 +416,10 @@ public <T> T map(Object source, final TypeRef<T> targetType, Configuration confi
416416
if (source == null){
417417
return null;
418418
}
419-
JavaType type = objectMapper.getTypeFactory().constructType(targetType.getType());
419+
JavaType type = jsonMapper.getTypeFactory().constructType(targetType.getType());
420420

421421
try {
422-
return (T) objectMapper.convertValue(source, type);
422+
return (T) jsonMapper.convertValue(source, type);
423423
}
424424
catch (Exception ex) {
425425
throw new MappingException(ex);

spring-test/src/test/java/org/springframework/test/web/reactive/server/EncoderDecoderMappingProviderTests.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
import com.jayway.jsonpath.Configuration;
2323
import com.jayway.jsonpath.TypeRef;
2424
import org.junit.jupiter.api.Test;
25-
import tools.jackson.databind.ObjectMapper;
25+
import tools.jackson.databind.json.JsonMapper;
2626

2727
import org.springframework.http.codec.json.JacksonJsonDecoder;
2828
import org.springframework.http.codec.json.JacksonJsonEncoder;
@@ -36,10 +36,10 @@
3636
*/
3737
class EncoderDecoderMappingProviderTests {
3838

39-
private static final ObjectMapper objectMapper = new ObjectMapper();
39+
private static final JsonMapper jsonMapper = new JsonMapper();
4040

4141
private final EncoderDecoderMappingProvider mappingProvider = new EncoderDecoderMappingProvider(
42-
new JacksonJsonEncoder(objectMapper), new JacksonJsonDecoder(objectMapper));
42+
new JacksonJsonEncoder(jsonMapper), new JacksonJsonDecoder(jsonMapper));
4343

4444

4545
@Test

spring-test/src/test/java/org/springframework/test/web/reactive/server/JsonEncoderDecoderTests.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
import java.util.List;
2020

2121
import org.junit.jupiter.api.Test;
22-
import tools.jackson.databind.ObjectMapper;
22+
import tools.jackson.databind.json.JsonMapper;
2323

2424
import org.springframework.http.codec.DecoderHttpMessageReader;
2525
import org.springframework.http.codec.EncoderHttpMessageWriter;
@@ -39,13 +39,13 @@
3939
*/
4040
class JsonEncoderDecoderTests {
4141

42-
private static final ObjectMapper objectMapper = new ObjectMapper();
42+
private static final JsonMapper jsonMapper = new JsonMapper();
4343

4444
private static final HttpMessageWriter<?> jacksonMessageWriter = new EncoderHttpMessageWriter<>(
45-
new JacksonJsonEncoder(objectMapper));
45+
new JacksonJsonEncoder(jsonMapper));
4646

4747
private static final HttpMessageReader<?> jacksonMessageReader = new DecoderHttpMessageReader<>(
48-
new JacksonJsonDecoder(objectMapper));
48+
new JacksonJsonDecoder(jsonMapper));
4949

5050
@Test
5151
void fromWithEmptyWriters() {

spring-web/src/main/java/org/springframework/http/codec/json/JacksonJsonDecoder.java

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@
2525
import org.jspecify.annotations.Nullable;
2626
import org.reactivestreams.Publisher;
2727
import reactor.core.publisher.Flux;
28-
import tools.jackson.databind.ObjectMapper;
2928
import tools.jackson.databind.cfg.MapperBuilder;
3029
import tools.jackson.databind.json.JsonMapper;
3130

@@ -73,20 +72,20 @@ public JacksonJsonDecoder() {
7372
}
7473

7574
/**
76-
* Construct a new instance with the provided {@link ObjectMapper}.
75+
* Construct a new instance with the provided {@link JsonMapper}.
7776
* @see JsonMapper#builder()
7877
* @see MapperBuilder#findModules(ClassLoader)
7978
*/
80-
public JacksonJsonDecoder(ObjectMapper mapper) {
79+
public JacksonJsonDecoder(JsonMapper mapper) {
8180
this(mapper, DEFAULT_JSON_MIME_TYPES);
8281
}
8382

8483
/**
85-
* Construct a new instance with the provided {@link ObjectMapper} and {@link MimeType}s.
84+
* Construct a new instance with the provided {@link JsonMapper} and {@link MimeType}s.
8685
* @see JsonMapper#builder()
8786
* @see MapperBuilder#findModules(ClassLoader)
8887
*/
89-
public JacksonJsonDecoder(ObjectMapper mapper, MimeType... mimeTypes) {
88+
public JacksonJsonDecoder(JsonMapper mapper, MimeType... mimeTypes) {
9089
super(mapper, mimeTypes);
9190
}
9291

0 commit comments

Comments
 (0)