簡體   English   中英

無法在 MessageListener 類 AMQP 中自動裝配 bean

[英]Cannot autowire bean in MessageListener Class AMQP

好的。 所以我有一個帶有一些常量的兔子配置類,我嘗試向我的 listenercontainer 偵聽器添加一個服務。

@Configuration
public class RabbitConfig {

@Bean
public ConnectionFactory connectionFactory() {
    CachingConnectionFactory connectionFactory = new CachingConnectionFactory(HOST);
    connectionFactory.setPort(CONN_PORT);
    connectionFactory.setUsername(USERNAME);
    connectionFactory.setPassword(PASSWORD);
    return connectionFactory;
}

@Bean
public AmqpAdmin amqpAdmin() {
    return new RabbitAdmin(connectionFactory());
}

@Bean
public RabbitTemplate rabbitTemplate() {
    RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory());
    rabbitTemplate.setReplyQueue(replyQueue());
    rabbitTemplate.setCorrelationKey(UUID.randomUUID().toString());
    return rabbitTemplate;
}

@Bean
public Queue replyQueue() {
    return new Queue(REPLY_QUEUE_NAME);
}

@Bean
public SimpleMessageListenerContainer messageListenerContainer() {

    SimpleMessageListenerContainer container = new SimpleMessageListenerContainer(connectionFactory());
    container.setQueueNames(QUEUE_NAME);
    container.setMessageListener(messageListener());
    return container;
}

@Bean
public MessageListener messageListener(){
    return new RabbitListener();
}

}

我正在嘗試將我的項目中的服務注入到在最后一行中創建的消息偵聽器中。 這會觸發無法自動裝配字段的錯誤,就好像該字段不是由 Spring 管理的一樣。 我做了一些研究,並驗證了我的組件掃描包並將其設置為所有項目,我用 @Component 注釋了 rabbitlistener,所以我無法真正找到錯誤或為什么 Spring 無法在我的偵聽器類中自動裝配該字段。 這是代碼。

@Component
public class RabbitListener implements MessageListener {
Logger logger = LoggerFactory.getLogger(this.getClass());

@Autowired
ImagesService imagesService;


@Override
public void onMessage(Message message) {
//processing message
}

請問有什么想法嗎?

如果你能分享完整的 StackTrace 會更好,但我建議你做這樣的事情:

  1. 為你的@Configuration類添加@ComponentScan並在那里指定你的RabbitListenerImagesService類所在的那些包

  2. @Component標記最后兩個(是的,我在你的RabbitListener上看到了,但不清楚你的ImagesService在哪里以及它是如何繞過它的)

  3. @Autowire RabbitListener到那個RabbitConfig而不是@Bean

並注意與@Component@Bean混合:你最終有兩個豆,如果你有@ComponentScan該軟件包,當然。

好的,你需要@Autowire RabbitListener bean。 由於RabbitListener是一個需要由 IOC 管理的 bean,因為聲明了@Component ,因此 @runtime RabbitListener不在上下文中,因此像這樣在配置類中自動裝配它

@Configuration
public class RabbitConfig {

@Bean
public ConnectionFactory connectionFactory() {
    CachingConnectionFactory connectionFactory = new CachingConnectionFactory(HOST);
    connectionFactory.setPort(CONN_PORT);
    connectionFactory.setUsername(USERNAME);
    connectionFactory.setPassword(PASSWORD);
    return connectionFactory;
}

@Bean
public AmqpAdmin amqpAdmin() {
    return new RabbitAdmin(connectionFactory());
}

@Bean
public RabbitTemplate rabbitTemplate() {
    RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory());
    rabbitTemplate.setReplyQueue(replyQueue());
    rabbitTemplate.setCorrelationKey(UUID.randomUUID().toString());
    return rabbitTemplate;
}

@Bean
public Queue replyQueue() {
    return new Queue(REPLY_QUEUE_NAME);
}

@Bean
public SimpleMessageListenerContainer messageListenerContainer() {

    SimpleMessageListenerContainer container = new SimpleMessageListenerContainer(connectionFactory());
    container.setQueueNames(QUEUE_NAME);
    container.setMessageListener(rabbitListener); // reference the autowired RabbitListener on this line
    return container;
}

@Autowire
private RabbitListener rabbitListener;
}

那應該可以解決這個錯誤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM