Skip to content

Commit 90aee11

Browse files
garyrussellartembilan
authored andcommitted
GH-1729: Fix JSON Regression
Resolves #1279 Regression: #1215 Test for abstract class should not be applied to container types, which can be abstract. **cherry-pick to 2.2.x**
1 parent 18bd707 commit 90aee11

File tree

2 files changed

+45
-1
lines changed

2 files changed

+45
-1
lines changed

spring-amqp/src/main/java/org/springframework/amqp/support/converter/DefaultJackson2JavaTypeMapper.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,7 @@ public JavaType toJavaType(MessageProperties properties) {
130130
}
131131

132132
private boolean canConvert(JavaType inferredType) {
133-
if (inferredType.isAbstract()) {
133+
if (inferredType.isAbstract() && !inferredType.isContainerType()) {
134134
return false;
135135
}
136136
if (inferredType.isContainerType() && inferredType.getContentType().isAbstract()) {

spring-amqp/src/test/java/org/springframework/amqp/support/converter/Jackson2JsonMessageConverterTests.java

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -366,6 +366,47 @@ void cantDeserializeFizListUseHeaders() throws Exception {
366366
assertThat(((Buz) buzs.get(0)).getField()).isEqualTo("foo");
367367
}
368368

369+
@Test
370+
void concreteInListRegression() throws Exception {
371+
byte[] bytes = "[{\"name\":\"bar\"}]".getBytes();
372+
MessageProperties messageProperties = new MessageProperties();
373+
messageProperties.setInferredArgumentType(getClass().getDeclaredMethod("fooLister").getGenericReturnType());
374+
messageProperties.setHeader("__TypeId__", List.class.getName());
375+
messageProperties.setHeader("__ContentTypeId__", Object.class.getName());
376+
Message message = new Message(bytes, messageProperties);
377+
Jackson2JsonMessageConverter j2Converter = new Jackson2JsonMessageConverter();
378+
@SuppressWarnings("unchecked")
379+
List<Foo> foos = (List<Foo>) j2Converter.fromMessage(message);
380+
assertThat(foos).hasSize(1);
381+
assertThat(foos.get(0).getName()).isEqualTo("bar");
382+
}
383+
384+
@Test
385+
void concreteInMapRegression() throws Exception {
386+
byte[] bytes = "{\"test\":{\"field\":\"baz\"}}".getBytes();
387+
MessageProperties messageProperties = new MessageProperties();
388+
messageProperties.setInferredArgumentType(getClass().getDeclaredMethod("stringQuxLister").getGenericReturnType());
389+
messageProperties.setHeader("__TypeId__", Map.class.getName());
390+
messageProperties.setHeader("__KeyTypeId__", String.class.getName());
391+
messageProperties.setHeader("__ContentTypeId__", Object.class.getName());
392+
Message message = new Message(bytes, messageProperties);
393+
Jackson2JsonMessageConverter j2Converter = new Jackson2JsonMessageConverter();
394+
395+
@SuppressWarnings("unchecked")
396+
Map<String, Qux> foos = (Map<String, Qux>) j2Converter.fromMessage(message);
397+
assertThat(foos).hasSize(1);
398+
assertThat(foos.keySet().iterator().next()).isEqualTo("test");
399+
assertThat(foos.values().iterator().next().getField()).isEqualTo("baz");
400+
}
401+
402+
public List<Foo> fooLister() {
403+
return null;
404+
}
405+
406+
public Map<String, Qux> stringQuxLister() {
407+
return null;
408+
}
409+
369410
public List<Baz> bazLister() {
370411
return null;
371412
}
@@ -507,6 +548,9 @@ public static class Qux implements Baz {
507548

508549
private String field;
509550

551+
public Qux() {
552+
}
553+
510554
public Qux(String field) {
511555
this.field = field;
512556
}

0 commit comments

Comments
 (0)