From 0c7cae15da4b389efc5d3ed31f67c8a7360cf726 Mon Sep 17 00:00:00 2001 From: Gary Russell Date: Fri, 27 Sep 2019 12:25:41 -0400 Subject: [PATCH] Upgrade to Jackson 2.10 * Remove extraneous code * Realign white listing with similar implementation in Spring Security: https://github.com/fhanik/spring-security/commit/c0b48338f43c0f82feb02127d3bf62f2701f108d * 2.10 GA --- build.gradle | 2 +- .../json/JsonPropertyAccessor.java | 4 ---- .../json/Jackson2JsonObjectMapper.java | 8 ++++--- .../support/json/JacksonJsonUtils.java | 21 ++++++++++++++----- .../json/MessageJacksonDeserializer.java | 2 -- .../json/ObjectToJsonTransformerTests.java | 8 ++++--- .../mqtt/BackToBackAdapterTests.java | 16 +++++++++++++- 7 files changed, 42 insertions(+), 19 deletions(-) diff --git a/build.gradle b/build.gradle index 6a6c83bd4d..29c3daae33 100644 --- a/build.gradle +++ b/build.gradle @@ -63,7 +63,7 @@ ext { hibernateVersion = '5.4.5.Final' hsqldbVersion = '2.5.0' h2Version = '1.4.199' - jacksonVersion = '2.9.9.20190807' + jacksonVersion = '2.10.0' javaxActivationVersion = '1.2.0' javaxMailVersion = '1.6.2' jmsApiVersion = '2.0.1' diff --git a/spring-integration-core/src/main/java/org/springframework/integration/json/JsonPropertyAccessor.java b/spring-integration-core/src/main/java/org/springframework/integration/json/JsonPropertyAccessor.java index 3503e209b2..4c9187c177 100644 --- a/spring-integration-core/src/main/java/org/springframework/integration/json/JsonPropertyAccessor.java +++ b/spring-integration-core/src/main/java/org/springframework/integration/json/JsonPropertyAccessor.java @@ -16,7 +16,6 @@ package org.springframework.integration.json; -import java.io.IOException; import java.util.AbstractList; import java.util.Iterator; @@ -113,9 +112,6 @@ public class JsonPropertyAccessor implements PropertyAccessor { catch (JsonProcessingException e) { throw new AccessException("Exception while trying to deserialize String", e); } - catch (IOException e) { - throw new AccessException("Exception while trying to deserialize String", e); - } } else { throw new IllegalStateException("Can't happen. Check SUPPORTED_CLASSES"); diff --git a/spring-integration-core/src/main/java/org/springframework/integration/support/json/Jackson2JsonObjectMapper.java b/spring-integration-core/src/main/java/org/springframework/integration/support/json/Jackson2JsonObjectMapper.java index 69be247eec..7889629a57 100644 --- a/spring-integration-core/src/main/java/org/springframework/integration/support/json/Jackson2JsonObjectMapper.java +++ b/spring-integration-core/src/main/java/org/springframework/integration/support/json/Jackson2JsonObjectMapper.java @@ -40,6 +40,7 @@ import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.MapperFeature; import com.fasterxml.jackson.databind.Module; import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.json.JsonMapper; /** * Jackson 2 JSON-processor (@link https://github.com/FasterXML) @@ -70,9 +71,10 @@ public class Jackson2JsonObjectMapper extends AbstractJacksonJsonObjectMapper config, JavaType baseType, Collection subtypes, - boolean forSer, boolean forDeser) { - TypeIdResolver delegate = super.idResolver(config, baseType, subtypes, forSer, forDeser); - return new WhitelistTypeIdResolver(delegate, this.trustedPackages); + protected TypeIdResolver idResolver(MapperConfig config, + JavaType baseType, + PolymorphicTypeValidator subtypeValidator, + Collection subtypes, boolean forSer, boolean forDeser) { + TypeIdResolver result = super.idResolver(config, baseType, subtypeValidator, subtypes, forSer, forDeser); + return new WhitelistTypeIdResolver(result, this.trustedPackages); } } diff --git a/spring-integration-core/src/main/java/org/springframework/integration/support/json/MessageJacksonDeserializer.java b/spring-integration-core/src/main/java/org/springframework/integration/support/json/MessageJacksonDeserializer.java index 241d2cc7e1..ca2af66bf3 100644 --- a/spring-integration-core/src/main/java/org/springframework/integration/support/json/MessageJacksonDeserializer.java +++ b/spring-integration-core/src/main/java/org/springframework/integration/support/json/MessageJacksonDeserializer.java @@ -24,7 +24,6 @@ import org.springframework.integration.support.MutableMessageHeaders; import org.springframework.messaging.Message; import org.springframework.util.Assert; -import com.fasterxml.jackson.annotation.JsonTypeInfo; import com.fasterxml.jackson.databind.DeserializationContext; import com.fasterxml.jackson.databind.JavaType; import com.fasterxml.jackson.databind.JsonNode; @@ -49,7 +48,6 @@ public abstract class MessageJacksonDeserializer> extends S protected MessageJacksonDeserializer(Class targetType) { super(targetType); - this.mapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL, JsonTypeInfo.As.PROPERTY); } public void setMapper(ObjectMapper mapper) { diff --git a/spring-integration-core/src/test/java/org/springframework/integration/json/ObjectToJsonTransformerTests.java b/spring-integration-core/src/test/java/org/springframework/integration/json/ObjectToJsonTransformerTests.java index 00a39981fd..0990829a97 100644 --- a/spring-integration-core/src/test/java/org/springframework/integration/json/ObjectToJsonTransformerTests.java +++ b/spring-integration-core/src/test/java/org/springframework/integration/json/ObjectToJsonTransformerTests.java @@ -33,8 +33,9 @@ import org.springframework.messaging.Message; import org.springframework.messaging.MessageHeaders; import org.springframework.messaging.support.GenericMessage; -import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.core.json.JsonWriteFeature; import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.json.JsonMapper; import com.fasterxml.jackson.databind.node.ObjectNode; import com.fasterxml.jackson.databind.node.TextNode; @@ -146,8 +147,9 @@ public class ObjectToJsonTransformerTests { @Test public void objectPayloadWithCustomObjectMapper() { - ObjectMapper customMapper = new ObjectMapper(); - customMapper.configure(JsonGenerator.Feature.QUOTE_FIELD_NAMES, Boolean.FALSE); + ObjectMapper customMapper = JsonMapper.builder() + .configure(JsonWriteFeature.QUOTE_FIELD_NAMES, false) + .build(); ObjectToJsonTransformer transformer = new ObjectToJsonTransformer(new Jackson2JsonObjectMapper(customMapper)); TestPerson person = new TestPerson("John", "Doe", 42); person.setAddress(new TestAddress(123, "Main Street")); diff --git a/spring-integration-mqtt/src/test/java/org/springframework/integration/mqtt/BackToBackAdapterTests.java b/spring-integration-mqtt/src/test/java/org/springframework/integration/mqtt/BackToBackAdapterTests.java index e87327bc6b..62c1a695f1 100644 --- a/spring-integration-mqtt/src/test/java/org/springframework/integration/mqtt/BackToBackAdapterTests.java +++ b/spring-integration-mqtt/src/test/java/org/springframework/integration/mqtt/BackToBackAdapterTests.java @@ -106,6 +106,15 @@ public class BackToBackAdapterTests { @Test public void testJson() { + testJsonCommon("org.springframework"); + } + + @Test + public void testJsonNoTrust() { + testJsonCommon(); + } + + private void testJsonCommon(String... trusted) { MqttPahoMessageHandler adapter = new MqttPahoMessageHandler("tcp://localhost:1883", "si-test-out"); adapter.setDefaultTopic("mqtt-foo"); adapter.setBeanFactory(mock(BeanFactory.class)); @@ -132,7 +141,12 @@ public class BackToBackAdapterTests { assertThat(out).isNotNull(); adapter.stop(); inbound.stop(); - assertThat(out.getPayload()).isEqualTo(new Foo("bar")); + if (trusted != null) { + assertThat(out.getPayload()).isEqualTo(new Foo("bar")); + } + else { + assertThat(out.getPayload()).isNotEqualTo(new Foo("bar")); + } assertThat(out.getHeaders().get(MqttHeaders.RECEIVED_TOPIC)).isEqualTo("mqtt-foo"); assertThat(out.getHeaders().get("baz")).isEqualTo("qux"); }