ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

【电商项目】短信测试遇到的问题与解决方案:InaccessibleObjectException报错、

【电商项目】短信测试遇到的问题与解决方案:InaccessibleObjectException报错、 目录一、InaccessibleObjectException报错二、单元测试报错一、InaccessibleObjectException报错首先说一个尴尬的报错问题。我在测试短信发送功能的时候后台报了这个错InaccessibleObjectException意思是代码或第三方库想通过反射偷偷访问 JDK 内部某个类或方法但 Java 不让这么干因为那个类没对你这边的模块开放访问权限。对应到我的代码说人话就是我发短信的那个代码抛了个异常Dubbo 想把这个异常传回来结果传的时候被 Java 拦住了说“这个异常里面有我内部的东西不让你看”然后 Dubbo 自己就崩了真正的错误信息都看不到。然后我去查了下造成的原因网上常说的有这几种情况JDK 版本太高Java 9 引入了模块化系统默认禁止反射访问 JDK 内部类fastjson2 序列化 JDK 内部类比如ExecutionException时被模块化拦截解决方案基本都一样加 JVM 启动参数--add-opens java.base/java.util.concurrentALL-UNNAMED手动开放访问权限。本人很有自知之明啊感觉自己弄不明白这个问AI还容易被带偏所以去求助老师了。老师说这可能是网关导致请求没转发到后端服务把 Dubbo 的请求转发丢了或者端口没通导致调用失败让我先去检查 Higress 的端口映射有没有问题。结果发现端口确实有点问题。Higress 容器内部的服务默认监听在 8080 端口而不是 80。我访问宿主机的 80 端口Docker 帮我转给容器里的 8080 端口。应该是80映射8080端口而不是80端口。具体执行操作及结果如下[rootlocalhost ~]# 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 [rootlocalhost ~]# docker stop a3 a3 [rootlocalhost ~]# cd /usr/local/higress/ [rootlocalhost 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 [rootlocalhost 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_SERVICEAccount suspended due to an insufficient balance.账号余额不足账户被停用短信服务暂停。解决给发送的号码添加到白名单五分钟后生效即可。
返回列表