Browse Source

Add custom deserializers support to AbstractJackson2Decoder

Issue: SPR-15975
pull/1534/head
Sebastien Deleuze 8 years ago
parent
commit
74120ef00f
  1. 2
      spring-web/src/main/java/org/springframework/http/codec/json/AbstractJackson2Decoder.java
  2. 50
      spring-web/src/test/java/org/springframework/http/codec/json/Jackson2JsonDecoderTests.java

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

@ -116,7 +116,7 @@ public abstract class AbstractJackson2Decoder extends Jackson2CodecSupport imple @@ -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);

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

@ -16,12 +16,19 @@ @@ -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; @@ -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 @@ -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<TestObject> 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 @@ -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<TestObject> {
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;
}
}
}

Loading…
Cancel
Save