巨大的建筑,总是由一木一石叠起来的,我们何妨做做这一木一石呢?我时常做些零碎事,就是为此。
这是对的,但是我没有说过这句话! —— 鲁迅
老项目是使用xml进行的配置,如下:
<bean id="kanBanSocketListerner" class="com.enn.zhwl.api.consumer.KanBanSocketConsumer"/>
而在KanBanSocketConsumer中有属性的注入
public class KanBanSocketConsumer implements MessageListener<Integer, String> {
private static final Logger logger = LoggerFactory.getLogger(KanBanSocketConsumer.class);
@Autowired
private RedisBaseService redisBaseService;
@Autowired
private MyWebSocketService myWebSocketService;
@Override
public void onMessage(ConsumerRecord<Integer, String> data) {
logger.debug("kabanSoketConsumer receive info");
}
}
注意:这个类里面在class上面是没有@Component
或者@Service
等注解的,但是在属性中却有@Autowired
注解。
没有@Component等注解,那spring本身是不会去扫描该类,当然也不会去注入属性,但是之前为什么是可以的呢,因为在spring的配置文件中进行的声明。见上面的xml。
现在老项目升级spring-boot。这个 KanBanSocketConsumer
不用在xml中进行声明了,观察了一下,这个类本身没有被用到,而是在生成 KafkaMessageListenerContainer
这个类的时候,用到了一次,我就想是否不需要声明,直接在声明 KafkaMessageListenerContainer
的时候,把 KanBanSocketConsumer
new出来即可,如下:
@Bean(value = "webSoketMessageListenerContainer", initMethod = "doStart")
public KafkaMessageListenerContainer webSoketMessageListenerContainer(@Qualifier("kanBanSocketFactory") MyKafkaConsumerFactory consumerFactory) {
KanBanSocketConsumer kanBanSocketConsumer = new KanBanSocketConsumer();
ContainerProperties containerProperties = new ContainerProperties(kanbanTopic);
containerProperties.setMessageListener(kanBanSocketConsumer);
KafkaMessageListenerContainer kafkaMessageListenerContainer = new KafkaMessageListenerContainer(consumerFactory, containerProperties);
return kafkaMessageListenerContainer;
}
但是运行的时候,报错了,就是上面提到的错误,@Autowired
失效,到用到@Autowired
的service的时候,报了空指针.
所以需要在声明 KafkaMessageListenerContainer
的时候,虽然 KanBanSocketConsumer
类其他地方并没有被使用到,但是因为这个类中使用了@Autowired
等注解,该类就需要也被声明一下。这样spring才知道去注入相应的属性.如下:
@Bean
public KanBanSocketConsumer kanBanSocketConsumer() {
return new KanBanSocketConsumer();
}
@Bean(value = "webSoketMessageListenerContainer", initMethod = "doStart")
public KafkaMessageListenerContainer webSoketMessageListenerContainer(@Qualifier("kanBanSocketFactory") MyKafkaConsumerFactory consumerFactory,
@Autowired KanBanSocketConsumer kanBanSocketConsumer) {
//KanBanSocketConsumer kanBanSocketConsumer = new KanBanSocketConsumer();
ContainerProperties containerProperties = new ContainerProperties(kanbanTopic);
containerProperties.setMessageListener(kanBanSocketConsumer);
KafkaMessageListenerContainer kafkaMessageListenerContainer = new KafkaMessageListenerContainer(consumerFactory, containerProperties);
return kafkaMessageListenerContainer;
}
重新启动,不再报该错误.