背景
把微信扫码登录的性能从一个我的项目迁徙到另一个我的项目中,
框架 SpringBoot,应用开源我的项目 weixin-java-mp
<!-- 微信公众号 SDK-->
<dependency>
<groupId>com.github.binarywang</groupId>
<artifactId>weixin-java-mp</artifactId>
<version>4.4.0</version>
</dependency>
在相干代码粘贴好之后,启动时呈现:
Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException:
Error creating bean with name 'districtServiceImpl':
Unsatisfied dependency expressed through field 'webUserService';
nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException:
Error creating bean with name 'webUserServiceImpl' defined in file [/Users/lyx/code/smart-community/api/target/classes/club/yunzhi/smartcommunity/service/WebUserServiceImpl.class]:
Unsatisfied dependency expressed through constructor parameter 2;
nested exception is org.springframework.beans.factory.BeanCreationException:
Error creating bean with name 'weChatMpService':
Invocation of init method failed; nested exception is java.lang.NoClassDefFoundError:
me/chanjar/weixin/common/api/WxMessageInMemoryDuplicateCheckerSingleton
为了便于观看,曾经进行手动换行,剖析报错信息得悉,呈现依赖注入问题,
异样类型:java.lang.NoClassDefFoundError
districtServiceImpl -> webUserService -> weChatMpService -> WxMessageInMemoryDuplicateCheckerSingleton 失败
最终起因是这个类 WxMessageInMemoryDuplicateCheckerSingleton
找不到
排查
(提醒:代码不必细看,每个人遇到的问题不齐全一样)
下面的注入过程中,除了 WxMessageInMemoryDuplicateCheckerSingleton
是外部类,其余都是本人写的类
简略查看了一下调用过程,间接搜寻报错的类搜不到后果,
而后往回找,在 weChatMpService 中有一个 new WxMpMessageRouter 的操作(用于解决不同类型的微信音讯):
final WxMpMessageRouter newRouter = new WxMpMessageRouter(this);
而这个 WxMpMessageRouter 的构造函数中呈现了报错信息中的类:
this.messageDuplicateChecker = WxMessageInMemoryDuplicateCheckerSingleton.getInstance();
这就找到了问题具体的地位,但外部类的问题,咱们是没方法间接解决的。
而后去 Gooooooogle,在 GitHub 的我的项目 issue 中找到了相似的问题:
尽管包名不一样但起因雷同,开发者也给出了起因:
想到这个我的项目以前尽管没应用过公众号的组件,但用过小程序的组件,
认真一看本人我的项目的 pom 发现,公众号和小程序的组件的版本的确不一样
因为先引入的小程序,所以 maven 的库就变成了这样:
所以才导致了公众号组件对 common 组件调用失败
解决办法:放弃版本统一
本着“最小批改”的准则,打算把公众号组件和已有版本保持一致,改回 4.1 版本
<!-- 微信公众号 SDK-->
<dependency>
<groupId>com.github.binarywang</groupId>
<artifactId>weixin-java-mp</artifactId>
<version>4.1.0</version>
</dependency>
<!-- 微信公众号 SpringBoot 连接器 -->
<dependency>
<groupId>com.github.binarywang</groupId>
<artifactId>wx-java-mp-spring-boot-starter</artifactId>
<version>4.1.0</version>
</dependency>
而后 pom.xml -> maven -> 从新加载我的项目
启动胜利:
总结
当应用 com.github.binarywang
的开源微信组件家族时,须要放弃多个组件的版本雷同,否则就会呈现 common 包和某个具体的包版本不统一的状况,进而导致某些类的依赖注入失败
最初留个开源我的项目地址:https://github.com/Wechat-Gro…