IDEA 中调试 dubbo 出现 <dubbo:reference interface="" /> interface not allow null! 异常

背景 

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

 

posted @ 2021-04-15 18:06  君子如珩~  阅读(1572)  评论(0编辑  收藏  举报