2016-08-08 13 views
0

私は、Springブートアプリケーション内でspring-kafka KafkaTemplateを使用して、Kafkaトピックにメッセージを書き込もうとしています。SpringBoot/spring-kafkaアプリケーションでAutowired KafkaTemplateがnullポインタを投げる

@Configuration 
@EnableKafka 
public class KafkaConfig { 

    @Value("${kafka.broker.address}") 
    private String brokerAddress; 

    @Bean 
    public ProducerFactory<Integer, String> producerFactory() { 
     return new DefaultKafkaProducerFactory<>(producerConfigs()); 
    } 

    @Bean 
    public Map<String, Object> producerConfigs() { 
     Map<String, Object> props = new HashMap<>(); 
     props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, brokerAddress); 
     props.put(ProducerConfig.RETRIES_CONFIG, 0); 
     props.put(ProducerConfig.BATCH_SIZE_CONFIG, 16384); 
     props.put(ProducerConfig.LINGER_MS_CONFIG, 1); 
     props.put(ProducerConfig.BUFFER_MEMORY_CONFIG, 33554432); 
     props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, IntegerSerializer.class); 
     props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, StringSerializer.class); 

     return props; 
    } 

    @Bean 
    public KafkaTemplate<Integer, String> kafkaTemplate() { 
     return new KafkaTemplate<Integer, String>(producerFactory()); 
    } 

} 

...と私はカフカに書いているクラスのAutowired KafkaTemplate:

私はKafkaConfigクラスを作成したいくつかの理由

@Autowired 
private KafkaTemplate<Integer, String> template; 

、オートワイヤリングは」doesnの動作するように見える。私は、デバッグで実行した場合KafkaTemplateがnullであることに気づく:

template is null

このオブジェクトがnullであってはなりません。それはKafkaTemplateオブジェクトでなければなりません。私は私のcode on Githubを掲載、再現性のために

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'watchService': Invocation of init method failed; nested exception is java.lang.NullPointerException 
    at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor.postProcessBeforeInitialization(InitDestroyAnnotationBeanPostProcessor.java:136) ~[spring-beans-4.3.2.RELEASE.jar:4.3.2.RELEASE] 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsBeforeInitialization(AbstractAutowireCapableBeanFactory.java:408) ~[spring-beans-4.3.2.RELEASE.jar:4.3.2.RELEASE] 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1570) ~[spring-beans-4.3.2.RELEASE.jar:4.3.2.RELEASE] 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:545) ~[spring-beans-4.3.2.RELEASE.jar:4.3.2.RELEASE] 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482) ~[spring-beans-4.3.2.RELEASE.jar:4.3.2.RELEASE] 
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306) ~[spring-beans-4.3.2.RELEASE.jar:4.3.2.RELEASE] 
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) ~[spring-beans-4.3.2.RELEASE.jar:4.3.2.RELEASE] 
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302) ~[spring-beans-4.3.2.RELEASE.jar:4.3.2.RELEASE] 
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197) ~[spring-beans-4.3.2.RELEASE.jar:4.3.2.RELEASE] 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:776) ~[spring-beans-4.3.2.RELEASE.jar:4.3.2.RELEASE] 
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:861) ~[spring-context-4.3.2.RELEASE.jar:4.3.2.RELEASE] 
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:541) ~[spring-context-4.3.2.RELEASE.jar:4.3.2.RELEASE] 
    at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:759) [spring-boot-1.4.0.RELEASE.jar:1.4.0.RELEASE] 
    at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:369) [spring-boot-1.4.0.RELEASE.jar:1.4.0.RELEASE] 
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:313) [spring-boot-1.4.0.RELEASE.jar:1.4.0.RELEASE] 
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1185) [spring-boot-1.4.0.RELEASE.jar:1.4.0.RELEASE] 
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1174) [spring-boot-1.4.0.RELEASE.jar:1.4.0.RELEASE] 
    at io.woolford.Application.main(Application.java:11) [classes/:na] 
Caused by: java.lang.NullPointerException: null 
    at io.woolford.WatchService.monitor(WatchService.java:93) ~[classes/:na] 
    at io.woolford.WatchService.watchPath(WatchService.java:37) ~[classes/:na] 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_91] 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_91] 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_91] 
    at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_91] 
    at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor$LifecycleElement.invoke(InitDestroyAnnotationBeanPostProcessor.java:365) ~[spring-beans-4.3.2.RELEASE.jar:4.3.2.RELEASE] 
    at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor$LifecycleMetadata.invokeInitMethods(InitDestroyAnnotationBeanPostProcessor.java:310) ~[spring-beans-4.3.2.RELEASE.jar:4.3.2.RELEASE] 
    at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor.postProcessBeforeInitialization(InitDestroyAnnotationBeanPostProcessor.java:133) ~[spring-beans-4.3.2.RELEASE.jar:4.3.2.RELEASE] 
    ... 17 common frames omitted 

:これは、nullポインタ例外をスローします。

kafka-springは、ほぼ同じコードを使って過去に私にとってうまくいきました。なぜ、Autowiringが今回はうまくいかないのか少し混乱しています。私が間違っていることを見ることができますか?プロパティが設定される前に、あなたもすぐに豆を使用している

答えて

3

...

postProcessBeforeInitialization 

は...それが呼び出されています。

EDIT

SmartLifecycleを実装しstart()

watchService.monitor(path); 

を移動します。

EDIT2

言いました。それは春が管理していないので、もちろんそれはautowiredされることはありません - これはあなたがポスト構造方法で新しいインスタンスを作成している...

WatchService watchService = new WatchService(); 
    watchService.monitor(path); 

奇妙です。

+0

私の新しい編集を見てください - あなたの 'WatchService'インスタンスはSpring管理されていません。 –

+0

ありがとう、@GaryRussell。あなたは、Springによって管理されていない 'WatchService'について正しいと思います。 '@ Postconstruct'を' monitor'メソッドに移動し、 'watchService()'メソッドを含む 'watchPath'メソッドを削除しました。 –

関連する問題