Java ApacheCamel和spring引导构造函数注入-NPE

Java ApacheCamel和spring引导构造函数注入-NPE,java,spring-boot,dependency-injection,apache-camel,Java,Spring Boot,Dependency Injection,Apache Camel,我有以下使用apache camel的简单spring引导应用程序: DemoApplication.java: @SpringBootApplication public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } } @Component class MySampl

我有以下使用apache camel的简单spring引导应用程序:

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");
    }
}
public class SampleProcessor1 {

    private SampleProcessor2 sampleProcessor2;

    @Autowired
    public SampleProcessor1(SampleProcessor2 sampleProcessor2) {
        this.sampleProcessor2 = sampleProcessor2;
    }

    @Handler
    public void handle(
            @Body GenericFile<String> file
    ) {

    }
}
@Component
public class SampleProcessor2 { }
还有我的豆子:

SampleProcessor1.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");
    }
}
public class SampleProcessor1 {

    private SampleProcessor2 sampleProcessor2;

    @Autowired
    public SampleProcessor1(SampleProcessor2 sampleProcessor2) {
        this.sampleProcessor2 = sampleProcessor2;
    }

    @Handler
    public void handle(
            @Body GenericFile<String> file
    ) {

    }
}
@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
    ) {

    }
}
公共类SampleProcessor1{
@自动连线
私有采样处理器2采样处理器2;
@处理者
公共无效句柄(
@正文通用文件
) {
}
}
据我所知——问题在于构造函数注入——但我不明白为什么

所以我的问题是为什么我在使用构造函数注入时会得到NPE

我使用
springboot:1.5.7.RELEASE
org.apache.camel:camel-spring启动程序:2.19.3


更新1: 向github添加了源代码:


更新2:

在NPE发生之前添加了断点方法:

使用构造函数注入:

无构造函数注入(使用字段注入):

Camel 2.19.x或更早版本不支持Spring构造函数注入。您需要升级到Camel 2.20.0或更新版本

请参阅发行说明:

  • 将Camel与Spring一起使用现在支持通过其FQN名称调用Bean,并让Spring使用自动连接构造函数实例化Bean,而不是只支持无参数构造函数
另一种方法是使用bean id引用bean,并让Spring通过

 .bean("mySampleProcessor")
然后在类中用这个名称声明它

@Component("mySampleProcessor")
public class SampleProcessor1 {
  ...
}

Camel 2.19.x或更早版本不支持Spring构造函数注入。您需要升级到Camel 2.20.0或更新版本

请参阅发行说明:

  • 将Camel与Spring一起使用现在支持通过其FQN名称调用Bean,并让Spring使用自动连接构造函数实例化Bean,而不是只支持无参数构造函数
另一种方法是使用bean id引用bean,并让Spring通过

 .bean("mySampleProcessor")
然后在类中用这个名称声明它

@Component("mySampleProcessor")
public class SampleProcessor1 {
  ...
}

请张贴您的POM或Gradle文件。如果您可以设置一个断点并找出Camel试图调用的
方法,这也会很有帮助。请参阅更新,将源代码添加到Github请发布您的POM或Gradle文件。如果您可以设置断点并找出Camel试图调用的
方法,这也会很有帮助。请参阅更新,将源代码添加到github