背景
先来说一说遇到的情况吧,最近自己负责的模块中需要用到redis缓存,而这个缓存是另一个模块存入的,现在自己的模块需要使用这个缓存,本来准备自己引用redis的starter,但是遇到了问题,自己写的代码无论如何也取不出redis中的数据,最后发现是序列化的问题,看了一下公共模块的序列化代码,懵逼,就去问了问老大,结果redis这一块他已经写成了一个公共模块了,我只需要引入这个模块的依赖就行了,就可以使用了;本来看似很简单的一件事情,最后的结果却出人意料,无法使用公共模块的;本篇文章就说明无法使用公共模块的问题;
正文
项目结构
我做的这个模块是一个单独的项目,一个使用springboot构建的微服务,公共模块只是一个普通的Java项目,可以看成一个jar包,我这个模块只需要在pom中引入依赖就可以调用;
遇到的问题
项目中无法注入该公共模块的任何类,在调用时全部都会报空指针异常,而序列化的代码都是写在公共模块的,只能去找原因了;
解决
因为全部都是报空指针异常,在之前的项目中也遇到过一个类似这样的题,当时也是无法注入spring容器中的bean类;当时是使用new的方式构建的类无法注入spring容器中的类,而当时把容器中的bean都打印了一遍;所以这一次第一个想到的办法就是打印spring容器中的bean;结果公共模块的类全部未在spring容器中,我就打开了公共模块的类,发现每一个类上边都有@Component
注解,然后就去看了这个模块的路径,发现两个的路径完全不一样;
公共模块的路径:com.operations.project.seed.redis.util
;
调用的项目的路径:com.operations.project.message.server
;
一下子就想到了是公共模块的类是没有被扫描进容器中,因为springboot项目的启动类上的@SpringBootApplication
注解包含了@ComponentScan
注解,而该注解默认扫描该类所属的包下边所有的类,包含子目录中的类;两者的路径完全不一样;
最后在启动类上加入了一个注解:
@ComponentScan({"com.operations.project.seed","com.operations.project.message.server"})
需要注意的是这里扫描的是两个路径,因为这个注解会使@SpringBootApplication
注解中包含的@ComponentScan
注解失效,所以需要将需要调用的公共类的路径以及自己所属项目的路径扫描进去;
总结
再接再厉