关于微信:DEBUG记录weixinjavamp启动时出现找不到-xxxx的问题

47次阅读

共计 2315 个字符,预计需要花费 6 分钟才能阅读完成。

背景

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

正文完
 0