当前位置: 代码迷 >> java >> 无法在 MessageListener 类 AMQP 中自动装配 bean
  详细解决方案

无法在 MessageListener 类 AMQP 中自动装配 bean

热度:57   发布时间:2023-07-17 20:50:47.0

好的。 所以我有一个带有一些常量的兔子配置类,我尝试向我的 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;
}

那应该可以解决这个错误。

  相关解决方案