dubbo生产者demo启动报错

dubbo生产者demo启动报错

最近学习dubbo时,遇到一个奇怪问题:当生产者启动时,报 No application config found or it's not a valid config! Please add <dubbo:application name="..." /> to your spring config,记录一下解决问题的过程。

报错原因

先说问题结论:jdk版本过高,导致dubbo容器启动失败,demo的dubbo版本是2.7.5,使用jdk11编译运行就会报上述错误,使用jdk1.8就能正常运行。

为什么jdk11会导致dubbo-2.7.5的容器启动失败呢

用两个版本的jdk分别调试发现,BeanFactory中的beanDefinitionMap数量不一样,jdk1.8环境下要多一个org.springframework.context.annotation.internalCommonAnnotationBeanPostProcessor。

CommonAnnotationBeanPostProcessor类在spring中是一个极其重要的类,它负责解析@Resource、@WebServiceRef、@EJB三个注解,而Dubbo容器也依赖这个处理类,没有它的话,dubbo容器启动时,无法把dubbo相关的bean放入ConfigManager中的configsCache。

为什么jdk11环境,spring的BeanFactory会缺少CommonAnnotationBeanPostProcessor

demo程序是使用AnnotationConfigApplicationContext来启动spring容器,它初始化的过程中,有一段检查JSR-250规范的代码:

// Check for JSR-250 support, and if present add the CommonAnnotationBeanPostProcessor.
		if (jsr250Present && !registry.containsBeanDefinition(COMMON_ANNOTATION_PROCESSOR_BEAN_NAME)) {
			RootBeanDefinition def = new RootBeanDefinition(CommonAnnotationBeanPostProcessor.class);
			def.setSource(source);
			beanDefs.add(registerPostProcessor(registry, def, COMMON_ANNOTATION_PROCESSOR_BEAN_NAME));
		}
private static final boolean jsr250Present =
			ClassUtils.isPresent("javax.annotation.Resource", AnnotationConfigUtils.class.getClassLoader());

调试发现,jsr250Present在jdk11环境下是false,在jdk1.8环境下是true,就是这里导致jdk11环境下,spring的BeanFactory缺少CommonAnnotationBeanPostProcessor。

结语

这个案例告诉我们,学习整合各种框架的时候,要注意各个框架运行环境是否一致,不要盲目使用框架的最新版本,也不要盲目升级jdk版本。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值