Tencent/APIJSON

前端传参驼峰命名转为蛇形命名的衍生问题

SangSpace opened this issue · 12 comments

APIJSON Version/APIJSON 版本号

6.2.0

Database Type & Version/数据库类型及版本号

mysql8

Environment/环境信息

- JDK/基础库:1.8
- OS/系统:windows

APIAuto Screenshots/APIAuto 请求与结果完整截屏

静态检查无问题

Current Behavior/问题描述

开启了前端传参驼峰命名转为蛇形命名之后,关联表数据未匹配到。前端传参@column中不能写驼峰,表关联join中不能写驼峰。
请求参数:
{
  "[]": {
    "query": 2,
    "page": 0,
    "count": 10,
    "DevDeviceInstance": {
      "@column": "id,name,product_id"
    },
    "DevProduct": {
      "@column": "id,name",
      "id@": "/DevDeviceInstance/product_id"
    },
    "join": "</DevProduct/id@"
  },
  "total@": "/[]/total",
  "info@": "/[]/info"
}

返回结果:
{
  "[]": [
    {
      "DevDeviceInstance": {
        "id": 500,
        "name": "测试设备",
        "productId": 1694773415864
      }
    },
    {
      "DevDeviceInstance": {
        "id": 501,
        "name": "测试设备10",
        "productId": 1685845210247561218
      }
    }
  ],
  "total": 2,
  "info": {
    "total": 2,
    "count": 10,
    "page": 0,
    "max": 0,
    "more": false,
    "first": true,
    "last": true
  },
  "ok": true,
  "code": 200,
  "msg": "success",
  "debug:info|help": " \n提 bug 请发请求和响应的【完整截屏】,没图的自行解决! \n开发者有限的时间和精力主要放在【维护项目源码和文档】上! \n【描述不详细】 或 【文档/常见问题 已有答案】 的问题可能会被忽略!! \n【态度 不文明/不友善】的可能会被踢出群,问题也可能不予解答!!! \n\n **环境信息**  \n系统: Windows 10 10.0 \n数据库: DEFAULT_DATABASE = MYSQL \nJDK: 1.8.0_261 amd64 \nAPIJSON: 6.2.1 \n   \n【常见问题】:https://github.com/Tencent/APIJSON/issues/36 \n【通用文档】:https://github.com/Tencent/APIJSON/blob/master/Document.md \n【视频教程】:https://search.bilibili.com/all?keyword=APIJSON\n 【警告】:[Reference]: []/0/DevProduct/id@: []/0/DevDeviceInstance/product_id 引用赋值获取路径对应的值为 null!请检查路径是否错误!; ",
  "time": 1695371196089,
  "sql:generate|cache|execute|maxExecute": "2|0|2|200",
  "depth:count|max": "3|5",
  "time:start|duration|end|parse|sql": "1695371195868|221|1695371196089|19|202"
}

Expected Behavior/期望结果

前端统一使用驼峰命名规范,数据库统一使用下划线命名规范。后台服务可以统一把所有字段做两个命名规范的转换。希望大佬可以给个方向,我可以自行调整下

Any additional comments?/其它补充说明?

No response

我测了一下,原因是DevDeviceInstance中的product_id被转了驼峰命名,所以DevProduct中的id未关联到转驼峰后的productId字段

还没发布的版本,已经支持驼峰和蛇形命名转换功能,可以改 maven 依赖为依赖最新源码,或者等新发版
2b0d612

用的是最新版代码,后台返回数据蛇形转驼峰没有问题。前端传驼峰,自动转蛇形部分不转换

JSONResponse.IS_FORMAT_UNDERLINE = true;
SqlConfig加了getSQLKey

参数:
{
"[]": {
"query": 2,
"page": 0,
"count": 10,
"DevProduct": {},
"DevDeviceInstance": {
"@column": "productId;count(1):count",
"@group": "productId",
"productId@": "/DevProduct/id"
},
"join": "</DevDeviceInstance/productId@"
},
"total@": "/[]/total",
"info@": "/[]/info"
}

APIJSONSQLConfig:
@OverRide
public AbstractSQLConfig setColumn(List column) {
if (column == null) {
return super.setColumn(null);
}
column = ColumnUtil.compatInputColumn(column, getTable(), getMethod());
for (int i = 0; i < column.size(); i++) {
if (column.get(i).contains(":")) {
continue;
}
column.set(i, JSONRequest.recoverUnderline(column.get(i), false));
}
return super.setColumn(column);
}

如上,重写了SqlConfig的setColumn之后,还剩下表关联配置里的productId@未自动转蛇形

我看了。里面的方案只能解决单表查询。表关联里的字段没有转换处理

全局下划线驼峰互转:

  1. 重写APIJSONSQLConfig.getSQLKey,APIJSONSQLConfig.setColumn,APIJSONSQLConfig.onGetJoinString(格式化Join里的Key)
  2. 重写APIJSONSQLExecutor.getKey
    最终实现了一个相对理想的结果,就是不太确定这种方式有没有隐患

可以跑下 APIAuto 上的测试用例
http://apijson.cn/api

还没发布的版本,已经支持驼峰和蛇形命名转换功能,可以改 maven 依赖为依赖最新源码,或者等新发版 2b0d612

需要等6.2.1版本才可以实现驼峰吗

还没发布的版本,已经支持驼峰和蛇形命名转换功能,可以改 maven 依赖为依赖最新源码,或者等新发版 2b0d612

需要等6.2.1版本才可以实现驼峰吗

@csx-bill
对,也可能不叫 6.2.1

2b0d612

新增驼峰与蛇形命名互转方法以及 JSONResponse.IS_FORMAT_UNDERLINE 等配置

能否给个使用说明 比如说APIJSONBoot例子项目怎么用?
@TommyLemon 谢谢

@cmcxn DemoSQLConfig 重写 getSQLKey 和 getSQLTable 把驼峰转为蛇形,DemoSQLExecutor 重写 getKey 把蛇形转为驼峰
#655