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; }