Caused by: java.lang.IllegalStateException: <dubbo:service interface="" /> interface not allow null!
at org.apache.dubbo.config.ServiceConfig.checkAndUpdateSubConfigs(ServiceConfig.java:308)
at org.apache.dubbo.config.ServiceConfig.export(ServiceConfig.java:369)
at org.apache.dubbo.config.spring.ServiceBean.export(ServiceBean.java:336)
at org.apache.dubbo.config.spring.ServiceBean.onApplicationEvent(ServiceBean.java:114)
at org.apache.dubbo.config.spring.ServiceBean.onApplicationEvent(ServiceBean.java:60)
at org.springframework.context.event.SimpleApplicationEventMulticaster.doInvokeListener(SimpleApplicationEventMulticaster.java:172)
at org.springframework.context.event.SimpleApplicationEventMulticaster.invokeListener(SimpleApplicationEventMulticaster.java:165)
at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:139)
at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:403)
at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:409)
at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:360)
at org.springframework.context.support.AbstractApplicationContext.finishRefresh(AbstractApplicationContext.java:897)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:553)
at org.springframework.cloud.context.named.NamedContextFactory.createContext(NamedContextFactory.java:136)
at org.springframework.cloud.context.named.NamedContextFactory.getContext(NamedContextFactory.java:101)
at org.springframework.cloud.context.named.NamedContextFactory.getInstance(NamedContextFactory.java:145)
at org.springframework.cloud.openfeign.FeignClientFactoryBean.get(FeignClientFactoryBean.java:224)
at org.springframework.cloud.openfeign.FeignClientFactoryBean.feign(FeignClientFactoryBean.java:85)
at org.springframework.cloud.openfeign.FeignClientFactoryBean.getTarget(FeignClientFactoryBean.java:261)
at org.springframework.cloud.openfeign.FeignClientFactoryBean.getObject(FeignClientFactoryBean.java:251)
at org.springframework.beans.factory.support.FactoryBeanRegistrySupport.doGetObjectFromFactoryBean(FactoryBeanRegistrySupport.java:171)
... 110 common frames omitted
dubbo用了2.7.3的版本,feign starter用了0.2.4的版本
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo</artifactId>
<version>2.7.3</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
<version>0.2.4</version>
</dependency>
根据错误日志可以看出FeignClientFactoryBean 工厂bean获取对象的时候发布了ContextRefreshedEvent事件; 而dubbo 的serviceBean 实现了ApplicationListener监听器,所以dubbo serviceBean也可以监听到ApplicationEvent事件就会触发 dubbo 服务的暴露, 而这个时候,bean可能还没有初始化,就会报第一条所列的错误信息。
由于spring bean 初始化过程bean的顺序并不一定一样,所以就会出现当dubbo service bean 先初始化时就不会报错,当feign FeignClientFactoryBean 先于duobbo service bean 初始化时就会报第一条所列的错误。导致应用能不能启动成功全看运气的尴尬局面
怎么解决呢?
思路一: 把 dubbo service bean 扫描初始化的优先级提高,但是这个业务bean 保证顺序应该也是难保证的
思路二: 升级dubbo 版本, dubbo service bean 监听ApplicationEvent 实现服务暴露, 而ApplicationEvent 事件在spring启动过程中,发先可能很多框架都在发布ApplicationEvent事件,容易造成监听到错误信息(噪音太多)导致误判
按照思路二升级dubbo版本,升级dubbo版本到2.7.9版本就可以解决了该问题。
2.7.9的版本dubbo service bean 不再实现ApplicationListener,所以自然就没有这个问题了
附: 其实升级dubbo版本的过程中也试了好几个版本,虽然可以解决和feign组件的兼容性问题,但出现了和其他框架(如nacos)兼容性问题,只有2.7.9这个版本没有问题。 所以大家如果也遇到了这个问题,要耐心解决一下