Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/341.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 尝试自动连线时获取spring托管类上的nullpointer_Java_Spring_Spring Boot_Autowired - Fatal编程技术网

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

Java 尝试自动连线时获取spring托管类上的nullpointer,java,spring,spring-boot,autowired,Java,Spring,Spring Boot,Autowired,我正在创建一个spring引导应用程序,用于从兔子队列侦听消息并将消息转发到Kafka流。 我试图@Autowire一个Kafka配置类,但我得到了NullPointerException,更令人惊讶的是,当我列出所有spring管理的bean时,它给了我试图@Autowire的类的对象名。我不知道我在哪里失踪了 开始上课: @SpringBootApplication @ComponentScan(basePackages = {"com.example.demo.service&q

我正在创建一个spring引导应用程序,用于从兔子队列侦听消息并将消息转发到Kafka流。 我试图
@Autowire
一个Kafka配置类,但我得到了
NullPointerException
,更令人惊讶的是,当我列出所有spring管理的bean时,它给了我试图
@Autowire
的类的对象名。我不知道我在哪里失踪了

开始上课:

@SpringBootApplication
@ComponentScan(basePackages = {"com.example.demo.service","com.example.demo.configuration"})
public class RabbitConsumerApplication {
    
    private static ApplicationContext applicationContext;

    public static void main(String[] args) {
        applicationContext = SpringApplication.run(RabbitConsumerApplication.class, args);
        displayAllBeans();
    }
    
    public static void displayAllBeans() {
        String[] allBeanNames = applicationContext.getBeanDefinitionNames();
        for(String beanName : allBeanNames) {
            System.out.println(beanName);
        }
    }
    
}
package com.example.demo.service;

@Component
public class KafkaProducerService {
    
    
    @Autowired
    private KafkaTemplate<?, String> kafkaTemplate;
    
    
    public void getMessageFromMQ(Message  message) throws InterruptedException {
        
        Map<String, Object> configProps = new HashMap<>();
          configProps.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092");
          configProps.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class);
          configProps.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, StringSerializer.class);
          DefaultKafkaProducerFactory<Object, Object> defaultKafkaProducerFactory = new DefaultKafkaProducerFactory<>(configProps);
          
          
        kafkaTemplate.send("testTopic",new String(message.getBody()));
        
    }


    @Override
    public String toString() {
        return "KafkaProducerService [kafkaTemplate=" + kafkaTemplate + "]";
    }
    
    

}
package com.example.demo.configuration;

@Configuration
public class KafkaProducerConfig {

    
    @Bean
    public ProducerFactory<String, String> producerFactory() {
      Map<String, Object> configProps = new HashMap<>();
      configProps.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092");
      configProps.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class);
      configProps.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, StringSerializer.class);
      return new DefaultKafkaProducerFactory<>(configProps);
    }
    
    @Bean
    public KafkaTemplate<String, String> kafkaTemplate() {
      return new KafkaTemplate<>(producerFactory());
    }
}
package com.example.demo.service;

public class RabbitListenerService implements MessageListener{
    
    @Autowired
    private KafkaProducerService kafkaProducerService;
    
    
    @Override
    public void onMessage(Message message) {
        System.out.println("message :"+new String(message.getBody()));
        System.out.println("object:"+kafkaProducerService.toString());  //19th line. getting nullpointer on this line   
    }

}
2021-02-20 13:55:06.750  WARN 5392 --- [tnerContainer-1] s.a.r.l.ConditionalRejectingErrorHandler : Execution of Rabbit message listener failed.

org.springframework.amqp.rabbit.support.ListenerExecutionFailedException: Listener threw exception
    at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.wrapToListenerExecutionFailedExceptionIfNeeded(AbstractMessageListenerContainer.java:1746) ~[spring-rabbit-2.3.4.jar:2.3.4]
    at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.doInvokeListener(AbstractMessageListenerContainer.java:1692) ~[spring-rabbit-2.3.4.jar:2.3.4]
    at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.actualInvokeListener(AbstractMessageListenerContainer.java:1562) ~[spring-rabbit-2.3.4.jar:2.3.4]
    at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.invokeListener(AbstractMessageListenerContainer.java:1539) ~[spring-rabbit-2.3.4.jar:2.3.4]
    at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.doExecuteListener(AbstractMessageListenerContainer.java:1530) ~[spring-rabbit-2.3.4.jar:2.3.4]
    at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.executeListener(AbstractMessageListenerContainer.java:1474) ~[spring-rabbit-2.3.4.jar:2.3.4]
    at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.doReceiveAndExecute(SimpleMessageListenerContainer.java:967) ~[spring-rabbit-2.3.4.jar:2.3.4]
    at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.receiveAndExecute(SimpleMessageListenerContainer.java:913) ~[spring-rabbit-2.3.4.jar:2.3.4]
    at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.access$1600(SimpleMessageListenerContainer.java:83) ~[spring-rabbit-2.3.4.jar:2.3.4]
    at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer$AsyncMessageProcessingConsumer.mainLoop(SimpleMessageListenerContainer.java:1288) ~[spring-rabbit-2.3.4.jar:2.3.4]
    at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer$AsyncMessageProcessingConsumer.run(SimpleMessageListenerContainer.java:1194) ~[spring-rabbit-2.3.4.jar:2.3.4]
    at java.base/java.lang.Thread.run(Thread.java:834) ~[na:na]
