From 90aee119e31ff356c22c486f3299eabfef49fcc4 Mon Sep 17 00:00:00 2001 From: Gary Russell Date: Mon, 7 Dec 2020 15:14:08 -0500 Subject: [PATCH] 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** --- .../DefaultJackson2JavaTypeMapper.java | 2 +- .../Jackson2JsonMessageConverterTests.java | 44 +++++++++++++++++++ 2 files changed, 45 insertions(+), 1 deletion(-) diff --git a/spring-amqp/src/main/java/org/springframework/amqp/support/converter/DefaultJackson2JavaTypeMapper.java b/spring-amqp/src/main/java/org/springframework/amqp/support/converter/DefaultJackson2JavaTypeMapper.java index ff83458a..a8aea4f7 100644 --- a/spring-amqp/src/main/java/org/springframework/amqp/support/converter/DefaultJackson2JavaTypeMapper.java +++ b/spring-amqp/src/main/java/org/springframework/amqp/support/converter/DefaultJackson2JavaTypeMapper.java @@ -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()) { diff --git a/spring-amqp/src/test/java/org/springframework/amqp/support/converter/Jackson2JsonMessageConverterTests.java b/spring-amqp/src/test/java/org/springframework/amqp/support/converter/Jackson2JsonMessageConverterTests.java index 8553856b..19ec20ea 100644 --- a/spring-amqp/src/test/java/org/springframework/amqp/support/converter/Jackson2JsonMessageConverterTests.java +++ b/spring-amqp/src/test/java/org/springframework/amqp/support/converter/Jackson2JsonMessageConverterTests.java @@ -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 foos = (List) 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 foos = (Map) j2Converter.fromMessage(message); + assertThat(foos).hasSize(1); + assertThat(foos.keySet().iterator().next()).isEqualTo("test"); + assertThat(foos.values().iterator().next().getField()).isEqualTo("baz"); + } + + public List fooLister() { + return null; + } + + public Map stringQuxLister() { + return null; + } + public List bazLister() { return null; } @@ -507,6 +548,9 @@ public class Jackson2JsonMessageConverterTests { private String field; + public Qux() { + } + public Qux(String field) { this.field = field; }