Skip to content

Commit 0c7cae1

Browse files
garyrussellartembilan
authored andcommitted
Upgrade to Jackson 2.10
* Remove extraneous code * Realign white listing with similar implementation in Spring Security: fhanik/spring-security@c0b4833 * 2.10 GA
1 parent f3850b7 commit 0c7cae1

File tree

7 files changed

+42
-19
lines changed

7 files changed

+42
-19
lines changed

build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ ext {
6363
hibernateVersion = '5.4.5.Final'
6464
hsqldbVersion = '2.5.0'
6565
h2Version = '1.4.199'
66-
jacksonVersion = '2.9.9.20190807'
66+
jacksonVersion = '2.10.0'
6767
javaxActivationVersion = '1.2.0'
6868
javaxMailVersion = '1.6.2'
6969
jmsApiVersion = '2.0.1'

spring-integration-core/src/main/java/org/springframework/integration/json/JsonPropertyAccessor.java

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@
1616

1717
package org.springframework.integration.json;
1818

19-
import java.io.IOException;
2019
import java.util.AbstractList;
2120
import java.util.Iterator;
2221

@@ -113,9 +112,6 @@ else if (target instanceof String) {
113112
catch (JsonProcessingException e) {
114113
throw new AccessException("Exception while trying to deserialize String", e);
115114
}
116-
catch (IOException e) {
117-
throw new AccessException("Exception while trying to deserialize String", e);
118-
}
119115
}
120116
else {
121117
throw new IllegalStateException("Can't happen. Check SUPPORTED_CLASSES");

spring-integration-core/src/main/java/org/springframework/integration/support/json/Jackson2JsonObjectMapper.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
import com.fasterxml.jackson.databind.MapperFeature;
4141
import com.fasterxml.jackson.databind.Module;
4242
import com.fasterxml.jackson.databind.ObjectMapper;
43+
import com.fasterxml.jackson.databind.json.JsonMapper;
4344

4445
/**
4546
* Jackson 2 JSON-processor (@link https://github.com/FasterXML)
@@ -70,9 +71,10 @@ public class Jackson2JsonObjectMapper extends AbstractJacksonJsonObjectMapper<Js
7071
private final ObjectMapper objectMapper;
7172

7273
public Jackson2JsonObjectMapper() {
73-
this.objectMapper = new ObjectMapper();
74-
this.objectMapper.configure(MapperFeature.DEFAULT_VIEW_INCLUSION, false);
75-
this.objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
74+
this.objectMapper = JsonMapper.builder()
75+
.configure(MapperFeature.DEFAULT_VIEW_INCLUSION, false)
76+
.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)
77+
.build();
7678
registerWellKnownModulesIfAvailable();
7779
}
7880

spring-integration-core/src/main/java/org/springframework/integration/support/json/JacksonJsonUtils.java

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,9 @@
3434
import com.fasterxml.jackson.databind.JavaType;
3535
import com.fasterxml.jackson.databind.ObjectMapper;
3636
import com.fasterxml.jackson.databind.cfg.MapperConfig;
37+
import com.fasterxml.jackson.databind.jsontype.BasicPolymorphicTypeValidator;
3738
import com.fasterxml.jackson.databind.jsontype.NamedType;
39+
import com.fasterxml.jackson.databind.jsontype.PolymorphicTypeValidator;
3840
import com.fasterxml.jackson.databind.jsontype.TypeIdResolver;
3941
import com.fasterxml.jackson.databind.module.SimpleModule;
4042

@@ -101,6 +103,8 @@ public static ObjectMapper messagingAwareMapper(String... trustedPackages) {
101103
*
102104
* @author Rob Winch
103105
* @author Artem Bilan
106+
* @author Filip Hanik
107+
* @author Gary Russell
104108
*
105109
* @since 4.3.11
106110
*/
@@ -111,7 +115,12 @@ private static final class WhitelistTypeResolverBuilder extends ObjectMapper.Def
111115
private final String[] trustedPackages;
112116

113117
WhitelistTypeResolverBuilder(String... trustedPackages) {
114-
super(ObjectMapper.DefaultTyping.NON_FINAL);
118+
super(ObjectMapper.DefaultTyping.NON_FINAL,
119+
//we do explicit validation in the TypeIdResolver
120+
BasicPolymorphicTypeValidator.builder()
121+
.allowIfSubType(Object.class)
122+
.build());
123+
115124
this.trustedPackages =
116125
trustedPackages != null ? Arrays.copyOf(trustedPackages, trustedPackages.length) : null;
117126

@@ -120,10 +129,12 @@ private static final class WhitelistTypeResolverBuilder extends ObjectMapper.Def
120129
}
121130

122131
@Override
123-
protected TypeIdResolver idResolver(MapperConfig<?> config, JavaType baseType, Collection<NamedType> subtypes,
124-
boolean forSer, boolean forDeser) {
125-
TypeIdResolver delegate = super.idResolver(config, baseType, subtypes, forSer, forDeser);
126-
return new WhitelistTypeIdResolver(delegate, this.trustedPackages);
132+
protected TypeIdResolver idResolver(MapperConfig<?> config,
133+
JavaType baseType,
134+
PolymorphicTypeValidator subtypeValidator,
135+
Collection<NamedType> subtypes, boolean forSer, boolean forDeser) {
136+
TypeIdResolver result = super.idResolver(config, baseType, subtypeValidator, subtypes, forSer, forDeser);
137+
return new WhitelistTypeIdResolver(result, this.trustedPackages);
127138
}
128139

129140
}

spring-integration-core/src/main/java/org/springframework/integration/support/json/MessageJacksonDeserializer.java

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@
2424
import org.springframework.messaging.Message;
2525
import org.springframework.util.Assert;
2626

27-
import com.fasterxml.jackson.annotation.JsonTypeInfo;
2827
import com.fasterxml.jackson.databind.DeserializationContext;
2928
import com.fasterxml.jackson.databind.JavaType;
3029
import com.fasterxml.jackson.databind.JsonNode;
@@ -49,7 +48,6 @@ public abstract class MessageJacksonDeserializer<T extends Message<?>> extends S
4948

5049
protected MessageJacksonDeserializer(Class<T> targetType) {
5150
super(targetType);
52-
this.mapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL, JsonTypeInfo.As.PROPERTY);
5351
}
5452

5553
public void setMapper(ObjectMapper mapper) {

spring-integration-core/src/test/java/org/springframework/integration/json/ObjectToJsonTransformerTests.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,9 @@
3333
import org.springframework.messaging.MessageHeaders;
3434
import org.springframework.messaging.support.GenericMessage;
3535

36-
import com.fasterxml.jackson.core.JsonGenerator;
36+
import com.fasterxml.jackson.core.json.JsonWriteFeature;
3737
import com.fasterxml.jackson.databind.ObjectMapper;
38+
import com.fasterxml.jackson.databind.json.JsonMapper;
3839
import com.fasterxml.jackson.databind.node.ObjectNode;
3940
import com.fasterxml.jackson.databind.node.TextNode;
4041

@@ -146,8 +147,9 @@ public void objectPayload() {
146147

147148
@Test
148149
public void objectPayloadWithCustomObjectMapper() {
149-
ObjectMapper customMapper = new ObjectMapper();
150-
customMapper.configure(JsonGenerator.Feature.QUOTE_FIELD_NAMES, Boolean.FALSE);
150+
ObjectMapper customMapper = JsonMapper.builder()
151+
.configure(JsonWriteFeature.QUOTE_FIELD_NAMES, false)
152+
.build();
151153
ObjectToJsonTransformer transformer = new ObjectToJsonTransformer(new Jackson2JsonObjectMapper(customMapper));
152154
TestPerson person = new TestPerson("John", "Doe", 42);
153155
person.setAddress(new TestAddress(123, "Main Street"));

spring-integration-mqtt/src/test/java/org/springframework/integration/mqtt/BackToBackAdapterTests.java

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,15 @@ public void testSingleTopic() {
106106

107107
@Test
108108
public void testJson() {
109+
testJsonCommon("org.springframework");
110+
}
111+
112+
@Test
113+
public void testJsonNoTrust() {
114+
testJsonCommon();
115+
}
116+
117+
private void testJsonCommon(String... trusted) {
109118
MqttPahoMessageHandler adapter = new MqttPahoMessageHandler("tcp://localhost:1883", "si-test-out");
110119
adapter.setDefaultTopic("mqtt-foo");
111120
adapter.setBeanFactory(mock(BeanFactory.class));
@@ -132,7 +141,12 @@ public void testJson() {
132141
assertThat(out).isNotNull();
133142
adapter.stop();
134143
inbound.stop();
135-
assertThat(out.getPayload()).isEqualTo(new Foo("bar"));
144+
if (trusted != null) {
145+
assertThat(out.getPayload()).isEqualTo(new Foo("bar"));
146+
}
147+
else {
148+
assertThat(out.getPayload()).isNotEqualTo(new Foo("bar"));
149+
}
136150
assertThat(out.getHeaders().get(MqttHeaders.RECEIVED_TOPIC)).isEqualTo("mqtt-foo");
137151
assertThat(out.getHeaders().get("baz")).isEqualTo("qux");
138152
}

0 commit comments

Comments
 (0)