Caused by: java.lang.NullPointerException: null
    at com.example.demo.service.RabbitListenerService.onMessage(RabbitListenerService.java:19) ~[classes/:na]
    at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.doInvokeListener(AbstractMessageListenerContainer.java:1688) ~[spring-rabbit-2.3.4.jar:2.3.4]
    ... 10 common frames omitted

message :hey you
message :hey you
KafkaProducerService类:

@SpringBootApplication
@ComponentScan(basePackages = {"com.example.demo.service","com.example.demo.configuration"})
public class RabbitConsumerApplication {
    
    private static ApplicationContext applicationContext;

    public static void main(String[] args) {
        applicationContext = SpringApplication.run(RabbitConsumerApplication.class, args);
        displayAllBeans();
    }
    
    public static void displayAllBeans() {
        String[] allBeanNames = applicationContext.getBeanDefinitionNames();
        for(String beanName : allBeanNames) {
            System.out.println(beanName);
        }
    }
    
}
package com.example.demo.service;

@Component
public class KafkaProducerService {
    
    
    @Autowired
    private KafkaTemplate<?, String> kafkaTemplate;
    
    
    public void getMessageFromMQ(Message  message) throws InterruptedException {
        
        Map<String, Object> configProps = new HashMap<>();
          configProps.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092");
          configProps.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class);
          configProps.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, StringSerializer.class);
          DefaultKafkaProducerFactory<Object, Object> defaultKafkaProducerFactory = new DefaultKafkaProducerFactory<>(configProps);
          
          
        kafkaTemplate.send("testTopic",new String(message.getBody()));
        
    }


    @Override
    public String toString() {
        return "KafkaProducerService [kafkaTemplate=" + kafkaTemplate + "]";
    }
    
    

}
package com.example.demo.configuration;

@Configuration
public class KafkaProducerConfig {

    
    @Bean
    public ProducerFactory<String, String> producerFactory() {
      Map<String, Object> configProps = new HashMap<>();
      configProps.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092");
      configProps.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class);
      configProps.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, StringSerializer.class);
      return new DefaultKafkaProducerFactory<>(configProps);
    }
    
    @Bean
    public KafkaTemplate<String, String> kafkaTemplate() {
      return new KafkaTemplate<>(producerFactory());
    }
}
package com.example.demo.service;

public class RabbitListenerService implements MessageListener{
    
    @Autowired
    private KafkaProducerService kafkaProducerService;
    
    
    @Override
    public void onMessage(Message message) {
        System.out.println("message :"+new String(message.getBody()));
        System.out.println("object:"+kafkaProducerService.toString());  //19th line. getting nullpointer on this line   
    }

}
2021-02-20 13:55:06.750  WARN 5392 --- [tnerContainer-1] s.a.r.l.ConditionalRejectingErrorHandler : Execution of Rabbit message listener failed.

org.springframework.amqp.rabbit.support.ListenerExecutionFailedException: Listener threw exception
    at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.wrapToListenerExecutionFailedExceptionIfNeeded(AbstractMessageListenerContainer.java:1746) ~[spring-rabbit-2.3.4.jar:2.3.4]
    at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.doInvokeListener(AbstractMessageListenerContainer.java:1692) ~[spring-rabbit-2.3.4.jar:2.3.4]
    at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.actualInvokeListener(AbstractMessageListenerContainer.java:1562) ~[spring-rabbit-2.3.4.jar:2.3.4]
    at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.invokeListener(AbstractMessageListenerContainer.java:1539) ~[spring-rabbit-2.3.4.jar:2.3.4]
    at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.doExecuteListener(AbstractMessageListenerContainer.java:1530) ~[spring-rabbit-2.3.4.jar:2.3.4]
    at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.executeListener(AbstractMessageListenerContainer.java:1474) ~[spring-rabbit-2.3.4.jar:2.3.4]
    at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.doReceiveAndExecute(SimpleMessageListenerContainer.java:967) ~[spring-rabbit-2.3.4.jar:2.3.4]
    at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.receiveAndExecute(SimpleMessageListenerContainer.java:913) ~[spring-rabbit-2.3.4.jar:2.3.4]
    at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.access$1600(SimpleMessageListenerContainer.java:83) ~[spring-rabbit-2.3.4.jar:2.3.4]
    at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer$AsyncMessageProcessingConsumer.mainLoop(SimpleMessageListenerContainer.java:1288) ~[spring-rabbit-2.3.4.jar:2.3.4]
    at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer$AsyncMessageProcessingConsumer.run(SimpleMessageListenerContainer.java:1194) ~[spring-rabbit-2.3.4.jar:2.3.4]
    at java.base/java.lang.Thread.run(Thread.java:834) ~[na:na]
