Luca Burgazzoli created CAMEL-10548:
---------------------------------------

             Summary: 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.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