背景
使用 idea 对 dubbo 消费者源码进行 debug 时,出现了 <dubbo:reference interface="" /> interface not allow null! 异常,而如果不 debug 运行,就不会出现异常,具体如下:
[15/04/21 05:19:22:022 GMT+08:00] main WARN config.AbstractConfig: [DUBBO] null, dubbo version: 2.6.3, current host: 169.254.11.29 java.lang.reflect.InvocationTargetException at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at com.alibaba.dubbo.config.AbstractConfig.toString(AbstractConfig.java:466) at com.intellij.rt.debugger.BatchEvaluatorServer.evaluate(BatchEvaluatorServer.java:23) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:1153) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1103) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:513) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:483) at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:312) at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:308) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197) at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:742) at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:867) at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:543) at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:139) at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:93) at com.shulipeng.dubbo.samples.echo.EchoConsumer.main(EchoConsumer.java:16) Caused by: java.lang.IllegalStateException: <dubbo:reference interface="" /> interface not allow null! at com.alibaba.dubbo.config.ReferenceConfig.init(ReferenceConfig.java:191) at com.alibaba.dubbo.config.ReferenceConfig.get(ReferenceConfig.java:163) at com.alibaba.dubbo.config.spring.ReferenceBean.getObject(ReferenceBean.java:66)
原因
从上面的异常信息可以发现异常栈中有一个这个类 at com.intellij.rt.debugger.BatchEvaluatorServer.evaluate(BatchEvaluatorServer.java:23),很明显可以看出来这是 idea 的jar包的方法。
原因就是 idea 在 debug 的时候,当 debug 到某一个对象时,会调用对象的 toString() 方法,用来在debug界面显示对象信息。
大多数情况下是没有任何问题的,但是对于重写了 toString() 方法的类,随意的调用 toString 方法就可能导致异常。
我这里就是因为 dubbo 的AbstractConfig类,它重写了 toString() 方法,进而会导致其子类 ReferenceConfig 的 initialized 属性错误的被修改为true,然后就会出现这种异常。
因为 AbstractConfig 的 toString() 方法中如果类中方法名前缀是 get 时,会调用此方法来获取对应的参数值,而正好 ReferenceConfig 的初始化对象的方法就是在 get() 方法中的,进而会将 initialized 设置为 true,此时 ReferenceConfig 的 interfaceName 等参数还没有被设置,所以就会抛出异常。
解决方法
在配置中关闭 idea 在 debug 的时候调用 toString() 方法:
参考于: https://blog.csdn.net/lkforce/article/details/90479650