1. 问题描述

项目:利源项目 【利源 测试/生产环境】-SMI应用点击菜单 数据源管理—> 数据集 ,筛选条件选择 类型 type=SQL时,调用查询结果没有数据 http://192.168.174.169:30666/iidp/smi/mi_base_root_menu/mi_base_data_source_menu/mi_base_data_set_menu

问题

2. 问题排查顺序:

  1. 在本地测试验证,SMI测试环境验证mijiuye环境验证,都是正常的,我们自己的测试环境问题不能复现。
  2. 首页检查利源测试和生产环境mysql版本,字符集是否为 utf8mb4、排序规则是否为 utf8mb4_bin,确认都是正确的,排除数据库字符集问题。
  3. 执行SQL排查:将利源环境的表导入到本地,执行SQL成功,SQL是正确的,排查SQL问题。
  4. 检查SMI的代码:检查模型mi_base_data_set模型的search方法,search方法没有被重写,代码逻辑是正常的。刚开始怀疑是order by字段的问题,设置order by字段后,使用postman测试接口查询, mijiuye环境和mi环境都是正常的,无法复现,排除order by的问题。
  5. 到这一步,字符集是正常的,sql是正常的,代码逻辑是正常的,请求参数是正常的, 一切都看着正常。
  6. 最后只能怀疑是不是扩展的问题?

点击菜单:开发者中心—模型管理,搜索模型mi_base_data_set ,查看模型的继承扩展于:

smi-base-datasource.models.dataset.DataSet,
smi-base-asset.models.asset.AbstractAsset,
smi-base-datasource.models.dataset.ExcelSet,
smi-base-datasource.models.dataset.KafkaSet,
smi-base-datasource.models.dataset.WebSocketSet,
smi-base-datasource.models.dataset.RabbitMQSet,
smi-base-datasource.models.dataset.VideoSet,
smi-base-datasource.models.dataset.JDBCSet,
smi-base-datasource.models.dataset.ApiSet,
iiot_datasource.ApiSet,
iiot_datasource.DataSet,
base.buss_model

模型扩展链路

,发现IIOT的 iiot_datasource.DataSet扩展了SMI的mi_base_data_set,然后查看IIOT的代码 DataSet,发现 IIOT重写了mi_base_data_set的search方法,但是重写错误了,导致查询不出结果。

package com.sie.iiot.apps.datasource.model;

@SDK.Model(name = "mi_base_data_set", parent = "mi_base_data_set")
public class DataSet extends Model {
    public List<Map<String, Object>> search(RecordSet rs, Filter filter, List<String> properties, Integer limit,
                                            Integer offset, String order) {}

3. 根本原因:

IIOT重写了SMI 模型mi_base_data_set的search方法,但是重写错误了,导致查询不出结果。

4. 如何解决:

IIOT修改扩展的search方法

5. 如何快速的定位继承扩展问题:

  1. 如何避免跨产品线的扩展,跨产品线的扩展是否需要专门的记录和维护?
  2. 是否可以提供final声明,标明这个方法或者模型不允许扩展。
  3. 如何快速的查看模型的继承链路,模型的扩展链路?方便快速的定位问题,现在查看模型的继承扩展不清晰。
  4. 如果扩展了模型的方法,执行方法时,是否可以输出日志打印真正执行的是哪一个APP,哪一个类加载的方法,把具体的className输出?

模型继承扩展显示优化