从最后的解决结果来看,不是问题奇葩,是代码编写的奇葩,哈哈
看问题表象:
调接口,返回一个NPE,是海康的一个SDK中类的sign签名方法报错。
java.lang.RuntimeException: java.lang.NullPointerException
at com.hikvision.artemis.sdk.util.SignUtil.sign(SignUtil.java:68)
at com.hikvision.artemis.sdk.util.HttpUtil.initialBasicHeader(HttpUtil.java:535)
at com.hikvision.artemis.sdk.util.HttpUtil.httpPost(HttpUtil.java:257)
at com.hikvision.artemis.sdk.Client.execute(Client.java:68)
at com.hikvision.artemis.sdk.ArtemisHttpUtil.doPostStringArtemis(ArtemisHttpUtil.java:433)

这个错误找了很久的原因,是因为报错代码行数和反编译的代码不一致,无法精确定位到哪行哪个变量是null,痛苦。
分别从以下几个领域分析并尝试解决:
1.SDK版本问题,切了1.4,切了1.3,sdk版本,都是一样的错误。 — 都切换了错误依旧
2.SDK中依赖的class与现有项目的依赖有重复,且版本较低或者较高。 –都清理了,只保留海康的class,问题依旧。
3.debug-因为环境网络管理特别严格,本地一直无法环境调试,这个是最后本地环境起来之后debug发现的,原因是secretKey配置有误,一直没有拿到secretKey。
找到原因后,直呼SB,这么马虎的问题,一开始就可以避免。
我在nacos中配置了一套对应appkey,secretkey。
但是代码里引用了两套appKey和secretKey,一个是Properties类对应的配置-给调接口的Client端初始化使用,一个是@Value对应的配置-给前端预览使用,两套配置读的不一样,我一直以为是一套。只保证了第二套的配置正常,第一套一直读不到配置。
呜呼,改了一下@Value的配置,保持两套一致。问题解决。