簡體   English   中英

Apache駱駝和Spring-Boot構造函數注入-NPE

[英]Apache camel and spring-boot constructor injection - NPE

我有以下簡單的使用Apache駱駝的spring-boot應用程序:

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.RELEASEorg.apache.camel:camel-spring-boot-starter:2.19.3


更新1:向github添加了源代碼:github上的存儲庫


更新2:

在NPE發生方法之前添加斷點:

使用構造函數注入: 使用構造函數注入

沒有構造函數注入(使用字段注入): 沒有構造函數注入(使用字段注入)

在Camel 2.19.x或更早的版本中不支持Spring構造函數注入。 您需要升級到Camel 2.20.0或更高版本。

請參閱發行說明: http : //camel.apache.org/camel-2200-release.html

  • 將Camel與Spring一起使用現在支持通過FQN名稱調用Bean,並且讓Spring使用自動連接的構造函數實例化Bean,而不是僅支持無參數的構造函數。

一種替代方法是使用bean id引用bean,並讓Spring通過以下方式對其進行管理

 .bean("mySampleProcessor")

然后在類中使用此名稱聲明它

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM