叨叨
休了个小长假,时隔小半年,今天首开张,来记第一篇,中间还信誓旦旦地要开两个主题,自我巩固和学习呢,我信了你个鬼~~~~想起上学时,怎么把一大包作业背回家,就怎么背回来一样,书包都不曾打开。嗯,起题,说正篇(休了近5个月,手有点生,思路有点慢了),今天记录个小问题,送给有需要的同学们~
问题描述
springboot项目,引MongoDatabase(mongo驱动包中的对象)和Adminclient(kafkaclient中对象)提示无法注入【Could not autowire. No beans of ‘MongoDatabase’ type found. more… (Ctrl+F1)】,如下图所示
启动后报错如下【Consider defining a bean of type ‘org.apache.kafka.clients.admin.AdminClient’ in your configuration.】:
排除检查
- 看springboot的启动类的路径,出错的类必须在启动类同一个包下面或者在启动类包的子包中,自我检查没有问题
- 检查pom文件中是否引入(第三方的jar包也都引入了,没有问题啊)
- 检查注解:
注解也加入了,确定可以被扫描到
问题确认
发现MongoDatabase是一上接口
Adminclient是一个抽象类
记着之前有看源码,抽象类和接口无法直接交由beanFactory去托管,无法直接通过反射实例化对象(具体请大家自行查找再确认哈),估测应该与此问题有问。
解决方案
根据启动时的异常提示去修改下 :
【Consider defining a bean of type ‘org.apache.kafka.clients.admin.AdminClient’ in your configuration】
创建config,然后自己通过bean注解配制,交由框架加 载托 管。参考代码如下图所示:
再去检查注情况,嗯,编译就 过了~~
就这样,大致写了一下,希望可以帮到遇到相同问题的你,以上内容仅供参考,具体问题还需要具体分析。
总结一下注解无法注入问题
- springboot的默认装配规则是通它自身的启动类的所在包位置从上到小扫述的。所以要放好启动类的位置,通过是放置在最外层。比如说把启动类放在了com.zl.test,那么在这个路径下的所有类或子包都可以被加载到,但要是com.zl.common下就无法被扫描到了。如果有特别原在,不能放置在一起,需要手动在启动类中加扫描注解。
- 要知道只有加了注解的类才会被spring加载,交由beanFactory管理,所以在使用注解的类和需要被注入的类 加入注解,eg :service上加了@Service的注解,想在control中注放service,那么需要在controller中也加上注解@Controller才可以
- 还有一种情况要注意,就是new出来的类无法注入,这个点也是比较容易踩坑的
- 然后就是我上面遇到的问题,需要自己手动@Bean了