Krzysztof Szafrański created CAMEL-11431:
--------------------------------------------
Summary: Spring beans with autowired constructors
Key: CAMEL-11431
URL: https://issues.apache.org/jira/browse/CAMEL-11431
Project: Camel
Issue Type: Bug
Components: camel-core, camel-spring
Affects Versions: 2.19.0
Reporter: Krzysztof Szafrański
I have stumbled upon an issue when using Spring beans in routes using the
following syntax:
{code:java}
from(...).bean(MySpringBean.class)
{code}
I haven't found a relevant entry in Camel's documentation whether that is a
valid use in conjunction with Spring, but it actually works... most of the
time. It does not work when MySpringBean uses constructor injection (it is OK
with field injection).
I have traced the issue to this part of org.apache.camel.model.BeanDefinition:
{code:java}
// create a bean if there is a default public no-arg constructor
if (isCacheBean() && ObjectHelper.hasDefaultPublicNoArgConstructor(clazz)) {
bean = CamelContextHelper.newInstance(routeContext.getCamelContext(),
clazz);
ObjectHelper.notNull(bean, "bean", this);
}
{code}
When constructor injection is used the above condition does not hold, and
instead of having beanHolder of type ConstantBeanHolder we end up with
ConstantStaticTypeBeanHolder, whose getBean() method always returns null.
In effect I'm getting this stacktrace:
{code}
java.lang.NullPointerException: null
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at
org.apache.camel.component.bean.MethodInfo.invoke(MethodInfo.java:472)
at
org.apache.camel.component.bean.MethodInfo$1.doProceed(MethodInfo.java:291)
at
org.apache.camel.component.bean.MethodInfo$1.proceed(MethodInfo.java:264)
at
org.apache.camel.component.bean.BeanProcessor.process(BeanProcessor.java:178)
at
org.apache.camel.management.InstrumentationProcessor.process(InstrumentationProcessor.java:77)
at
org.apache.camel.processor.RedeliveryErrorHandler.process(RedeliveryErrorHandler.java:541)
at
org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:198)
at org.apache.camel.processor.Pipeline.process(Pipeline.java:120)
at org.apache.camel.processor.Pipeline.process(Pipeline.java:83)
at
org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:198)
at
org.apache.camel.processor.DelegateAsyncProcessor.process(DelegateAsyncProcessor.java:97)
at
org.apache.camel.processor.aggregate.AggregateProcessor$1.run(AggregateProcessor.java:763)
at
java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at
org.apache.camel.util.concurrent.SynchronousExecutorService.execute(SynchronousExecutorService.java:62)
at
java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:112)
at
org.apache.camel.processor.aggregate.AggregateProcessor.onSubmitCompletion(AggregateProcessor.java:755)
at
org.apache.camel.processor.aggregate.AggregateProcessor.doProcess(AggregateProcessor.java:355)
at
org.apache.camel.processor.aggregate.AggregateProcessor.process(AggregateProcessor.java:268)
at
org.apache.camel.management.InstrumentationProcessor.process(InstrumentationProcessor.java:77)
at
org.apache.camel.processor.RedeliveryErrorHandler.process(RedeliveryErrorHandler.java:541)
at
org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:198)
at org.apache.camel.processor.Pipeline.process(Pipeline.java:120)
at org.apache.camel.processor.Pipeline.process(Pipeline.java:83)
at
org.apache.camel.processor.RedeliveryErrorHandler.process(RedeliveryErrorHandler.java:541)
at
org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:198)
at
org.apache.camel.processor.MulticastProcessor.doProcessSequential(MulticastProcessor.java:695)
at
org.apache.camel.processor.MulticastProcessor.doProcessSequential(MulticastProcessor.java:623)
at
org.apache.camel.processor.MulticastProcessor.process(MulticastProcessor.java:247)
at org.apache.camel.processor.Splitter.process(Splitter.java:114)
at
org.apache.camel.management.InstrumentationProcessor.process(InstrumentationProcessor.java:77)
at
org.apache.camel.processor.RedeliveryErrorHandler.process(RedeliveryErrorHandler.java:541)
at
org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:198)
at
org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:198)
at
org.apache.camel.component.direct.DirectProducer.process(DirectProducer.java:62)
at
org.apache.camel.processor.SendProcessor.process(SendProcessor.java:145)
at
org.apache.camel.management.InstrumentationProcessor.process(InstrumentationProcessor.java:77)
at
org.apache.camel.processor.RedeliveryErrorHandler.process(RedeliveryErrorHandler.java:541)
at
org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:198)
at
org.apache.camel.processor.ChoiceProcessor.process(ChoiceProcessor.java:117)
at
org.apache.camel.management.InstrumentationProcessor.process(InstrumentationProcessor.java:77)
at
org.apache.camel.processor.RedeliveryErrorHandler.process(RedeliveryErrorHandler.java:541)
at
org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:198)
at
org.apache.camel.processor.RedeliveryErrorHandler.process(RedeliveryErrorHandler.java:541)
at
org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:198)
at
org.apache.camel.processor.MulticastProcessor.doProcessSequential(MulticastProcessor.java:695)
at
org.apache.camel.processor.MulticastProcessor.doProcessSequential(MulticastProcessor.java:623)
at
org.apache.camel.processor.MulticastProcessor.process(MulticastProcessor.java:247)
at org.apache.camel.processor.Splitter.process(Splitter.java:114)
at
org.apache.camel.management.InstrumentationProcessor.process(InstrumentationProcessor.java:77)
at
org.apache.camel.processor.RedeliveryErrorHandler.process(RedeliveryErrorHandler.java:541)
at
org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:198)
at org.apache.camel.processor.Pipeline.process(Pipeline.java:120)
at org.apache.camel.processor.Pipeline.process(Pipeline.java:83)
at
org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:198)
at
org.apache.camel.component.direct.DirectProducer.process(DirectProducer.java:62)
at
org.apache.camel.processor.SendProcessor.process(SendProcessor.java:145)
at
org.apache.camel.management.InstrumentationProcessor.process(InstrumentationProcessor.java:77)
at
org.apache.camel.processor.RedeliveryErrorHandler.process(RedeliveryErrorHandler.java:541)
at
org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:198)
at org.apache.camel.processor.Pipeline.process(Pipeline.java:120)
at org.apache.camel.processor.Pipeline.process(Pipeline.java:83)
at
org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:198)
at
org.apache.camel.component.direct.DirectProducer.process(DirectProducer.java:62)
at
org.apache.camel.processor.SendProcessor.process(SendProcessor.java:145)
at
org.apache.camel.management.InstrumentationProcessor.process(InstrumentationProcessor.java:77)
at
org.apache.camel.processor.RedeliveryErrorHandler.process(RedeliveryErrorHandler.java:541)
at
org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:198)
at org.apache.camel.processor.Pipeline.process(Pipeline.java:120)
at org.apache.camel.processor.Pipeline.process(Pipeline.java:83)
at
org.apache.camel.processor.ChoiceProcessor.process(ChoiceProcessor.java:117)
at
org.apache.camel.management.InstrumentationProcessor.process(InstrumentationProcessor.java:77)
at
org.apache.camel.processor.RedeliveryErrorHandler.process(RedeliveryErrorHandler.java:541)
at
org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:198)
at org.apache.camel.processor.Pipeline.process(Pipeline.java:120)
at org.apache.camel.processor.Pipeline.process(Pipeline.java:83)
at
org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcessorHelper.java:109)
at org.apache.camel.processor.Pipeline.process(Pipeline.java:63)
at
org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:173)
at
org.apache.camel.component.file.GenericFileConsumer.processExchange(GenericFileConsumer.java:451)
at
org.apache.camel.component.file.remote.RemoteFileConsumer.processExchange(RemoteFileConsumer.java:137)
at
org.apache.camel.component.file.GenericFileConsumer.processBatch(GenericFileConsumer.java:218)
at
org.apache.camel.component.file.GenericFileConsumer.poll(GenericFileConsumer.java:182)
at
org.apache.camel.impl.ScheduledPollConsumer.doRun(ScheduledPollConsumer.java:174)
at
org.apache.camel.impl.ScheduledPollConsumer.run(ScheduledPollConsumer.java:101)
at
java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:308)
at
java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:180)
at
java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:294)
at
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:748)
{code}
So either:
* .bean(MySpringBean.class) is not a valid usage for Spring beans
* such usage should be explicitly limited to Spring beans with no-arg
constructors (and an explanatory exception should be thrown otherwise)
* BeanDefinition should not assume that the Injector is unable to instantiate
beans without no-args constructors, because some (like SpringInjector) are able
to do that
--
This message was sent by Atlassian JIRA
(v6.4.14#64029)