Caused by: java.lang.NullPointerException: null
    at com.example.demo.service.RabbitListenerService.onMessage(RabbitListenerService.java:19) ~[classes/:na]
    at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.doInvokeListener(AbstractMessageListenerContainer.java:1688) ~[spring-rabbit-2.3.4.jar:2.3.4]
    ... 10 common frames omitted

message :hey you
message :hey you
堆栈跟踪:

@SpringBootApplication
@ComponentScan(basePackages = {"com.example.demo.service","com.example.demo.configuration"})
public class RabbitConsumerApplication {
    
    private static ApplicationContext applicationContext;

    public static void main(String[] args) {
        applicationContext = SpringApplication.run(RabbitConsumerApplication.class, args);
        displayAllBeans();
    }
    
    public static void displayAllBeans() {
        String[] allBeanNames = applicationContext.getBeanDefinitionNames();
        for(String beanName : allBeanNames) {
            System.out.println(beanName);
        }
    }
    
}
package com.example.demo.service;

@Component
public class KafkaProducerService {
    
    
    @Autowired
    private KafkaTemplate<?, String> kafkaTemplate;
    
    
    public void getMessageFromMQ(Message  message) throws InterruptedException {
        
        Map<String, Object> configProps = new HashMap<>();
          configProps.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092");
          configProps.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class);
          configProps.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, StringSerializer.class);
          DefaultKafkaProducerFactory<Object, Object> defaultKafkaProducerFactory = new DefaultKafkaProducerFactory<>(configProps);
          
          
        kafkaTemplate.send("testTopic",new String(message.getBody()));
        
    }


    @Override
    public String toString() {
        return "KafkaProducerService [kafkaTemplate=" + kafkaTemplate + "]";
    }
    
    

}
package com.example.demo.configuration;

@Configuration
public class KafkaProducerConfig {

    
    @Bean
    public ProducerFactory<String, String> producerFactory() {
      Map<String, Object> configProps = new HashMap<>();
      configProps.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092");
      configProps.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class);
      configProps.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, StringSerializer.class);
      return new DefaultKafkaProducerFactory<>(configProps);
    }
    
    @Bean
    public KafkaTemplate<String, String> kafkaTemplate() {
      return new KafkaTemplate<>(producerFactory());
    }
}
package com.example.demo.service;

public class RabbitListenerService implements MessageListener{
    
    @Autowired
    private KafkaProducerService kafkaProducerService;
    
    
    @Override
    public void onMessage(Message message) {
        System.out.println("message :"+new String(message.getBody()));
        System.out.println("object:"+kafkaProducerService.toString());  //19th line. getting nullpointer on this line   
    }

}
2021-02-20 13:55:06.750  WARN 5392 --- [tnerContainer-1] s.a.r.l.ConditionalRejectingErrorHandler : Execution of Rabbit message listener failed.

org.springframework.amqp.rabbit.support.ListenerExecutionFailedException: Listener threw exception
    at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.wrapToListenerExecutionFailedExceptionIfNeeded(AbstractMessageListenerContainer.java:1746) ~[spring-rabbit-2.3.4.jar:2.3.4]
    at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.doInvokeListener(AbstractMessageListenerContainer.java:1692) ~[spring-rabbit-2.3.4.jar:2.3.4]
    at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.actualInvokeListener(AbstractMessageListenerContainer.java:1562) ~[spring-rabbit-2.3.4.jar:2.3.4]
    at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.invokeListener(AbstractMessageListenerContainer.java:1539) ~[spring-rabbit-2.3.4.jar:2.3.4]
    at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.doExecuteListener(AbstractMessageListenerContainer.java:1530) ~[spring-rabbit-2.3.4.jar:2.3.4]
    at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.executeListener(AbstractMessageListenerContainer.java:1474) ~[spring-rabbit-2.3.4.jar:2.3.4]
    at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.doReceiveAndExecute(SimpleMessageListenerContainer.java:967) ~[spring-rabbit-2.3.4.jar:2.3.4]
    at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.receiveAndExecute(SimpleMessageListenerContainer.java:913) ~[spring-rabbit-2.3.4.jar:2.3.4]
    at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.access$1600(SimpleMessageListenerContainer.java:83) ~[spring-rabbit-2.3.4.jar:2.3.4]
    at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer$AsyncMessageProcessingConsumer.mainLoop(SimpleMessageListenerContainer.java:1288) ~[spring-rabbit-2.3.4.jar:2.3.4]
    at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer$AsyncMessageProcessingConsumer.run(SimpleMessageListenerContainer.java:1194) ~[spring-rabbit-2.3.4.jar:2.3.4]
    at java.base/java.lang.Thread.run(Thread.java:834) ~[na:na]
