Skip to content

Commit 21d6131

Browse files
committed
Unwrap MappingJacksonValue before selecting ObjectMapper
See gh-28045
1 parent cb39b07 commit 21d6131

File tree

2 files changed

+31
-4
lines changed

2 files changed

+31
-4
lines changed

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

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -196,22 +196,26 @@ public Flux<DataBuffer> encode(Publisher<?> inputStream, DataBufferFactory buffe
196196
public DataBuffer encodeValue(Object value, DataBufferFactory bufferFactory,
197197
ResolvableType valueType, @Nullable MimeType mimeType, @Nullable Map<String, Object> hints) {
198198

199-
ObjectMapper mapper = selectObjectMapper(valueType, mimeType);
200-
if (mapper == null) {
201-
throw new IllegalStateException("No ObjectMapper for " + valueType);
202-
}
203199
Class<?> jsonView = null;
204200
FilterProvider filters = null;
205201
if (value instanceof MappingJacksonValue) {
206202
MappingJacksonValue container = (MappingJacksonValue) value;
207203
value = container.getValue();
204+
valueType = ResolvableType.forInstance(value);
208205
jsonView = container.getSerializationView();
209206
filters = container.getFilters();
210207
}
208+
209+
ObjectMapper mapper = selectObjectMapper(valueType, mimeType);
210+
if (mapper == null) {
211+
throw new IllegalStateException("No ObjectMapper for " + valueType);
212+
}
213+
211214
ObjectWriter writer = createObjectWriter(mapper, valueType, mimeType, jsonView, hints);
212215
if (filters != null) {
213216
writer = writer.with(filters);
214217
}
218+
215219
ByteArrayBuilder byteBuilder = new ByteArrayBuilder(writer.getFactory()._getBufferRecycler());
216220
try {
217221
JsonEncoding encoding = getJsonEncoding(mimeType);

spring-web/src/test/java/org/springframework/http/codec/json/Jackson2JsonEncoderTests.java

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -231,6 +231,29 @@ public void jacksonValue() {
231231
);
232232
}
233233

234+
@Test // gh-28045
235+
public void jacksonValueUnwrappedBeforeObjectMapperSelection() {
236+
237+
JacksonViewBean bean = new JacksonViewBean();
238+
bean.setWithView1("with");
239+
bean.setWithView2("with");
240+
bean.setWithoutView("without");
241+
242+
MappingJacksonValue jacksonValue = new MappingJacksonValue(bean);
243+
jacksonValue.setSerializationView(MyJacksonView1.class);
244+
245+
ResolvableType type = ResolvableType.forClass(MappingJacksonValue.class);
246+
247+
MediaType halMediaType = MediaType.parseMediaType("application/hal+json");
248+
ObjectMapper mapper = new ObjectMapper().configure(SerializationFeature.INDENT_OUTPUT, true);
249+
this.encoder.registerObjectMappersForType(JacksonViewBean.class, map -> map.put(halMediaType, mapper));
250+
251+
testEncode(Mono.just(jacksonValue), type, halMediaType, Collections.emptyMap(), step -> step
252+
.consumeNextWith(expectString("{\n \"withView1\" : \"with\"\n}").andThen(DataBufferUtils::release))
253+
.verifyComplete()
254+
);
255+
}
256+
234257
@Test // gh-22771
235258
public void encodeWithFlushAfterWriteOff() {
236259
ObjectMapper mapper = new ObjectMapper();

0 commit comments

Comments
 (0)