【电商项目】短信测试遇到的问题与解决方案:InaccessibleObjectException报错、单元测试通过但未接收到验证码

目录

一、InaccessibleObjectException报错

二、单元测试报错


一、InaccessibleObjectException报错

首先说一个尴尬的报错问题。

我在测试短信发送功能的时候后台报了这个错👇

**InaccessibleObjectException :**意思是代码(或第三方库)想通过反射偷偷访问 JDK 内部某个类或方法,但 Java 不让这么干,因为那个类没对你这边的模块开放访问权限。

对应到我的代码说人话就是:我发短信的那个代码抛了个异常,Dubbo 想把这个异常传回来,结果传的时候被 Java 拦住了,说"这个异常里面有我内部的东西,不让你看",然后 Dubbo 自己就崩了,真正的错误信息都看不到。

然后我去查了下造成的原因,网上常说的有这几种情况:

  1. JDK 版本太高(Java 9+ 引入了模块化系统,默认禁止反射访问 JDK 内部类)
  2. fastjson2 序列化 JDK 内部类(比如 ExecutionException)时被模块化拦截

解决方案基本都一样:加 JVM 启动参数 --add-opens java.base/java.util.concurrent=ALL-UNNAMED,手动开放访问权限。

本人很有自知之明啊,感觉自己弄不明白这个,问AI还容易被带偏,所以去求助老师了。

老师说,这可能是网关导致请求没转发到后端服务 ,把 Dubbo 的请求转发丢了或者端口没通导致调用失败,让我先去检查 Higress 的端口映射有没有问题。结果发现端口确实有点问题。

Higress 容器内部的服务默认监听在 8080 端口,而不是 80。

我访问宿主机的 80 端口,Docker 帮我转给容器里的 8080 端口。

应该是80映射8080端口而不是80端口。 具体执行操作及结果如下**👇:**

复制代码
[root@localhost ~]# docker ps
CONTAINER ID   IMAGE                                                                   COMMAND                  CREATED       STATUS       PORTS                                                                                                                                                                                                                 NAMES
f4b815f5775b   apacherocketmq/rocketmq-dashboard:latest                                "sh -c 'java $JAVA_O..."   2 days ago    Up 2 hours   0.0.0.0:8888->8082/tcp, [::]:8888->8082/tcp                                                                                                                                                                           rocketmq-dashboard
a32725f968e4   higress-registry.cn-hangzhou.cr.aliyuncs.com/higress/all-in-one:2.2.3   "supervisord -c /etc..."   11 days ago   Up 2 hours   0.0.0.0:80->80/tcp, [::]:80->80/tcp, 0.0.0.0:443->443/tcp, [::]:443->443/tcp, 0.0.0.0:8001->8001/tcp, [::]:8001->8001/tcp, 0.0.0.0:8080->8080/tcp, [::]:8080->8080/tcp, 0.0.0.0:8443->8443/tcp, [::]:8443->8443/tcp   higress
[root@localhost ~]# docker stop a3
a3
[root@localhost ~]# cd /usr/local/higress/
[root@localhost higress]# docker run -d --rm --name higress-ai -v ${PWD}:/data \
     -p 8001:8001 -p 80:8080 -p 8443:8443  \
     higress-registry.cn-hangzhou.cr.aliyuncs.com/higress/all-in-one:latest

1e224b2c4b67ea20b4acd874bc1dd755cee4c9824e7ad5cb1b51ac8b1cd69fc0
[root@localhost higress]# 

改完之后重新启动容器,但 Dubbo 调用还是报同样的错,所以问题不在这。

于是我又请师出山了。

老师远程检查了一番告诉我:

🤡弄了半天原来是这样。

InaccessibleObjectException 的前提是 Dubbo 在传一个异常,如果业务代码不抛异常,根本不会走到这一步。我应该把关注点放在"为什么会有异常"。再去看代码,我的 sendLoginCheckCode 方法调了短信接口,代码会去调短信接口,但测试环境没有营业执照发不出短信,就会抛异常,Dubbo 传异常时卡在了序列化那一步( Dubbo 要把短信发送失败的异常传回给调用方,但这个异常里包含了 JDK 内部的类,Java 9+ 的模块化机制不让序列化这种内部类,所以被拦住了),所以看到的是 InaccessibleObjectException,看不到真正的短信发送失败原因。

真是令人头大,下一个问题。

二、单元测试报错

把自己的手机号注册到阿里云短信测试白名单之后,单元测试发送短信报错。

这里主要就是强调一点注意:

  • 正常启动服务(main 方法启动):会加载 bootstrap.yml,连接 Nacos 拉配置。

  • JUnit 单元测试:不会自动触发 Nacos 配置加载逻辑 ,只会读取本地 application.yml。

  • 编写:

    aliyun:
    accessKeyId: 你的key
    accessKeySecret: 你的secret
    sms:
    signName: 你的签名
    templateCode: 你的模板code

我在弄完后,短信发送成功(代码不报错)但是收不到短信。然后想到了我之前给从阿里云复制的代码签名改了(我寻思测试就起个测试名)。改回来就好了。

不能随便在代码里改签名名字,代码写的签名必须是阿里云控制台【已经审核通过】的签名

然后我去逗我朋友玩,用他们的手机号测试,测试成功但验证码未收到。

isv.OUT_OF_SERVICE``Account suspended due to an insufficient balance.账号余额不足,账户被停用,短信服务暂停。

解决:给发送的号码添加到白名单五分钟后生效即可。

相关推荐
道尔柯南40 分钟前
C++ string 类详解:从常用接口到深拷贝,彻底掌握字符串处理
android·java·c++
kingx32 小时前
Bugku 3122 谷歌小恐龙题解:纯离线逆向 Vault 的 AES-GCM 加密资源(附 Python 解密器)
java·逆向·ctf·bugku·aes-gcm
DevOpenClub4 小时前
职教高考控制线 API:招生类别枚举、筛选与空分数含义
java·数据库·高考
露天赏雪5 小时前
第3篇:Sentinel熔断降级实战:大模型接口抖动时的服务兜底方案
java·开发语言·人工智能·spring boot·spring·servlet·sentinel
天天被压力5 小时前
【A股分钟级高频数据完全手册 #06】北交所分钟级数据接口:京市股票Pro版最新分时
java·人工智能·python
天天被压力5 小时前
【A股分钟级高频数据完全手册 #05】指数历史分钟数据接口:Pro版沪深指数分时回放
java·人工智能·python
captain3765 小时前
▲统一功能——DispatcherServlet源码分析
java·spring·java-ee·log4j·maven
金銀銅鐵6 小时前
JDK 21 中 List.of 的实现细节:从 List12 到 ListN
java·后端·ai编程
yeccheng7 小时前
MySQL 索引超详解:从底层 B+ 树到面试高频考点
java·开发语言·jvm·mysql·面试
这个昵称不容易7 小时前
SpringBoot 读书笔记共享平台部署实战:97 个 Java 文件 / 113 个接口 / 10 张表
java·springboot·毕设