Apache的骆驼和弹簧引导构造注射 - NPE
问题描述:
我有以下简单的弹簧,启动应用程序,它使用了Apache的骆驼:Apache的骆驼和弹簧引导构造注射 - NPE
DemoApplication.java
:
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
@Component
class MySampleRoute extends SpringRouteBuilder {
@Override
public void configure() throws Exception {
from("file://data/input")
.bean(SampleProcessor1.class)
.to("file://data/output");
}
}
而且我的豆子:
SampleProcessor1.java
:
public class SampleProcessor1 {
private SampleProcessor2 sampleProcessor2;
@Autowired
public SampleProcessor1(SampleProcessor2 sampleProcessor2) {
this.sampleProcessor2 = sampleProcessor2;
}
@Handler
public void handle(
@Body GenericFile<String> file
) {
}
}
SampleProcessor2.java
:
@Component
public class SampleProcessor2 { }
当我运行该应用程序,并把一些文件data/input
目录 - 我得到以下NPE:
java.lang.NullPointerException: null
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_111]
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_111]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_111]
at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_111]
at org.apache.camel.component.bean.MethodInfo.invoke(MethodInfo.java:472) ~[camel-core-2.19.3.jar:2.19.3]
at org.apache.camel.component.bean.MethodInfo$1.doProceed(MethodInfo.java:291) ~[camel-core-2.19.3.jar:2.19.3]
at org.apache.camel.component.bean.MethodInfo$1.proceed(MethodInfo.java:264) ~[camel-core-2.19.3.jar:2.19.3]
at org.apache.camel.component.bean.BeanProcessor.process(BeanProcessor.java:178) ~[camel-core-2.19.3.jar:2.19.3]
at org.apache.camel.management.InstrumentationProcessor.process(InstrumentationProcessor.java:77) ~[camel-core-2.19.3.jar:2.19.3]
at org.apache.camel.processor.RedeliveryErrorHandler.process(RedeliveryErrorHandler.java:541) ~[camel-core-2.19.3.jar:2.19.3]
at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:198) [camel-core-2.19.3.jar:2.19.3]
at org.apache.camel.processor.Pipeline.process(Pipeline.java:120) [camel-core-2.19.3.jar:2.19.3]
at org.apache.camel.processor.Pipeline.process(Pipeline.java:83) [camel-core-2.19.3.jar:2.19.3]
at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:198) [camel-core-2.19.3.jar:2.19.3]
at org.apache.camel.component.file.GenericFileConsumer.processExchange(GenericFileConsumer.java:451) [camel-core-2.19.3.jar:2.19.3]
at org.apache.camel.component.file.GenericFileConsumer.processBatch(GenericFileConsumer.java:218) [camel-core-2.19.3.jar:2.19.3]
at org.apache.camel.component.file.GenericFileConsumer.poll(GenericFileConsumer.java:182) [camel-core-2.19.3.jar:2.19.3]
at org.apache.camel.impl.ScheduledPollConsumer.doRun(ScheduledPollConsumer.java:174) [camel-core-2.19.3.jar:2.19.3]
at org.apache.camel.impl.ScheduledPollConsumer.run(ScheduledPollConsumer.java:101) [camel-core-2.19.3.jar:2.19.3]
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) [na:1.8.0_111]
at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:308) [na:1.8.0_111]
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:180) [na:1.8.0_111]
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:294) [na:1.8.0_111]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) [na:1.8.0_111]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) [na:1.8.0_111]
at java.lang.Thread.run(Thread.java:745) [na:1.8.0_111]
但是,如果我尝试从SampleProcessor1
和使用删除构造函数注入,例如字段注入 - 那么没有NPE发生,一切都很好。
SampleProcessor1.java
- 工作版本:
public class SampleProcessor1 {
@Autowired
private SampleProcessor2 sampleProcessor2;
@Handler
public void handle(
@Body GenericFile<String> file
) {
}
}
按照我的理解 - 这个问题是在构造函数注入 - 但我不明白为什么。
所以我的问题是为什么我使用构造函数注入时获得NPE?
我用spring-boot:1.5.7.RELEASE
和org.apache.camel:camel-spring-boot-starter:2.19.3
更新1: 添加的源代码的github:Repository on github
更新2:
新增断点NPE发生的方法之前:
答
弹簧构造函数注入不能在骆驼2.19.x或以上支持。您需要升级到骆驼2.20.0或更新版本。
参阅发行说明:http://camel.apache.org/camel-2200-release.html
- 使用骆驼和Spring现在支持调用的Bean的FQN的名字,让春季使用自动布线构造的,而不是只支持一个无参数的构造函数实例化的bean。
另一种方法是指豆与豆ID,让通过
.bean("mySampleProcessor")
春天更多地管理它,然后在课堂上,你用这个名字
@Component("mySampleProcessor")
public class SampleProcessor1 {
...
}
声明它请发布您的POM或Gradle文件。如果你可以设置一个断点并找出骆驼想要调用的方法,这也会很有帮助。 – chrylis
请参阅更新,将源代码添加到github – Vusal