【DEBUG】记录weixin-java-mp启动时出现“找不到 xxxx”的问题

背景

把微信扫码登录的功能从一个项目迁移到另一个项目中,
框架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 中找到了类似的问题:

image.png

虽然包名不一样但原因相同,开发者也给出了原因:

image.png

想到这个项目以前虽然没使用过公众号的组件,但用过小程序的组件,
仔细一看自己项目的 pom 发现,公众号和小程序的组件的版本确实不一样
image.png

由于先引入的小程序,所以 maven 的库就变成了这样:
image.png

所以才导致了公众号组件对 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 -> 重新加载项目
image.png

启动成功:
image.png

总结

当使用com.github.binarywang的开源微信组件家族时,需要保持多个组件的版本相同,否则就会出现 common 包和某个具体的包版本不一致的情况,进而导致某些类的依赖注入失败

最后留个开源项目地址:https://github.com/Wechat-Gro...

一个正在茁壮成长的零基础小白

1.3k 声望
52 粉丝
0 条评论
推荐阅读
VUE3添加静态配置文件,实现编译后修改后端URL
以前用Angular的时候,因为使用了拦截器+Nginx代理,所以不存在修改后端地址的问题。但现在的项目没有那么规范,后端地址是写死在项目里,而且直接跨域这就诞生了一个需求:能不能在VUE编译之后,在不修改源码的...

LYX6666阅读 106

Spring Aop 动态代理
为了保持行为的一致性,代理类和委托类通常会实现相同的接口,所以在访问者看来两者没有丝毫的区别。通过代理类这中间一层,能有效控制对委托类对象的直接访问,也可以很好地隐藏和保护委托类对象,同时也为实施...

KerryWu5阅读 8.7k评论 1

SpringBoot集成LibreOffice+jodconverter做文件预览(office转pdf)
LibreOffice 是一款开放源代码的自由免费全能办公软件,可运行于 Microsoft Windows, GNU/Linux 以及 macOS 等操作系统上。它包含了 Writer, Calc, Impress, Draw, Math 以及 Base 等组件,可分别用于文本文档、...

Zeran2阅读 6.2k

之前很火给女朋友推送微信服务号消息是怎么做的?
经过了几天的奋战,终于把微信服务号的模板消息给写完了。后端其实没花多少时间,因为之前已经有同学提过pull request了,我在这基础之上简单优化下就完事了,主要的时间都是花在前端上,对前端页面和参数的适配...

Java3y3阅读 1.2k

简单使用spring cloud 服务注册做一个请求转发中心
背景上篇文章 记录多项目共用一个公众号逻辑修改, 实现了多个项目共用一个公众号。 但是也存在几点问题,比如:中间服务器拦截了微信的请求,虽然方便了项目不再需要写微信授权的代码,但如果以后需要再拓展新的...

weiweiyi2阅读 759

消息推送平台终于要上线啦!
我的开源项目消息推送平台Austin终于要上线了,迎来在线演示的第一版!🔥项目在线演示地址:[链接]消息推送平台🔥推送下发【邮件】【短信】【微信服务号】【微信小程序】【企业微信】【钉钉】等消息类型。[链接][链...

Java3y3阅读 1.1k

Java项目是不是分布式,真有那么重要吗?
「微服务」「分布式」在我刚毕业的时候还是比较关注的,那时候还入门了一把SpringCloud,写了一篇很长的文章,还是很顶的,有不少的大号都给我转载了,在知乎又获得了很多的赞。

Java3y2阅读 575评论 1

一个正在茁壮成长的零基础小白

1.3k 声望
52 粉丝
宣传栏