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. 问题排查顺序:
- 在本地测试验证,SMI测试环境验证mijiuye环境验证,都是正常的,我们自己的测试环境问题不能复现。
- 首页检查利源测试和生产环境mysql版本,字符集是否为 utf8mb4、排序规则是否为 utf8mb4_bin,确认都是正确的,排除数据库字符集问题。
- 执行SQL排查:将利源环境的表导入到本地,执行SQL成功,SQL是正确的,排查SQL问题。
- 检查SMI的代码:检查模型
mi_base_data_set
模型的search
方法,search
方法没有被重写,代码逻辑是正常的。刚开始怀疑是order by字段的问题,设置order by字段后,使用postman测试接口查询, mijiuye环境和mi环境都是正常的,无法复现,排除order by
的问题。 - 到这一步,字符集是正常的,sql是正常的,代码逻辑是正常的,请求参数是正常的, 一切都看着正常。
- 最后只能怀疑是不是扩展的问题?
点击菜单:开发者中心—模型管理,搜索模型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. 如何快速的定位继承扩展问题:
- 如何避免跨产品线的扩展,跨产品线的扩展是否需要专门的记录和维护?
- 是否可以提供final声明,标明这个方法或者模型不允许扩展。
- 如何快速的查看模型的继承链路,模型的扩展链路?方便快速的定位问题,现在查看模型的继承扩展不清晰。
- 如果扩展了模型的方法,执行方法时,是否可以输出日志打印真正执行的是哪一个APP,哪一个类加载的方法,把具体的className输出?