本文讨论了苍穹团队在开发环境中遇到的两种常见错误及其解决方案。首先,关于找不到类的问题,分别针对本地和线上环境给出了更新jar包、检查类文件存在性、配置服务器变量、评估应用耦合度及集群部署一致性等解决步骤。其次,针对实体类型中属性不存在的错误,提供了检查查询接口、确认实体字段存在性、以及在特定方法中预先指定需要加载的字段等解决方案。
一、常见场景及解决方案
1、 苍穹团队开发环境,报错提示找不到类
RuntimeException cosmic-bos:xxPlugin not find
1.1、如果只是本地开发环境提示找不到类,一般都是jar包资源没更新到本地,需要更新服务器中的jar包到本地安装路径/mservice/lib
1.2如果本地开发环境和线上环境都报错提示找不到类:则需要排查
(1) 是不是这个类文件确实不存在
(2) 服务器上是存在这个类文件的
①那请联系管理员确认首次部署新zip包添加到cuslib系统变量,否则不生效。
②确认是不是分应用部署并且是跨应用调用插件:如果是,那就要看两个应用之间的业务关联性强不强(也就是我们说的耦合度)。如果耦合度很强,则是设计层面的问题-是不是应该考虑把这两个应用合并部署;如果耦合度较低,那么我们可以考虑通过二开微服务(RPC调用)等方式调用插件或者避免跨应用调用到插件(比如父子页面是不同应用的页面,子页面调用父页面的视图模型的时候,不需要加载父页面的插件)
③还有一种情况是多个容器都部署了同一个应用appid(我们可以理解为集群),容器a配置了类所在的zip包,容器b没有配置类所在的zip包。那么如果根据负载均衡算法找到了容器b,那么根据容器的配置找不到类,就会引发中断报错。
2、苍穹团队开发环境,报错提示:实体类型xx中不存在名为yy的属性
(1)以如下报错为例定位到报错的代码位置,发现是因为通过数据查询接口查询的数据没有查出org字段(selectFieds参数字段没传值),并且对查询的结果集进行了get获取字段值。
正确做法是往查询字段中添加org值
(2)确认报错提示中提到的实体xx中是不是确实不存在yy的字段,如下列表中提示不存在实体kded_reqbill对应的kded_currencyfield字段的名称属性,那么我们可以去实体上查找是否存在kded_currencyfield字段
表单页面搜索是否存在该字段
(3)以如下报错为例定位到代码位置,可以发现是服务插件beginOperationTransaction方法里面获取”kded_pricefield”报的实体不存在” kded_pricefield”字段的错。
在苍穹的操作引擎中,需要先根据传入的单据内码,加载单据数据包,其中只包含操作要用到的字段,然后再执行操作;所以在beginOperationTransaction方法中用到的数据包的字段,需要在准备加载单据数据之前的触发事件onPreparePropertys中,先指定需要加载的字段,即需要加上上面19行注释掉的代码。否则,操作引擎加载出的单据数据包,因为没有插件要用到的字段值,从而引发中断
推荐阅读