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:
committed by
Artem Bilan
parent
18bd707519
commit
90aee119e3
@@ -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()) {
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user