关于开放API服务插件中的convertPk方法进不去的分析解决过程原创
金蝶云社区-聚宝彭
聚宝彭
12人赞赏了该文章 2,076次浏览 未经作者许可,禁止转载编辑于2021年03月12日 16:06:27

最近有小伙伴在做开放API服务开发时遇到一个问题:开放API服务插件的convertPk方法始终进不去(https://vip.kingdee.com/questions/157801633555521792)。so,花了点研究了下这个问题,以下是我排查问题的过程,希望能给各位看官一点点帮助。

首先,我建了个测试单据,对外暴露了一个操作服务(query),写了个测试用的开放API插件,如下图所示(随便用模板建一个测试单据就好了,这里就不截图了)。

自定义操作服务-1.png

自定义操作服务-2.png

插件-1.png


然后,用postman测试,始终不进doCustomService方法。至此,我们就已经复现了开发者社区中小伙伴提出的问题。

query-1.png


接下来,各种查开放API服务的资料,调整各种调试的姿势,但始终还是不能解决问题…

无奈之下,只能请教平台的大佬了…

对话-1.png

对话-1-1.png

对话-2.png

对话-2-1.png


so,踩平了第一个小坑,我们继续。在插件中重写convertPk方法,然后postman重新发起请求测试…

插件-2.png


结果是:不仅不进doCustomService方法,而且也不进convertPk方法。此处瀑布汗…【emoji】【emoji】【emoji】

OMG,居然还是不进插件…这个时候,咱要淡定,要淡定…既然平台大佬都已经告诉我们方法的触发时机是在DefaultOperate.execute()方法中调用fireConvertPkEvent(ConvertPkEvent),咱就来跟源码研究探究嘛~~~

eclipse工程里面反编译打开类DefaultOperate,打上断点,postman重发请求,断点依旧没进,简直抓狂额…

坑,无尽的多,可咱还得继续呀~~~

源码DefaultOperate中,可看到该类是继承自OperationApi,顺藤摸瓜,找到其根是AbstractOperateWebApi。找到这里,各位小伙伴可能觉得没发继续了,但我有个点子:看看其他子类是否也有调用fireConvertPkEvent方法的地方。So,ctrl+shit+t,查一下AbstractOperateWebApi的子类。

abstractapiplugin.png


庆幸的是,其子类并不多,那咱就挨个挨个看嘛。最终,在kd.bos.entity.operate.webapi.Save和kd.bos.entity.operate.webapi.Load都有搜索到fireConvertPkEvent方法。

山重水复疑无路,柳暗花明又一村啊…【emoji】【emoji】【emoji】

看到这两个类名(save和load),不知道大家有没有萌生点什么想法。反正吧,我是想到了开放API服务暴露的操作服务save和query了。

拖拉机摇起来,继续出发啦~~~

先在调用fireConvertPkEvent方法的kd.bos.entity.operate.webapi.Load.execute()方法上打断点。

接下来在开放平台新注册一个load接口。

load-1.png


再在postman发起请求。

load-2.png


这时候,惊喜的发现,进断点啦…哈哈哈哈哈哈哈哈哈哈…

拖拉机开启暴走模式~~~

断点继续往下走进到kd.bos.entity.operate.webapi.OperationApi.fireConvertPkEvent(ConvertPkEvent)方法中,

单步调试我们可以看到变量pluginProxy的值为注册在单据界面上的插件。

OperationApi.png


满脸的黑人问号脸啊..怎么取的注册在单据界面上的插件啊?为嘛啊?为嘛啊?为嘛啊?

既然取的是注册在单据页面上的插件?那咱就尝试把插件注册到单据界面上嘛~

再重新发起请求测试看看…

意料之中的报错,毕竟基类不一样嘛~~~

报错.png


可能到这里,已经有高手发觉了问题,然而,我这低端普通玩家反应能力实在太渣,只能再腆着老脸再找平台大佬额,结果大佬一语惊醒梦中人啊~~~

对话-3.png


最后冲锋时刻,代码改起来…

插件-3.png


重启服务重新发起请求…

结果.png


哈哈哈哈哈哈哈,可以进断点了并查出数据了,完美解决…


啰啰嗦嗦这么多,不知道各位看官是否都get到点了,最后给大家总结一下吧。

1. 操作服务中注册的插件只会进convertPK这个方法,其他方法是不会进的。

2. 注册在操作服务中的开发API服务插件,在实现接口IBillWebApiPlugin的同时目前还必须继承自AbstractBillPlugIn。

3. 插件目前必须注册在单据界面上!


相信有小伙伴会跟我一样觉得,开放API插件要注册在单据界面上,这简直是个大坑啊。不调试下代码,谁能想得到额。不过,各位看官,放心放心。你们的担心,我已经咨询过大佬啦~~~

对话-4.png


至此,文章到这里就结束啦,希望对各位小伙伴有所启发。以下是关于开放API服务的参考资料,大家在开发的时候可以多参考参考。

《金蝶云苍穹平台开发指南》第18节开放平台

《金蝶云苍穹Java插件开发之南》第20节开放API插件

https://vip.kingdee.com/knowledge#tabMain

https://vip.kingdee.com/article/123883327094068480

https://vip.kingdee.com/article/123893364818515200

https://vip.kingdee.com/article/124189496857376512

https://vip.kingdee.com/article/124583053636072448

https://vip.kingdee.com/article/124605921954558976

https://vip.kingdee.com/questions/96970831732907008/answers/97027803266381824

https://club.kdcloud.com/article/96284788335447040

https://club.kdcloud.com/article/62922296562014976



大家如有任何建议和意见,欢迎在评论区留言,我将努力改进。创作不易,如能帮到大家,请动动您的金手指点赞鼓励一下,非常感谢~【emoji】【emoji】【emoji】


赞 12