[ 
https://issues.apache.org/jira/browse/CAMEL-10548?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Luca Burgazzoli updated CAMEL-10548:
------------------------------------
    Fix Version/s: 2.18.2

> Converter from List to String is not found when @EnableAutoConfiguration is 
> used
> --------------------------------------------------------------------------------
>
>                 Key: CAMEL-10548
>                 URL: https://issues.apache.org/jira/browse/CAMEL-10548
>             Project: Camel
>          Issue Type: Bug
>          Components: camel-spring-boot
>            Reporter: Luca Burgazzoli
>            Assignee: Luca Burgazzoli
>             Fix For: 2.18.2, 2.19.0
>
>
> This very simple spring-boot application :
> {code:java}
> @SpringBootApplication
> public class Application {
>     public static void main(String[] args) {
>         SpringApplication.run(Application.class, args);
>     }
>     @Component
>     public class MyRouteBuilder extends RouteBuilder {
>         @Override
>         public void configure() throws Exception {
>             from("timer:person")
>                 .setBody().constant(Arrays.asList(
>                     new Person("Peter", 25),
>                     new Person("John", 33)
>                 ))
>                 .log("Body is ${body}");
>         }
>     }
>     public static class Person {
>         private String name;
>         private int age;
>         public Person(String name, int age) {
>             this.name = name;
>             this.age = age;
>         }
>         public String getName() {
>             return name;
>         }
>         public void setName(String name) {
>             this.name = name;
>         }
>         public int getAge() {
>             return age;
>         }
>         public void setAge(int age) {
>             this.age = age;
>         }
>         @Override
>         public String toString() {
>             return "Person{" +
>                 "name='" + name + '\'' +
>                 ", age=" + age +
>                 '}';
>         }
>     }
> }
> {code}
> Fails to resolve the simple expression ${body} because of the following 
> exception:
> {code}
> org.apache.camel.TypeConversionException: Error during type conversion from 
> type: java.lang.String to the required type: java.lang.String with value 
> [Person{name='Peter', age=25}, Person{name='John', age=33}] due Failed to 
> convert from type [java.util.Arrays$ArrayList<?>] to type [java.lang.String] 
> for value '[Person{name='Peter', age=25}, Person{name='John', age=33}]'; 
> nested exception is 
> org.springframework.core.convert.ConverterNotFoundException: No converter 
> found capable of converting from type [java.util.Arrays$ArrayList<?>] to type 
> [java.lang.String]
>       at 
> org.apache.camel.impl.converter.BaseTypeConverterRegistry.createTypeConversionException(BaseTypeConverterRegistry.java:629)
>  ~[camel-core-2.18.0.jar:2.18.0]
>       at 
> org.apache.camel.impl.converter.BaseTypeConverterRegistry.convertTo(BaseTypeConverterRegistry.java:150)
>  ~[camel-core-2.18.0.jar:2.18.0]
>       at 
> org.apache.camel.support.ExpressionAdapter.evaluate(ExpressionAdapter.java:41)
>  ~[camel-core-2.18.0.jar:2.18.0]
>       at 
> org.apache.camel.builder.ExpressionBuilder$75.evaluate(ExpressionBuilder.java:1795)
>  ~[camel-core-2.18.0.jar:2.18.0]
>       at 
> org.apache.camel.support.ExpressionAdapter.evaluate(ExpressionAdapter.java:36)
>  ~[camel-core-2.18.0.jar:2.18.0]
>       at 
> org.apache.camel.processor.LogProcessor.process(LogProcessor.java:53) 
> ~[camel-core-2.18.0.jar:2.18.0]
>       at 
> org.apache.camel.management.InstrumentationProcessor.process(InstrumentationProcessor.java:77)
>  ~[camel-core-2.18.0.jar:2.18.0]
>       at 
> org.apache.camel.processor.RedeliveryErrorHandler.process(RedeliveryErrorHandler.java:542)
>  ~[camel-core-2.18.0.jar:2.18.0]
>       at 
> org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:197)
>  [camel-core-2.18.0.jar:2.18.0]
>       at org.apache.camel.processor.Pipeline.process(Pipeline.java:120) 
> ~[camel-core-2.18.0.jar:2.18.0]
>       at org.apache.camel.processor.Pipeline.process(Pipeline.java:83) 
> ~[camel-core-2.18.0.jar:2.18.0]
>       at 
> org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:197)
>  [camel-core-2.18.0.jar:2.18.0]
>       at 
> org.apache.camel.component.timer.TimerConsumer.sendTimerExchange(TimerConsumer.java:192)
>  [camel-core-2.18.0.jar:2.18.0]
>       at 
> org.apache.camel.component.timer.TimerConsumer$1.run(TimerConsumer.java:76) 
> [camel-core-2.18.0.jar:2.18.0]
>       at java.util.TimerThread.mainLoop(Timer.java:555) [na:1.8.0_112]
>       at java.util.TimerThread.run(Timer.java:505) [na:1.8.0_112]
> Caused by: org.springframework.core.convert.ConversionFailedException: Failed 
> to convert from type [java.util.Arrays$ArrayList<?>] to type 
> [java.lang.String] for value '[Person{name='Peter', age=25}, 
> Person{name='John', age=33}]'; nested exception is 
> org.springframework.core.convert.ConverterNotFoundException: No converter 
> found capable of converting from type [java.util.Arrays$ArrayList<?>] to type 
> [java.lang.String]
>       at 
> org.springframework.core.convert.support.ConversionUtils.invokeConverter(ConversionUtils.java:42)
>  ~[spring-core-4.3.3.RELEASE.jar:4.3.3.RELEASE]
>       at 
> org.springframework.core.convert.support.GenericConversionService.convert(GenericConversionService.java:192)
>  ~[spring-core-4.3.3.RELEASE.jar:4.3.3.RELEASE]
>       at 
> org.springframework.core.convert.support.GenericConversionService.convert(GenericConversionService.java:176)
>  ~[spring-core-4.3.3.RELEASE.jar:4.3.3.RELEASE]
>       at 
> org.apache.camel.spring.boot.SpringTypeConverter.convertTo(SpringTypeConverter.java:46)
>  ~[camel-spring-boot-2.18.0.jar:2.18.0]
>       at 
> org.apache.camel.impl.converter.BaseTypeConverterRegistry.doConvertTo(BaseTypeConverterRegistry.java:346)
>  ~[camel-core-2.18.0.jar:2.18.0]
>       at 
> org.apache.camel.impl.converter.BaseTypeConverterRegistry.convertTo(BaseTypeConverterRegistry.java:133)
>  ~[camel-core-2.18.0.jar:2.18.0]
>       ... 14 common frames omitted
> Caused by: org.springframework.core.convert.ConverterNotFoundException: No 
> converter found capable of converting from type 
> [java.util.Arrays$ArrayList<?>] to type [java.lang.String]
>       at 
> org.springframework.core.convert.support.GenericConversionService.handleConverterNotFound(GenericConversionService.java:313)
>  ~[spring-core-4.3.3.RELEASE.jar:4.3.3.RELEASE]
>       at 
> org.springframework.core.convert.support.GenericConversionService.convert(GenericConversionService.java:195)
>  ~[spring-core-4.3.3.RELEASE.jar:4.3.3.RELEASE]
>       at 
> org.springframework.core.convert.support.CollectionToStringConverter.convert(CollectionToStringConverter.java:68)
>  ~[spring-core-4.3.3.RELEASE.jar:4.3.3.RELEASE]
>       at 
> org.springframework.core.convert.support.ConversionUtils.invokeConverter(ConversionUtils.java:36)
>  ~[spring-core-4.3.3.RELEASE.jar:4.3.3.RELEASE]
>       ... 19 common frames omitted
> {code}
> The root cause is spring failing to find a converter for Person --> String 
> and as the SpringTypeConverter registered by camel-spring-boot is one of the 
> fallback converters used by BaseTypeConverterRegistry, it leads Camel to fail 
> too.
> As today is a Camel TypeConverter fails with an exception while looping over 
> fallback converters, the loops ends and the conversion fails too. It may turn 
> out that the bug is caused by the way camel uses Spring's type converters but 
> it may be good to catch exceptions and try the next converter, [~davsclaus] 
> make sense ?
> A workaround is to create a custom converter for the class:
> {code:java}
>     @Component
>     public class PersonConverter implements Converter<Person, String> {
>         @Override
>         public String convert(Person source) {
>             return source.toString();
>         }
>     }
> {code}



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to