Skip to content

Commit ad97f81

Browse files
artembilangaryrussell
authored andcommitted
GH-3096: Skip RESOLVABLE_TYPE header in mapping (#3098)
* GH-3096: Skip RESOLVABLE_TYPE header in mapping Fixes #3096 When we sent an AMQP message we should not map a `JsonHeaders.RESOLVABLE_TYPE` header which is a `ResolvableType` and isn not compatible after converting to string Also improve `JsonToObjectTransformer` to ignore a `JsonHeaders.RESOLVABLE_TYPE` when it is type of String * * Fix `obtainResolvableTypeFromHeadersIfAny()` logic
1 parent 845a396 commit ad97f81

File tree

3 files changed

+29
-11
lines changed

3 files changed

+29
-11
lines changed

spring-integration-amqp/src/main/java/org/springframework/integration/amqp/support/DefaultAmqpHeaderMapper.java

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -263,13 +263,15 @@ private void mapJsonHeaders(Map<String, Object> headers, MessageProperties amqpM
263263
Map<String, String> jsonHeaders = new HashMap<>();
264264

265265
for (String jsonHeader : JsonHeaders.HEADERS) {
266-
Object value = getHeaderIfAvailable(headers, jsonHeader, Object.class);
267-
if (value != null) {
268-
headers.remove(jsonHeader);
269-
if (value instanceof Class<?>) {
270-
value = ((Class<?>) value).getName();
266+
if (!JsonHeaders.RESOLVABLE_TYPE.equals(jsonHeader)) {
267+
Object value = getHeaderIfAvailable(headers, jsonHeader, Object.class);
268+
if (value != null) {
269+
headers.remove(jsonHeader);
270+
if (value instanceof Class<?>) {
271+
value = ((Class<?>) value).getName();
272+
}
273+
jsonHeaders.put(jsonHeader.replaceFirst(JsonHeaders.PREFIX, ""), value.toString());
271274
}
272-
jsonHeaders.put(jsonHeader.replaceFirst(JsonHeaders.PREFIX, ""), value.toString());
273275
}
274276
}
275277
amqpMessageProperties.getHeaders().putAll(jsonHeaders);

spring-integration-amqp/src/test/java/org/springframework/integration/amqp/support/DefaultAmqpHeaderMapperTests.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import static org.assertj.core.api.Assertions.fail;
2121
import static org.mockito.Mockito.mock;
2222

23+
import java.util.Collections;
2324
import java.util.Date;
2425
import java.util.HashMap;
2526
import java.util.Map;
@@ -33,7 +34,9 @@
3334
import org.springframework.amqp.support.AmqpHeaders;
3435
import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter;
3536
import org.springframework.amqp.support.converter.MessageConverter;
37+
import org.springframework.core.ResolvableType;
3638
import org.springframework.http.MediaType;
39+
import org.springframework.integration.mapping.support.JsonHeaders;
3740
import org.springframework.messaging.MessageChannel;
3841
import org.springframework.messaging.MessageHeaders;
3942
import org.springframework.messaging.support.GenericMessage;
@@ -310,4 +313,16 @@ public void inboundOutbound() {
310313
assertThat(headers.get("x-death")).isEqualTo("foo");
311314
}
312315

316+
@Test
317+
public void jsonHeadersResolvableTypeSkipped() {
318+
DefaultAmqpHeaderMapper headerMapper = DefaultAmqpHeaderMapper.outboundMapper();
319+
MessageHeaders integrationHeaders =
320+
new MessageHeaders(
321+
Collections.singletonMap(JsonHeaders.RESOLVABLE_TYPE, ResolvableType.forClass(String.class)));
322+
MessageProperties amqpProperties = new MessageProperties();
323+
headerMapper.fromHeadersToReply(integrationHeaders, amqpProperties);
324+
325+
assertThat(amqpProperties.getHeaders()).doesNotContainKeys(JsonHeaders.RESOLVABLE_TYPE);
326+
}
327+
313328
}

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

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -144,11 +144,11 @@ protected Object doTransform(Message<?> message) {
144144
}
145145
}
146146

147-
147+
@Nullable
148148
private ResolvableType obtainResolvableTypeFromHeadersIfAny(MessageHeaders headers) {
149-
ResolvableType valueType = headers.get(JsonHeaders.RESOLVABLE_TYPE, ResolvableType.class);
149+
Object valueType = headers.get(JsonHeaders.RESOLVABLE_TYPE);
150150
Object typeIdHeader = headers.get(JsonHeaders.TYPE_ID);
151-
if (valueType == null && typeIdHeader != null) {
151+
if (typeIdHeader != null) {
152152
Class<?> targetClass = getClassForValue(typeIdHeader);
153153
Class<?> contentClass = null;
154154
Class<?> keyClass = null;
@@ -163,8 +163,9 @@ private ResolvableType obtainResolvableTypeFromHeadersIfAny(MessageHeaders heade
163163

164164
valueType = JsonObjectMapper.buildResolvableType(targetClass, contentClass, keyClass);
165165
}
166-
167-
return valueType;
166+
return valueType instanceof ResolvableType
167+
? (ResolvableType) valueType
168+
: null;
168169
}
169170

170171
private Class<?> getClassForValue(Object classValue) {

0 commit comments

Comments
 (0)