背景

把微信扫码登录的性能从一个我的项目迁徙到另一个我的项目中,
框架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...