背景
使用 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