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/dc640034
Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/dc640034
Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/dc640034

Branch: refs/heads/camel-2.18.x
Commit: dc640034ce71ae30dfd4058992897969bc3835d7
Parents: 92630af
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:32:47 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/dc640034/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/dc640034/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");
+                }
+            };
+        }
+    }
+}

Reply via email to