CAMEL-10385: springtypeconverter return null on list -> map Project: http://git-wip-us.apache.org/repos/asf/camel/repo Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/50ea01a5 Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/50ea01a5 Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/50ea01a5
Branch: refs/heads/master Commit: 50ea01a50f8daa0745a55d0017afac63ec82e1b8 Parents: 2dda57e Author: dmitriy <xhu...@gmail.com> Authored: Thu Oct 13 01:37:50 2016 -0400 Committer: Claus Ibsen <davscl...@apache.org> Committed: Fri Oct 14 09:33:09 2016 +0200 ---------------------------------------------------------------------- .../camel/spring/boot/SpringTypeConverter.java | 6 +++ .../spring/boot/issues/SimpleOgnlTest.java | 53 ++++++++++++++++++++ 2 files changed, 59 insertions(+) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/camel/blob/50ea01a5/components/camel-spring-boot/src/main/java/org/apache/camel/spring/boot/SpringTypeConverter.java ---------------------------------------------------------------------- diff --git a/components/camel-spring-boot/src/main/java/org/apache/camel/spring/boot/SpringTypeConverter.java b/components/camel-spring-boot/src/main/java/org/apache/camel/spring/boot/SpringTypeConverter.java index d7020e5..c4aff73 100644 --- a/components/camel-spring-boot/src/main/java/org/apache/camel/spring/boot/SpringTypeConverter.java +++ b/components/camel-spring-boot/src/main/java/org/apache/camel/spring/boot/SpringTypeConverter.java @@ -17,6 +17,7 @@ package org.apache.camel.spring.boot; import java.util.List; +import java.util.Map; import org.apache.camel.Exchange; import org.apache.camel.StreamCache; @@ -40,6 +41,11 @@ public class SpringTypeConverter extends TypeConverterSupport { if (type.getCanonicalName().startsWith("org.apache")) { return null; } + + // do not attempt to convert List -> Map. Ognl expression may use this converter as a fallback expecting null + if (type.isAssignableFrom(Map.class) && (value.getClass().isArray() || value instanceof List)) { + return null; + } for (ConversionService conversionService : conversionServices) { if (conversionService.canConvert(value.getClass(), type)) { http://git-wip-us.apache.org/repos/asf/camel/blob/50ea01a5/components/camel-spring-boot/src/test/java/org/apache/camel/spring/boot/issues/SimpleOgnlTest.java ---------------------------------------------------------------------- diff --git a/components/camel-spring-boot/src/test/java/org/apache/camel/spring/boot/issues/SimpleOgnlTest.java b/components/camel-spring-boot/src/test/java/org/apache/camel/spring/boot/issues/SimpleOgnlTest.java new file mode 100644 index 0000000..99fcd66 --- /dev/null +++ b/components/camel-spring-boot/src/test/java/org/apache/camel/spring/boot/issues/SimpleOgnlTest.java @@ -0,0 +1,53 @@ +package org.apache.camel.spring.boot.issues; + +import java.util.ArrayList; +import java.util.List; + +import org.apache.camel.EndpointInject; +import org.apache.camel.Produce; +import org.apache.camel.ProducerTemplate; +import org.apache.camel.builder.RouteBuilder; +import org.apache.camel.component.mock.MockEndpoint; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.test.context.junit4.SpringRunner; + +@RunWith(SpringRunner.class) +@EnableAutoConfiguration +@SpringBootTest(classes = {SimpleOgnlTest.class}) +public class SimpleOgnlTest { + @EndpointInject(uri = "mock:result") + protected MockEndpoint resultEndpoint; + + @Produce(uri = "direct:start") + protected ProducerTemplate template; + + @Test + public void testSimpleOgnlListExpression() throws Exception { + List<String> list = new ArrayList<String>(); + list.add("one"); + list.add("two"); + + resultEndpoint.expectedBodiesReceived(list.get(0)); + + template.sendBody(list); + + resultEndpoint.assertIsSatisfied(); + } + + @Configuration + public static class ContextConfig { + @Bean + public RouteBuilder route() { + return new RouteBuilder() { + public void configure() { + from("direct:start").setBody(simple("${body[0]}")).to("mock:result"); + } + }; + } + } +}