Skip to content

Commit 857f156

Browse files
committed
Adapt to API changes in Jackson (JSON) 2.13.4.
Cleanup deprecations in JacksonObjectToJsonConverter class that was using a deprecated API in ObjectMapper, replacing the deprecated API invocation with the equivalent API in JsonMapper.
1 parent 7250a34 commit 857f156

File tree

2 files changed

+56
-65
lines changed

2 files changed

+56
-65
lines changed

spring-geode/src/main/java/org/springframework/geode/data/json/converter/support/JacksonObjectToJsonConverter.java

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import com.fasterxml.jackson.databind.MapperFeature;
2222
import com.fasterxml.jackson.databind.ObjectMapper;
2323
import com.fasterxml.jackson.databind.SerializationFeature;
24+
import com.fasterxml.jackson.databind.json.JsonMapper;
2425

2526
import org.springframework.core.convert.ConversionFailedException;
2627
import org.springframework.core.convert.TypeDescriptor;
@@ -90,6 +91,16 @@ public class JacksonObjectToJsonConverter implements ObjectToJsonConverter {
9091
return newObjectMapper(source).writeValueAsString(source);
9192
}
9293

94+
/**
95+
* Constructs a new instance of Jackson's {@link JsonMapper.Builder}.
96+
*
97+
* @return a new instance of Jackson's {@link JsonMapper.Builder}; never {@literal null}.
98+
* @see com.fasterxml.jackson.databind.json.JsonMapper.Builder
99+
*/
100+
@NonNull JsonMapper.Builder newJsonMapperBuilder() {
101+
return JsonMapper.builder();
102+
}
103+
93104
/**
94105
* Constructs a new instance of the Jackson {@link ObjectMapper} class.
95106
*
@@ -100,24 +111,15 @@ public class JacksonObjectToJsonConverter implements ObjectToJsonConverter {
100111

101112
Assert.notNull(target, "Target object must not be null");
102113

103-
return newObjectMapper()
114+
return newJsonMapperBuilder()
104115
.addMixIn(target.getClass(), ObjectTypeMetadataMixin.class)
105116
.configure(JsonGenerator.Feature.WRITE_BIGDECIMAL_AS_PLAIN, true)
106117
.configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, true)
107118
.configure(SerializationFeature.INDENT_OUTPUT, true)
119+
.build()
108120
.findAndRegisterModules();
109121
}
110122

111-
/**
112-
* Constructs a new instance of Jackson's {@link ObjectMapper}.
113-
*
114-
* @return a new instance of Jackson's {@link ObjectMapper}; never {@literal null}.
115-
* @see com.fasterxml.jackson.databind.ObjectMapper
116-
*/
117-
@NonNull ObjectMapper newObjectMapper() {
118-
return new ObjectMapper();
119-
}
120-
121123
@JsonTypeInfo(
122124
use = JsonTypeInfo.Id.CLASS,
123125
include = JsonTypeInfo.As.PROPERTY,

spring-geode/src/test/java/org/springframework/geode/data/json/converter/support/JacksonObjectToJsonConverterUnitTests.java

Lines changed: 43 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616
package org.springframework.geode.data.json.converter.support;
1717

1818
import static org.assertj.core.api.Assertions.assertThat;
19+
import static org.assertj.core.api.Assertions.assertThatExceptionOfType;
20+
import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException;
1921
import static org.mockito.ArgumentMatchers.any;
2022
import static org.mockito.ArgumentMatchers.anyBoolean;
2123
import static org.mockito.ArgumentMatchers.eq;
@@ -34,6 +36,7 @@
3436
import com.fasterxml.jackson.databind.MapperFeature;
3537
import com.fasterxml.jackson.databind.ObjectMapper;
3638
import com.fasterxml.jackson.databind.SerializationFeature;
39+
import com.fasterxml.jackson.databind.json.JsonMapper;
3740

3841
import org.junit.Test;
3942

@@ -73,27 +76,21 @@ public void convertObjectToJson() throws JsonProcessingException {
7376
verify(mockObjectMapper, times(1)).writeValueAsString(eq(source));
7477
}
7578

76-
@Test(expected = IllegalArgumentException.class)
79+
@Test
80+
@SuppressWarnings("all")
7781
public void convertNullThrowsIllegalArgumentException() {
7882

7983
JacksonObjectToJsonConverter converter = spy(new JacksonObjectToJsonConverter());
8084

81-
try {
82-
converter.convert(null);
83-
}
84-
catch (IllegalArgumentException expected) {
85-
86-
assertThat(expected).hasMessage("Source object to convert must not be null");
87-
assertThat(expected).hasNoCause();
85+
assertThatIllegalArgumentException()
86+
.isThrownBy(() -> converter.convert(null))
87+
.withMessage("Source object to convert must not be null")
88+
.withNoCause();
8889

89-
throw expected;
90-
}
91-
finally {
92-
verify(converter, never()).newObjectMapper(any());
93-
}
90+
verify(converter, never()).newObjectMapper(any());
9491
}
9592

96-
@Test(expected = ConversionFailedException.class)
93+
@Test
9794
public void convertHandlesJsonProcessingException() throws JsonProcessingException {
9895

9996
Object source = new Object();
@@ -106,69 +103,61 @@ public void convertHandlesJsonProcessingException() throws JsonProcessingExcepti
106103
doThrow(new JsonGenerationException("TEST", (JsonGenerator) null))
107104
.when(mockObjectMapper).writeValueAsString(any());
108105

109-
try {
110-
converter.convert(source);
111-
}
112-
catch (ConversionFailedException expected) {
113-
114-
assertThat(expected.getCause()).isInstanceOf(JsonProcessingException.class);
115-
assertThat(expected.getCause()).hasMessage("TEST");
116-
assertThat(expected.getCause()).hasNoCause();
117-
118-
throw expected;
119-
}
120-
finally {
121-
verify(converter, times(1)).newObjectMapper(eq(source));
122-
verify(mockObjectMapper, times(1)).writeValueAsString(eq(source));
123-
}
106+
assertThatExceptionOfType(ConversionFailedException.class)
107+
.isThrownBy(() -> converter.convert(source))
108+
.withMessageStartingWith("Failed to convert from type [java.lang.Object] to type [java.lang.String] for value")
109+
.withMessageContaining("TEST")
110+
.withCauseInstanceOf(JsonGenerationException.class);
111+
112+
verify(converter, times(1)).newObjectMapper(eq(source));
113+
verify(mockObjectMapper, times(1)).writeValueAsString(eq(source));
124114
}
125115

126-
@Test(expected = IllegalArgumentException.class)
116+
@Test
117+
@SuppressWarnings("all")
127118
public void newObjectMapperWithNullTarget() {
128119

129-
try {
130-
new JacksonObjectToJsonConverter().newObjectMapper(null);
131-
}
132-
catch (IllegalArgumentException expected) {
133-
134-
assertThat(expected).hasMessage("Target object must not be null");
135-
assertThat(expected).hasNoCause();
136-
137-
throw expected;
138-
}
120+
assertThatIllegalArgumentException()
121+
.isThrownBy(() -> new JacksonObjectToJsonConverter().newObjectMapper(null))
122+
.withMessage("Target object must not be null")
123+
.withNoCause();
139124
}
140125

141126
@Test
142127
public void newObjectMapperIsConfiguredCorrectly() {
143128

144129
Object target = Customer.newCustomer(1L, "Jon Doe");
145130

146-
ObjectMapper mockObjectMapper = mock(ObjectMapper.class);
131+
JsonMapper mockJsonMapper = mock(JsonMapper.class);
132+
133+
JsonMapper.Builder mockJsonMapperBuilder = mock(JsonMapper.Builder.class);
147134

148135
JacksonObjectToJsonConverter converter = spy(new JacksonObjectToJsonConverter());
149136

150-
doReturn(mockObjectMapper).when(converter).newObjectMapper();
151-
doReturn(mockObjectMapper).when(mockObjectMapper).addMixIn(any(), any());
152-
doReturn(mockObjectMapper).when(mockObjectMapper).configure(any(JsonGenerator.Feature.class), anyBoolean());
153-
doReturn(mockObjectMapper).when(mockObjectMapper).configure(any(MapperFeature.class), anyBoolean());
154-
doReturn(mockObjectMapper).when(mockObjectMapper).configure(any(SerializationFeature.class), anyBoolean());
155-
doReturn(mockObjectMapper).when(mockObjectMapper).findAndRegisterModules();
137+
doReturn(mockJsonMapperBuilder).when(converter).newJsonMapperBuilder();
138+
doReturn(mockJsonMapperBuilder).when(mockJsonMapperBuilder).addMixIn(any(), any());
139+
doReturn(mockJsonMapperBuilder).when(mockJsonMapperBuilder).configure(any(JsonGenerator.Feature.class), anyBoolean());
140+
doReturn(mockJsonMapperBuilder).when(mockJsonMapperBuilder).configure(any(MapperFeature.class), anyBoolean());
141+
doReturn(mockJsonMapperBuilder).when(mockJsonMapperBuilder).configure(any(SerializationFeature.class), anyBoolean());
142+
doReturn(mockJsonMapper).when(mockJsonMapperBuilder).build();
143+
doReturn(mockJsonMapper).when(mockJsonMapper).findAndRegisterModules();
156144

157145
ObjectMapper objectMapper = converter.newObjectMapper(target);
158146

159147
assertThat(objectMapper).isNotNull();
160148

161-
verify(converter, times(1)).newObjectMapper();
149+
verify(converter, times(1)).newJsonMapperBuilder();
162150

163-
verify(mockObjectMapper, times(1))
151+
verify(mockJsonMapperBuilder, times(1))
164152
.addMixIn(eq(target.getClass()), eq(JacksonObjectToJsonConverter.ObjectTypeMetadataMixin.class));
165-
verify(mockObjectMapper, times(1))
153+
verify(mockJsonMapperBuilder, times(1))
166154
.configure(eq(JsonGenerator.Feature.WRITE_BIGDECIMAL_AS_PLAIN), eq(true));
167-
verify(mockObjectMapper, times(1))
155+
verify(mockJsonMapperBuilder, times(1))
168156
.configure(eq(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY), eq(true));
169-
verify(mockObjectMapper, times(1))
157+
verify(mockJsonMapperBuilder, times(1))
170158
.configure(eq(SerializationFeature.INDENT_OUTPUT), eq(true));
171-
verify(mockObjectMapper, times(1)).findAndRegisterModules();
172-
verifyNoMoreInteractions(mockObjectMapper);
159+
verify(mockJsonMapperBuilder, times(1)).build();
160+
verify(mockJsonMapper, times(1)).findAndRegisterModules();
161+
verifyNoMoreInteractions(mockJsonMapperBuilder, mockJsonMapper);
173162
}
174163
}

0 commit comments

Comments
 (0)