为什么Spring没有创建一个Bean,即使它有一个@Component注释?



这个问题已经被问过很多次了,我猜,但我没有从这些线程中找到解决我问题的方法。

我得到这个错误,我不能解释为什么。


应用程序启动失败


描述:

com.ll.rabbittutorial.messagingconsumer. messagingconsumerapplication中方法listenerAdapter的参数0需要一个类型为'com.ll.rabbittutorial.messagingconsumer '的bean。无法找到RoomCleanerProcessor

行动:

考虑定义类型为'com.ll.rabbittutorial.messagingconsumer '的bean。

我猜是这个类导致了错误

@Component
public class RoomCleanerProcessor {

private final ObjectMapper objectMapper;
private static final Logger logger = LoggerFactory.getLogger(RoomCleanerProcessor.class);
@Autowired
public RoomCleanerProcessor(ObjectMapper objectMapper)
{
super();
this.objectMapper=objectMapper;
}
public void receiveMessage(String roomJson){
logger.info("Message received");
try{
Room room = this.objectMapper.readValue(roomJson, Room.class);
logger.info("Room ready for cleaning "+room.getNumber());
} catch (IOException e) {
logger.error("Exception caught", e);
}
}
}

首先,同样的错误出现在我试图注入的ObjectMapper对象上。但是在应用程序类中使用@ComponentScan注释后,问题就消失了。

@SpringBootApplication
@ComponentScan({"com.ll.rabbittutorial.messagingconsumer.RoomCleanerProcessor"})
public class MessagingconsumerApplication {
@Value("$amqp.queue.name}")
private String queueName;
@Value("${amqp.exchange.name}")
private String exchangeName;
@Bean
public Queue queue(){
return new Queue(queueName, false);
}
@Bean
public TopicExchange topicExchange(){
return new TopicExchange(exchangeName);
}
@Bean
public Binding binding(Queue queue, TopicExchange topicExchange){
return BindingBuilder.bind(queue).to(topicExchange).with(queueName);
}
@Bean
public MessageListenerAdapter listenerAdapter(RoomCleanerProcessor roomCleanerProcessor){
return new MessageListenerAdapter(roomCleanerProcessor, "receiveMessage");
}
@Bean
public SimpleMessageListenerContainer container(ConnectionFactory connectionFactory, MessageListenerAdapter listenerAdapter){
SimpleMessageListenerContainer container = new SimpleMessageListenerContainer();
container.setConnectionFactory(connectionFactory);
container.setQueueNames(queueName);
container.setMessageListener(listenerAdapter);
return container;
}
public static void main(String[] args) {
SpringApplication.run(MessagingconsumerApplication.class, args);
}
}

我认为我可以解决这个问题也组件扫描应用程序类,但它没有帮助。我怎么解决这个问题?

@ComponentScan值应该包含包,而不是类。此外,@SpringBootApplication封装了@Configuration, @EnableAutoConfiguration,和@ComponentScan注释与他们的默认属性。

@ComponentScan的默认值是无参数。如果不带参数,它会告诉Spring扫描当前包及其所有子包。因此,如果您将MessagingconsumerApplication放在RoomCleanerProcessor的父包中,它应该工作。

相关内容

最新更新