camel-issues mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Claus Ibsen (JIRA)" <j...@apache.org>
Subject [jira] [Resolved] (CAMEL-9680) Stream caching is broken under Spring Boot
Date Wed, 09 Mar 2016 09:58:40 GMT

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

Claus Ibsen resolved CAMEL-9680.
--------------------------------
    Resolution: Fixed

Thanks for reporting and the test.

I have fixed the type converter to not attempt converter camel stuff.

We can then consider turning off the bridge type converter all together by default if it causes
more trouble.

Or if it really makes sense to have it enabled? I wonder what it brings to the table for Camel
users?

> Stream caching is broken under Spring Boot
> ------------------------------------------
>
>                 Key: CAMEL-9680
>                 URL: https://issues.apache.org/jira/browse/CAMEL-9680
>             Project: Camel
>          Issue Type: Bug
>          Components: camel-spring-boot
>    Affects Versions: 2.16.2
>            Reporter: Jostein Gogstad
>            Assignee: Claus Ibsen
>             Fix For: 2.16.3, 2.17.0
>
>
> As documented in the [camel-spring-boot documentation|https://camel.apache.org/spring-boot.html],
camel-spring-boot will delegate type conversion to Spring by default (see {{org.apache.camel.spring.boot.TypeConversionConfiguration}}).
Whenever the body of a route changes to a List, Spring believes it can convert it and fails.
See the supplied test.
> The runs correctly if the {{SpringTypeConverter}} is removed.
> {code:java|title=StreamCachingTest.java}
> package com.example.bugs;
> import org.apache.camel.CamelContext;
> import org.apache.camel.EndpointInject;
> import org.apache.camel.builder.RouteBuilder;
> import org.apache.camel.component.mock.MockEndpoint;
> import org.apache.camel.spring.boot.SpringTypeConverter;
> import org.apache.camel.test.junit4.CamelTestSupport;
> import org.junit.Test;
> import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
> import org.springframework.context.ApplicationContext;
> import org.springframework.context.annotation.Bean;
> import org.springframework.core.convert.ConversionService;
> import org.springframework.core.convert.converter.Converter;
> import org.springframework.core.convert.support.DefaultConversionService;
> import java.io.File;
> import java.io.FileInputStream;
> import java.util.List;
> import static java.util.Arrays.asList;
> public class StreamCachingTest extends CamelTestSupport {
>     public static final String URI_END_OF_ROUTE = "mock:end_of_route";
>     @EndpointInject(uri = URI_END_OF_ROUTE)
>     private MockEndpoint endOfRoute;
>     @Override
>     protected RouteBuilder createRouteBuilder() throws Exception {
>         return new RouteBuilder() {
>             @Override
>             public void configure() throws Exception {
>                 context.getTypeConverterRegistry().addFallbackTypeConverter(springTypeConverter(context,
new ConversionService[]{new DefaultConversionService()}), true);
>                 from("direct:foo")
>                     .streamCaching()
>                     .bean(MyBean.class)
>                     .to(URI_END_OF_ROUTE);
>             }
>         };
>     }
>     @Test
>     public void stream_caching_with_spring() throws Exception {
>         endOfRoute.expectedMessageCount(1);
>         template.sendBody("direct:foo", new FileInputStream(new File("src/main/resources/banner.txt")));
>         endOfRoute.assertIsSatisfied();
>     }
>     public static class MyBean {
>         public List<Integer> someNumbers() {
>             return asList(1, 2, 3);
>         }
>     }
>     /**
>      * Copied from org.apache.camel.spring.boot.TypeConversionConfiguration (they are
package protected)
>      **/
>     @Bean
>     SpringTypeConverter springTypeConverter(CamelContext camelContext, ConversionService[]
conversionServices) {
>         SpringTypeConverter springTypeConverter = new SpringTypeConverter(asList(conversionServices));
>         camelContext.getTypeConverterRegistry().addFallbackTypeConverter(springTypeConverter,
true);
>         return springTypeConverter;
>     }
>     @ConditionalOnMissingBean
>     @Bean
>     ConversionService defaultCamelConversionService(ApplicationContext applicationContext)
{
>         DefaultConversionService service = new DefaultConversionService();
>         for (Converter converter : applicationContext.getBeansOfType(Converter.class).values())
{
>             service.addConverter(converter);
>         }
>         return service;
>     }
> }
> {code}
> Result:
> {code:none}
> org.apache.camel.CamelExecutionException: Exception occurred during execution on the
exchange: Exchange[ID-CAW811-53239-1457446127171-0-2][Message: 1,2,3]
> 	at org.apache.camel.util.ObjectHelper.wrapCamelExecutionException(ObjectHelper.java:1658)
> 	at org.apache.camel.util.ExchangeHelper.extractResultBody(ExchangeHelper.java:646)
> 	at org.apache.camel.impl.DefaultProducerTemplate.extractResultBody(DefaultProducerTemplate.java:471)
> 	at org.apache.camel.impl.DefaultProducerTemplate.extractResultBody(DefaultProducerTemplate.java:467)
> 	at org.apache.camel.impl.DefaultProducerTemplate.sendBody(DefaultProducerTemplate.java:139)
> 	at org.apache.camel.impl.DefaultProducerTemplate.sendBody(DefaultProducerTemplate.java:144)
> 	at no.avinor.agressointegration.StreamCachingTest.stream_caching_with_spring(StreamCachingTest.java:50)
> 	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
> 	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
> 	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
> 	at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
> 	at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
> 	at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
> 	at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
> 	at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
> 	at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:27)
> 	at org.junit.rules.TestWatcher$1.evaluate(TestWatcher.java:55)
> 	at org.junit.rules.TestWatcher$1.evaluate(TestWatcher.java:55)
> 	at org.junit.rules.RunRules.evaluate(RunRules.java:20)
> 	at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
> 	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
> 	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
> 	at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
> 	at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
> 	at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
> 	at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
> 	at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
> 	at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:27)
> 	at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
> 	at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
> 	at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:78)
> 	at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:212)
> 	at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:68)
> 	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
> 	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
> 	at com.intellij.rt.execution.application.AppMain.main(AppMain.java:140)
> Caused by: org.apache.camel.TypeConversionException: Error during type conversion from
type: java.lang.String to the required type: org.apache.camel.StreamCache with value 1,2,3
due Failed to convert from type [java.util.Arrays$ArrayList<?>] to type [org.apache.camel.StreamCache]
for value '[1, 2, 3]'; nested exception is org.springframework.core.convert.ConverterNotFoundException:
No converter found capable of converting from type [java.util.Arrays$ArrayList<?>] to
type [org.apache.camel.StreamCache]
> 	at org.apache.camel.impl.converter.BaseTypeConverterRegistry.createTypeConversionException(BaseTypeConverterRegistry.java:610)
> 	at org.apache.camel.impl.converter.BaseTypeConverterRegistry.convertTo(BaseTypeConverterRegistry.java:137)
> 	at org.apache.camel.impl.MessageSupport.getBody(MessageSupport.java:72)
> 	at org.apache.camel.impl.MessageSupport.getBody(MessageSupport.java:47)
> 	at org.apache.camel.impl.DefaultStreamCachingStrategy.cache(DefaultStreamCachingStrategy.java:189)
> 	at org.apache.camel.processor.CamelInternalProcessor$StreamCachingAdvice.before(CamelInternalProcessor.java:765)
> 	at org.apache.camel.processor.CamelInternalProcessor$StreamCachingAdvice.before(CamelInternalProcessor.java:744)
> 	at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:138)
> 	at org.apache.camel.processor.Pipeline.process(Pipeline.java:121)
> 	at org.apache.camel.processor.Pipeline.process(Pipeline.java:83)
> 	at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:190)
> 	at org.apache.camel.component.direct.DirectProducer.process(DirectProducer.java:62)
> 	at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:190)
> 	at org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcessorHelper.java:109)
> 	at org.apache.camel.processor.UnitOfWorkProducer.process(UnitOfWorkProducer.java:68)
> 	at org.apache.camel.impl.ProducerCache$2.doInProducer(ProducerCache.java:412)
> 	at org.apache.camel.impl.ProducerCache$2.doInProducer(ProducerCache.java:380)
> 	at org.apache.camel.impl.ProducerCache.doInProducer(ProducerCache.java:270)
> 	at org.apache.camel.impl.ProducerCache.sendExchange(ProducerCache.java:380)
> 	at org.apache.camel.impl.ProducerCache.send(ProducerCache.java:221)
> 	at org.apache.camel.impl.DefaultProducerTemplate.send(DefaultProducerTemplate.java:124)
> 	at org.apache.camel.impl.DefaultProducerTemplate.sendBody(DefaultProducerTemplate.java:137)
> 	... 34 more
> Caused by: org.springframework.core.convert.ConversionFailedException: Failed to convert
from type [java.util.Arrays$ArrayList<?>] to type [org.apache.camel.StreamCache] for
value '[1, 2, 3]'; nested exception is org.springframework.core.convert.ConverterNotFoundException:
No converter found capable of converting from type [java.util.Arrays$ArrayList<?>] to
type [org.apache.camel.StreamCache]
> 	at org.springframework.core.convert.support.ConversionUtils.invokeConverter(ConversionUtils.java:41)
> 	at org.springframework.core.convert.support.GenericConversionService.convert(GenericConversionService.java:192)
> 	at org.springframework.core.convert.support.GenericConversionService.convert(GenericConversionService.java:176)
> 	at org.apache.camel.spring.boot.SpringTypeConverter.convertTo(SpringTypeConverter.java:40)
> 	at org.apache.camel.impl.converter.BaseTypeConverterRegistry.doConvertTo(BaseTypeConverterRegistry.java:333)
> 	at org.apache.camel.impl.converter.BaseTypeConverterRegistry.convertTo(BaseTypeConverterRegistry.java:120)
> 	... 54 more
> Caused by: org.springframework.core.convert.ConverterNotFoundException: No converter
found capable of converting from type [java.util.Arrays$ArrayList<?>] to type [org.apache.camel.StreamCache]
> 	at org.springframework.core.convert.support.GenericConversionService.handleConverterNotFound(GenericConversionService.java:313)
> 	at org.springframework.core.convert.support.GenericConversionService.convert(GenericConversionService.java:195)
> 	at org.springframework.core.convert.support.CollectionToObjectConverter.convert(CollectionToObjectConverter.java:64)
> 	at org.springframework.core.convert.support.ConversionUtils.invokeConverter(ConversionUtils.java:35)
> 	... 59 more
> {code}



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

Mime
View raw message