首先有很多情况导致会@Reference注入为null.所以在网上能看到各种各样的解决办法。
我这里排查的是应用部署成功,同一个包下面其它服务都能正确初始化,唯独一个服务TESTXXX无法初始化。
该服务的初始化结果日志为
<dubbo:reference singleton="true" interface="com.***.***.api.TESTXXX"
uniqueServiceName="com.***.***.api.TESTXXX" generic="false" timeout="5000"
id="com.***.***.api.TESTXXX" /> has been built.
可以看到该服务并没有生成dubbo代理,正常的应该是:
<dubbo:reference singleton="true"
object="com.alibaba.dubbo.common.bytecode.proxy20@3f679ce"
interface="com.***.***.api.TESTXXX" uniqueServiceName="com.***.***.api.TESTXXX"
generic="false" timeout="5000" id="com.***.***.api.TESTXXX" /> has been built.
此时查看部署日志,在初始化结果日志上面有一个warn级别日志:
java.lang.reflect.InvocationTargetException: null
...
Caused by: java.lang.ClassNotFoundException: com.***.***.input.XXXInput
可以看到是类找不到,重新打包再部署服务就正常注册了。
这里要注意,如果你依赖的服务Service里面存在ClassNotFound,而你在本项目中又没有用到这个Class,那在启动过程中,并不会报错,应用也会正常部署。Dubbo对于这种情况也仅仅是打印一个Warning级别的日志而不会影响部署进程。这个日志很可能会淹没在大量的启动日志里面。导致看起来应用启动毫无问题,但是服务却不正常。
因此对于这类问题,可以考虑调整一下日志级别,然后查询关键日志条目的上下内容,也许能帮助我们发现蛛丝马迹。