From 74120ef00f149c10521b52948711de0e700b4e06 Mon Sep 17 00:00:00 2001 From: Sebastien Deleuze Date: Mon, 25 Sep 2017 23:17:32 +0200 Subject: [PATCH] Add custom deserializers support to AbstractJackson2Decoder Issue: SPR-15975 --- .../codec/json/AbstractJackson2Decoder.java | 2 +- .../codec/json/Jackson2JsonDecoderTests.java | 50 +++++++++++++++++++ 2 files changed, 51 insertions(+), 1 deletion(-) diff --git a/spring-web/src/main/java/org/springframework/http/codec/json/AbstractJackson2Decoder.java b/spring-web/src/main/java/org/springframework/http/codec/json/AbstractJackson2Decoder.java index 5178fe94ed5..3849d5abdb7 100644 --- a/spring-web/src/main/java/org/springframework/http/codec/json/AbstractJackson2Decoder.java +++ b/spring-web/src/main/java/org/springframework/http/codec/json/AbstractJackson2Decoder.java @@ -116,7 +116,7 @@ public abstract class AbstractJackson2Decoder extends Jackson2CodecSupport imple return tokens.map(tokenBuffer -> { try { - return reader.readValue(tokenBuffer.asParser()); + return reader.readValue(tokenBuffer.asParser(getObjectMapper())); } catch (InvalidDefinitionException ex) { throw new CodecException("Type definition error: " + ex.getType(), ex); diff --git a/spring-web/src/test/java/org/springframework/http/codec/json/Jackson2JsonDecoderTests.java b/spring-web/src/test/java/org/springframework/http/codec/json/Jackson2JsonDecoderTests.java index 0c43228e95c..544323b99f1 100644 --- a/spring-web/src/test/java/org/springframework/http/codec/json/Jackson2JsonDecoderTests.java +++ b/spring-web/src/test/java/org/springframework/http/codec/json/Jackson2JsonDecoderTests.java @@ -16,12 +16,19 @@ package org.springframework.http.codec.json; +import java.io.IOException; import java.nio.charset.StandardCharsets; import java.util.Collections; import java.util.List; import java.util.Map; +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.DeserializationContext; +import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.fasterxml.jackson.databind.deser.std.StdDeserializer; import org.junit.Test; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; @@ -32,6 +39,7 @@ import org.springframework.core.codec.CodecException; import org.springframework.core.codec.DecodingException; import org.springframework.core.io.buffer.AbstractDataBufferAllocatingTestCase; import org.springframework.core.io.buffer.DataBuffer; +import org.springframework.core.io.buffer.DefaultDataBufferFactory; import org.springframework.http.codec.Pojo; import org.springframework.util.MimeType; @@ -210,6 +218,19 @@ public class Jackson2JsonDecoderTests extends AbstractDataBufferAllocatingTestCa StepVerifier.create(flux).verifyError(CodecException.class); } + @Test // SPR-15975 + public void customDeserializer() { + DataBuffer buffer = new DefaultDataBufferFactory().wrap("{\"test\": 1}".getBytes()); + + Jackson2JsonDecoder decoder = new Jackson2JsonDecoder(new ObjectMapper()); + Flux decoded = decoder.decode(Mono.just(buffer), + ResolvableType.forClass(TestObject.class), null, null).cast(TestObject.class); + + StepVerifier.create(decoded) + .assertNext(v -> assertEquals(1, v.getTest())) + .verifyComplete(); + } + private static class BeanWithNoDefaultConstructor { @@ -232,4 +253,33 @@ public class Jackson2JsonDecoderTests extends AbstractDataBufferAllocatingTestCa } + @JsonDeserialize(using = Deserializer.class) + public static class TestObject { + private int test; + public int getTest() { + return test; + } + public void setTest(int test) { + this.test = test; + } + } + + public static class Deserializer extends StdDeserializer { + + private static final long serialVersionUID = 1L; + + protected Deserializer() { + super(TestObject.class); + } + + @Override + public TestObject deserialize(JsonParser p, + DeserializationContext ctxt) throws IOException, JsonProcessingException { + JsonNode node = p.readValueAsTree(); + TestObject result = new TestObject(); + result.setTest(node.get("test").asInt()); + return result; + } + } + }