2017-10-14 8 views
1

私は、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を取得していますか? githubのに を追加しましたソース・コード:

は、私がspring-boot:1.5.7.RELEASEorg.apache.camel:camel-spring-boot-starter:2.19.3


アップデート1を使用Repository on github


アップデート2:

NPEは、メソッドを起こっ直前

追加ブレークポイント:

(フィールドインジェクションを使用して)コンストラクタ・インジェクションなし With constructor injection

:コンストラクタ・インジェクションで210

Without constructor injection (using field injection)

+0

でそれを宣言しますPOMまたはGradleファイルを投稿してください。ブレークポイントを設定し、 'Method' Camelが呼び出そうとしているものが何であるかを知ることができれば助けになります。 – chrylis

+0

更新、githubに追加されたソースコードを見てください – Vusal

答えて

6

春のコンストラクタ・インジェクションは、ラクダ2.19.x以前ではサポートされていません。 Camel 2.20.0以降にアップグレードする必要があります。

リリースノートを参照してください:http://camel.apache.org/camel-2200-release.htmlキャメルを使用して

  • 春には現在、彼らのFQN名で豆を呼び出してサポートしており、春には、自動配線コンストラクタの唯一の引数なしのコンストラクタをサポートするとして反対を使用してBeanをインスタンス化してみましょう。してください

代替は、Bean IDで豆を参照し、春はもっと

.bean("mySampleProcessor") 

を経由して、それを管理できるようにし、その後、クラスで、あなたは、この名前

@Component("mySampleProcessor") 
public class SampleProcessor1 { 
    ... 
} 
関連する問題