GH-1729: Fix JSON Regression

Resolves https://github.com/spring-projects/spring-amqp/issues/1279

Regression: #1215

Test for abstract class should not be applied to container types, which can
be abstract.

**cherry-pick to 2.2.x**
This commit is contained in:
Gary Russell
2020-12-07 15:14:08 -05:00
committed by Artem Bilan
parent 18bd707519
commit 90aee119e3
2 changed files with 45 additions and 1 deletions

View File

@@ -130,7 +130,7 @@ public class DefaultJackson2JavaTypeMapper extends AbstractJavaTypeMapper implem
}
private boolean canConvert(JavaType inferredType) {
if (inferredType.isAbstract()) {
if (inferredType.isAbstract() && !inferredType.isContainerType()) {
return false;
}
if (inferredType.isContainerType() && inferredType.getContentType().isAbstract()) {

View File

@@ -366,6 +366,47 @@ public class Jackson2JsonMessageConverterTests {
assertThat(((Buz) buzs.get(0)).getField()).isEqualTo("foo");
}
@Test
void concreteInListRegression() throws Exception {
byte[] bytes = "[{\"name\":\"bar\"}]".getBytes();
MessageProperties messageProperties = new MessageProperties();
messageProperties.setInferredArgumentType(getClass().getDeclaredMethod("fooLister").getGenericReturnType());
messageProperties.setHeader("__TypeId__", List.class.getName());
messageProperties.setHeader("__ContentTypeId__", Object.class.getName());
Message message = new Message(bytes, messageProperties);
Jackson2JsonMessageConverter j2Converter = new Jackson2JsonMessageConverter();
@SuppressWarnings("unchecked")
List<Foo> foos = (List<Foo>) j2Converter.fromMessage(message);
assertThat(foos).hasSize(1);
assertThat(foos.get(0).getName()).isEqualTo("bar");
}
@Test
void concreteInMapRegression() throws Exception {
byte[] bytes = "{\"test\":{\"field\":\"baz\"}}".getBytes();
MessageProperties messageProperties = new MessageProperties();
messageProperties.setInferredArgumentType(getClass().getDeclaredMethod("stringQuxLister").getGenericReturnType());
messageProperties.setHeader("__TypeId__", Map.class.getName());
messageProperties.setHeader("__KeyTypeId__", String.class.getName());
messageProperties.setHeader("__ContentTypeId__", Object.class.getName());
Message message = new Message(bytes, messageProperties);
Jackson2JsonMessageConverter j2Converter = new Jackson2JsonMessageConverter();
@SuppressWarnings("unchecked")
Map<String, Qux> foos = (Map<String, Qux>) j2Converter.fromMessage(message);
assertThat(foos).hasSize(1);
assertThat(foos.keySet().iterator().next()).isEqualTo("test");
assertThat(foos.values().iterator().next().getField()).isEqualTo("baz");
}
public List<Foo> fooLister() {
return null;
}
public Map<String, Qux> stringQuxLister() {
return null;
}
public List<Baz> bazLister() {
return null;
}
@@ -507,6 +548,9 @@ public class Jackson2JsonMessageConverterTests {
private String field;
public Qux() {
}
public Qux(String field) {
this.field = field;
}