2016-08-08 19 views
0

Ich versuche, die spring-kafka KafkaTemplate in einer Spring-Boot-Anwendung zu verwenden, um Nachrichten zu einem Kafka-Thema zu schreiben.Autowired KafkaTemplate in SpringBoot/spring-kafka-Anwendung wirft Null-Zeiger

ich eine KafkaConfig Klasse erstellt:

@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()); 
    } 

} 

... und Autowired die KafkaTemplate in der Klasse, wo ich Kafka hier schreibe:

@Autowired 
private KafkaTemplate<Integer, String> template; 

Aus irgendeinem Grund doesn die autowiring‘ t scheinen zu funktionieren. Ich stelle fest, dass die KafkaTemplate null ist, wenn ich im Debug laufen:

template is null

Diese Aufgabe sollte nicht null; es sollte ein KafkaTemplate-Objekt sein. Dies wirft eine Null-Zeiger Ausnahme:

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 

Aus Gründen der Reproduzierbarkeit, ich meine code on Github geschrieben.

kafka-spring hat in der Vergangenheit gut mit fast identischen Code funktioniert, und so bin ich ein wenig verwirrt, warum das Autowiring dieses Mal nicht funktioniert. Kannst du sehen, was ich falsch mache?

Antwort

3

Sie die Bohne verwenden zu früh ...

postProcessBeforeInitialization 

... das aufgerufen wird, bevor die Eigenschaften festgelegt sind.

EDIT

SmartLifecycle Implementieren und

watchService.monitor(path); 

zu start() bewegen.

EDIT2

Das heißt; Das ist seltsam ...

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

Sie eine neue Instanz in den post-Konstrukt Verfahren zu schaffen - natürlich wird es nicht autowired werden, da es von Spring nicht verwaltet wird.

+0

Sehen Sie sich meine neue Bearbeitung an - Ihre 'WatchService'-Instanz wird nicht von Spring verwaltet. –

+0

Vielen Dank, @GaryRussell. Sie hatten recht, dass der "WatchService" nicht von Spring verwaltet wird. Ich habe das '@ Postconstruct' in die' monitor' Methode verschoben und die 'watchPath' Methode gelöscht (die' new WatchService() 'enthielt. –