Skip to content

假删除时,报空指针错[Bug]  #602

Open

Description

@shenjler

APIJSON Version/APIJSON 版本号

6.2.0

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

Mysql 8

Environment/环境信息

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

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

无法粘贴图片

Current Behavior/问题描述

重现步骤:
在数据库Aceess配置表增加了3个字段:deletedKey、deletedValue、notDeletedValue,
在Aceess表的Customer行记录(对应customer表),插入值 deletedKey = is_del, deletedValue = 1, notDeletedValue=0。(这里举例使用customer表)
在customer表有字段:is_del,默认值0
DemoSQLConfig 重写了 isFakeDelete方法 返回true

调用接口 POST: /delete
参数:{"Customer":{"id":15}}

Expected Behavior/期望结果

正常实现假删除,把 字段is_del 设置为1

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

这里的 判断 method == DELETE 并赋值为null 是否有问题?导致空指针问题。
Map<String, Object> accessFakeDeleteMap = method == DELETE
							? null : AbstractVerifier.ACCESS_FAKE_DELETE_MAP.get(config.getTable());

https://github.pccwhq.com/Tencent/APIJSON/blob/c8c3b92ce3bfec5922eab2919588039ddbc99709/APIJSONORM/src/main/java/apijson/orm/AbstractSQLConfig.java#L5240

Activity

  1. shenjler commented on Aug 25, 2023

    @shenjler
    Author
    image image
  2. cloudAndMonkey commented on Aug 25, 2023

    @cloudAndMonkey
    Contributor
    image 改成false就可以了
  3. shenjler commented on Aug 25, 2023

    @shenjler
    Author

    在假删除的时候,不应该是 当 method == DELETE 时, 获取access记录并赋值给 accessFakeDeleteMap变量吗?为什么赋值是反过来了的?
    Map<String, Object> accessFakeDeleteMap = method == DELETE
    ? AbstractVerifier.ACCESS_FAKE_DELETE_MAP.get(config.getTable()) : null;

  4. cloudAndMonkey commented on Aug 25, 2023

    @cloudAndMonkey
    Contributor

    项目启动的时候, 会初始化Access表的假删除字段.
    代码执行阶段都是读取配置

  5. shenjler commented on Aug 25, 2023

    @shenjler
    Author

    我知道项目启动的时候, 会初始化Access表的假删除字段 配置。没有问题。
    可能我描述问题不是很清晰吧,导致你理解错我的意思了。现在这里的代码逻辑是
    Map<String, Object> accessFakeDeleteMap = method == DELETE
    ? null : AbstractVerifier.ACCESS_FAKE_DELETE_MAP.get(config.getTable());

    意思是非DELETE的方法才取这个access记录吗?DELETE请求时,则为null ? 而不是应该这样吗:

    Map<String, Object> accessFakeDeleteMap = method == DELETE
    ? AbstractVerifier.ACCESS_FAKE_DELETE_MAP.get(config.getTable()) : null;

    可能我理解不对,求教。

  6. cloudAndMonkey commented on Aug 25, 2023

    @cloudAndMonkey
    Contributor

    https://github.pccwhq.com/Tencent/APIJSON/blob/c8c3b92ce3bfec5922eab2919588039ddbc99709/APIJSONORM/src/main/java/apijson/orm/AbstractSQLConfig.java#L5386-L5407
    这里是处理method = delete, 将delete 修改为update

    https://github.pccwhq.com/Tencent/APIJSON/blob/c8c3b92ce3bfec5922eab2919588039ddbc99709/APIJSONORM/src/main/java/apijson/orm/AbstractSQLConfig.java#L5240
    这里是处理 delete 子查询 (同一张表,好像 TommyLemon后面还加了其他条件, 我好久没看了,有点忘记了,哈哈 )
    {
    "sql@": {
    "with": true,
    "from": "Sys_user_role",
    "Sys_user_role": {
    "@column": "user_id",
    "role_id{}": ["023e1880-c0d4-4e7c-ae6c-7703199c2daf"]
    }
    },
    "Sys_user:aa": {
    "id{}@": "sql"
    },
    "explan": true
    }

  7. shenjler commented on Aug 25, 2023

    @shenjler
    Author

    好的,谢谢了。理解了第一种删除(够用了),没想到还可以处理 delete 子查询。

  8. shenjler commented on Aug 25, 2023

    @shenjler
    Author

    image 改成false就可以了

    确实这里改成false可以了。明白了,这里是添加过滤条件的。

  9. added a commit that references this issue on Aug 25, 2023
  10. shenjler commented on Aug 28, 2023

    @shenjler
    Author

    这里要加判空处理,否则,项目启动时会报空指针错误。

    image
  11. shenjler commented on Aug 28, 2023

    @shenjler
    Author

    还有个问题,就是当不传条件时,会把已删除( is_del=1 )的数据也查询出来。

    image image
  12. TommyLemon commented on Aug 28, 2023

    @TommyLemon
    Member

    断点调试下,只要假删除配置正确,除了 POST 外,其它都会在 AbstractSQLConfig.getWhereString 时加上条件 is_del = 0 或 is_del != 1 才对

  13. shenjler commented on Aug 29, 2023

    @shenjler
    Author

    断点调试了,在AbstractSQLConfig.newSQLConfig 的 request.isEmpty() 时,会直接返回了config对象。所以要加个过滤条件或者排序,使request不为Empty,才会加上is_del = 0条件。

    https://github.pccwhq.com/Tencent/APIJSON/blob/c8c3b92ce3bfec5922eab2919588039ddbc99709/APIJSONORM/src/main/java/apijson/orm/AbstractSQLConfig.java#L4931

    image
  14. TommyLemon commented on Aug 31, 2023

    @TommyLemon
    Member

    断点调试了,在AbstractSQLConfig.newSQLConfig 的 request.isEmpty() 时,会直接返回了config对象。所以要加个过滤条件或者排序,使request不为Empty,才会加上is_del = 0条件。

    https://github.pccwhq.com/Tencent/APIJSON/blob/c8c3b92ce3bfec5922eab2919588039ddbc99709/APIJSONORM/src/main/java/apijson/orm/AbstractSQLConfig.java#L4931

    image

    @shenjler
    看起来应该在 if (request.isEmpty()) 之前判断 ACCESS_FAKE_DELETE_MAP 是否包含了当前表的假删除配置,如果有,就不 reutrn config:
    if (request.isEmpty() && (accessFakeDeleteMap == null || accessFakeDeleteMap.isEmpty()))

    https://github.pccwhq.com/Tencent/APIJSON/blob/c8c3b92ce3bfec5922eab2919588039ddbc99709/APIJSONORM/src/main/java/apijson/orm/AbstractSQLConfig.java#L5238-L5241

    可以用 apijson-ruoyi 先试试,不行的话改下源码试试

  15. csx-bill commented on Dec 2, 2023

    @csx-bill
    Contributor

    我看了 apijson-ruoyi 他是加了排序条件,如果不加也是不生效的

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions