java—在尝试自动连线时获取spring托管类上的nullpointer

e4yzc0pl  于 2021-07-23  发布在  Java
关注(0)|答案(3)|浏览(443)

我正在创建一个spring-boot应用程序来侦听rabbit队列并将消息转发到kafka流。我正在努力 @Autowire Kafka配置类,但我得到 NullPointerException ,更令人惊讶的是,当我列出所有spring管理的bean时,它会给出我正在尝试的类的对象名 @Autowire . 我不知道我在哪里失踪了。
起始类:

  1. @SpringBootApplication
  2. @ComponentScan(basePackages = {"com.example.demo.service","com.example.demo.configuration"})
  3. public class RabbitConsumerApplication {
  4. private static ApplicationContext applicationContext;
  5. public static void main(String[] args) {
  6. applicationContext = SpringApplication.run(RabbitConsumerApplication.class, args);
  7. displayAllBeans();
  8. }
  9. public static void displayAllBeans() {
  10. String[] allBeanNames = applicationContext.getBeanDefinitionNames();
  11. for(String beanName : allBeanNames) {
  12. System.out.println(beanName);
  13. }
  14. }
  15. }

kafkaproducerservice类:

  1. package com.example.demo.service;
  2. @Component
  3. public class KafkaProducerService {
  4. @Autowired
  5. private KafkaTemplate<?, String> kafkaTemplate;
  6. public void getMessageFromMQ(Message message) throws InterruptedException {
  7. Map<String, Object> configProps = new HashMap<>();
  8. configProps.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092");
  9. configProps.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class);
  10. configProps.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, StringSerializer.class);
  11. DefaultKafkaProducerFactory<Object, Object> defaultKafkaProducerFactory = new DefaultKafkaProducerFactory<>(configProps);
  12. kafkaTemplate.send("testTopic",new String(message.getBody()));
  13. }
  14. @Override
  15. public String toString() {
  16. return "KafkaProducerService [kafkaTemplate=" + kafkaTemplate + "]";
  17. }
  18. }

kafkaproducerconfig类:

  1. package com.example.demo.configuration;
  2. @Configuration
  3. public class KafkaProducerConfig {
  4. @Bean
  5. public ProducerFactory<String, String> producerFactory() {
  6. Map<String, Object> configProps = new HashMap<>();
  7. configProps.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092");
  8. configProps.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class);
  9. configProps.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, StringSerializer.class);
  10. return new DefaultKafkaProducerFactory<>(configProps);
  11. }
  12. @Bean
  13. public KafkaTemplate<String, String> kafkaTemplate() {
  14. return new KafkaTemplate<>(producerFactory());
  15. }
  16. }

rabbitlistenerservice类:

  1. package com.example.demo.service;
  2. public class RabbitListenerService implements MessageListener{
  3. @Autowired
  4. private KafkaProducerService kafkaProducerService;
  5. @Override
  6. public void onMessage(Message message) {
  7. System.out.println("message :"+new String(message.getBody()));
  8. System.out.println("object:"+kafkaProducerService.toString()); //19th line. getting nullpointer on this line
  9. }
  10. }

堆栈跟踪:

  1. 2021-02-20 13:55:06.750 WARN 5392 --- [tnerContainer-1] s.a.r.l.ConditionalRejectingErrorHandler : Execution of Rabbit message listener failed.
  2. org.springframework.amqp.rabbit.support.ListenerExecutionFailedException: Listener threw exception
  3. at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.wrapToListenerExecutionFailedExceptionIfNeeded(AbstractMessageListenerContainer.java:1746) ~[spring-rabbit-2.3.4.jar:2.3.4]
  4. at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.doInvokeListener(AbstractMessageListenerContainer.java:1692) ~[spring-rabbit-2.3.4.jar:2.3.4]
  5. at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.actualInvokeListener(AbstractMessageListenerContainer.java:1562) ~[spring-rabbit-2.3.4.jar:2.3.4]
  6. at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.invokeListener(AbstractMessageListenerContainer.java:1539) ~[spring-rabbit-2.3.4.jar:2.3.4]
  7. at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.doExecuteListener(AbstractMessageListenerContainer.java:1530) ~[spring-rabbit-2.3.4.jar:2.3.4]
  8. at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.executeListener(AbstractMessageListenerContainer.java:1474) ~[spring-rabbit-2.3.4.jar:2.3.4]
  9. at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.doReceiveAndExecute(SimpleMessageListenerContainer.java:967) ~[spring-rabbit-2.3.4.jar:2.3.4]
  10. at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.receiveAndExecute(SimpleMessageListenerContainer.java:913) ~[spring-rabbit-2.3.4.jar:2.3.4]
  11. at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.access$1600(SimpleMessageListenerContainer.java:83) ~[spring-rabbit-2.3.4.jar:2.3.4]
  12. at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer$AsyncMessageProcessingConsumer.mainLoop(SimpleMessageListenerContainer.java:1288) ~[spring-rabbit-2.3.4.jar:2.3.4]
  13. at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer$AsyncMessageProcessingConsumer.run(SimpleMessageListenerContainer.java:1194) ~[spring-rabbit-2.3.4.jar:2.3.4]
  14. at java.base/java.lang.Thread.run(Thread.java:834) ~[na:na]
  15. Caused by: java.lang.NullPointerException: null
  16. at com.example.demo.service.RabbitListenerService.onMessage(RabbitListenerService.java:19) ~[classes/:na]
  17. at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.doInvokeListener(AbstractMessageListenerContainer.java:1688) ~[spring-rabbit-2.3.4.jar:2.3.4]
  18. ... 10 common frames omitted
  19. message :hey you
  20. message :hey you

我只是想 @Autowire kafkaproducerservice类进入rabbitlistenerservice。

sqserrrh

sqserrrh1#

好吧,我解决了这个问题。即使@autowire发生了,但它实际上绑定了一个空对象,因为在rabbitconfig.java中,我实际上用一个新关键字初始化了rabbitlistenerservice,而spring ioc不处理它。我改变了方式,解决了问题。
rabbitlistenerservice.java文件

  1. @Component
  2. public class RabbitListenerService implements MessageListener{
  3. @Autowired
  4. private KafkaProducerService kafkaProducerService;
  5. @Override
  6. public void onMessage(Message message) {
  7. System.out.println("message :"+new String(message.getBody()));
  8. System.out.println("object:"+kafkaProducerService.toString());
  9. try {
  10. kafkaProducerService.getMessageFromMQ(message);
  11. } catch (InterruptedException e) {
  12. // TODO Auto-generated catch block
  13. e.printStackTrace();
  14. }
  15. }

然后将rabbitlistenerservice自动连接到rabbitconfig
rabbitconfig.java文件

  1. @Configuration
  2. public class RabbitConfig {
  3. private static final String my_queue = "TestQueue";
  4. @Autowired
  5. private RabbitListenerService rabbitListenerService;
  6. @Bean
  7. MessageListenerContainer messageListnerContainer() {
  8. SimpleMessageListenerContainer simpleMessageListenerContainer = new SimpleMessageListenerContainer();
  9. simpleMessageListenerContainer.setConnectionFactory(connectionFactory());
  10. simpleMessageListenerContainer.setQueues(myQueue());
  11. simpleMessageListenerContainer.setMessageListener(rabbitListenerService);
  12. return simpleMessageListenerContainer;
  13. }
  14. }
展开查看全部
f8rj6qna

f8rj6qna2#

从您的代码来看,您似乎还没有定义任何kafka模板bean。例如:

  1. @Configuration
  2. public class MyKafkaConfig {
  3. ...
  4. @Bean
  5. public KafkaTemplate<String, String> kafkaTemplate() {
  6. // define a template here
  7. }
  8. }

定义的kafka服务具有注入(自动连线) KafkaTemplate<?, String> . 这样的bean是在配置类中定义的吗?
也请张贴您的stacktrace。

6gpjuf90

6gpjuf903#

试试这个,把包换成 * ,确保它在bean列表中打印kafkaproducerservice,
经常练习为impl服务类创建接口

  1. @Component
  2. public class KafkaProducerServiceImpl implements KafkaProducerService

例如

  1. @SpringBootApplication
  2. @ComponentScan(basePackages = "com.example.demo.*"})
  3. public class RabbitConsumerApplication {
  4. ...
  5. }

相关问题