Caused by: java.lang.NullPointerException: null
    at com.example.demo.service.RabbitListenerService.onMessage(RabbitListenerService.java:19) ~[classes/:na]
    at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.doInvokeListener(AbstractMessageListenerContainer.java:1688) ~[spring-rabbit-2.3.4.jar:2.3.4]
    ... 10 common frames omitted

message :hey you
message :hey you

我只想
@Autowire
将KafkaProducerService类导入RabbitListenerService。

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

@Configuration
public class MyKafkaConfig {

    ...

    @Bean
    public KafkaTemplate<String, String> kafkaTemplate() {
        // define a template here
    }
}
@配置
公共类Mykafkanconfig{
...
@豆子
公共卡夫卡模板卡夫卡模板(){
//在这里定义一个模板
}
}

定义的kafka服务有一个注入(自动连接)的KafkaTemplate尝试使用它,将包替换为
*
,确保它在bean列表中打印KafkaProducerService

始终练习为impl服务类创建接口

@Component
public class KafkaProducerServiceImpl implements KafkaProducerService
e、 g


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

RabbitListenerService.java

@Component
public class RabbitListenerService implements MessageListener{
    
    @Autowired
    private KafkaProducerService kafkaProducerService;
    
    
    @Override
    public void onMessage(Message message) {
        System.out.println("message :"+new String(message.getBody()));
        System.out.println("object:"+kafkaProducerService.toString());
        
        try {
            kafkaProducerService.getMessageFromMQ(message);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
@Configuration
public class RabbitConfig {
    
    private static final String my_queue = "TestQueue";
    
    @Autowired
    private RabbitListenerService rabbitListenerService;
    
    
    @Bean
    MessageListenerContainer messageListnerContainer() {
        
        SimpleMessageListenerContainer simpleMessageListenerContainer = new SimpleMessageListenerContainer();
        simpleMessageListenerContainer.setConnectionFactory(connectionFactory());
        simpleMessageListenerContainer.setQueues(myQueue());
        simpleMessageListenerContainer.setMessageListener(rabbitListenerService);
        return simpleMessageListenerContainer;

    }
    
}
然后将此RabbitListenerService自动连接到RabbitConfig

RabbitConfig.java

@Component
public class RabbitListenerService implements MessageListener{
    
    @Autowired
    private KafkaProducerService kafkaProducerService;
    
    
    @Override
    public void onMessage(Message message) {
        System.out.println("message :"+new String(message.getBody()));
        System.out.println("object:"+kafkaProducerService.toString());
        
        try {
            kafkaProducerService.getMessageFromMQ(message);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
@Configuration
public class RabbitConfig {
    
    private static final String my_queue = "TestQueue";
    
    @Autowired
    private RabbitListenerService rabbitListenerService;
    
    
    @Bean
    MessageListenerContainer messageListnerContainer() {
        
        SimpleMessageListenerContainer simpleMessageListenerContainer = new SimpleMessageListenerContainer();
        simpleMessageListenerContainer.setConnectionFactory(connectionFactory());
        simpleMessageListenerContainer.setQueues(myQueue());
        simpleMessageListenerContainer.setMessageListener(rabbitListenerService);
        return simpleMessageListenerContainer;

    }
    
}

是的,我已经定义了KafkaTemplatebean。。更新问题:如果您将kafka模板bean从rabbit服务中取出并放置另一个bean,那么是否找到了另一个bean且不为null?从代码上看,rabbit服务似乎不是由spring管理的。它没有用@Service注释。如果OP没有定义kafkaTemplate,Spring上下文将无法启动。我确定您已经阅读了所有文档,但以防万一,您看过了吗?MessegaeListener实现绑定RabbitListenerService,但不确定Spring如何管理对象。Rabbitmq工作正常,如果您查看stacktrace,它已经打印了我发布到rabbit队列的“hey you”消息,即使我的应用程序正在将hey you消息发布到kafka流,如果我手动定义上述所有自动连接类的话。。当我试图通过注释和自动连线的方式实现这一点时,问题就出现了。。需要帮助吗