Skip to content

[bug] Request 表中 UNIQUE 不生效 #282

Closed

Description

@jerrylususu

环境信息

  • 系统: Windows 10
  • JDK: 13
  • 数据库: MySQL 5.7
  • APIJSON: 4.7.0

问题描述

使用 APIJSONBoot 示例项目。在 Request 表中,method=POST, tag=register 的用户注册方法,Structure 内要求 Privacy 表中 Phone 字段 unique。

先随便使用一个账户登录,有登录态之后不经过 /register 端点,而是直接从 /POST 端点调用此方法,也可以正常注册用户。(不使用 /register 是因为其中首先用 HEADS 检查了手机号存在,我想看看 Structure 中 UNIQUE 是否能独立工作。)

但是如果用户提供的 Phone 在数据库中已经存在,返回报错是底层数据库的报错(apijson_privacy 表中 phone 列有 UNIQUE 限制),而非校验的报错。在数据库中取消 phone 列的 UNIQUE 限制,多次注册相同手机号的用户,均成功。这说明 APIJSON 自身的 UNIQUE 限定没有正常工作,只是被数据库兜底了才没出问题。

在 AbstractVerifier.verifyRepeat 方法下断点,可以发现 result 已经拿到了数据库中已经存在的相同手机号的用户,但是这里的判断条件似乎有问题,导致重复异常没能正常触发。

错误信息

Request 表中 Structure

{
  "User": {
    "MUST": "name",
    "REFUSE": "id",
    "UPDATE": {
      "id@": "Privacy/id"
    }
  },
  "Privacy": {
    "MUST": "_password,phone",
    "REFUSE": "id",
    "UNIQUE": "phone",
    "VERIFY": {
      "phone~": "PHONE"
    }
  }
}

示例请求

{
    "Privacy": {
        "phone": "13323332339",
        "_password": "mypassord2"
    },
    "User": {
        "name": "test"
    },
    "verify": "5424",
    "tag": "register"
}

未移除数据库中 UNIQUE 限定时,存在相同手机号返回的报错
(注意这里是 java.sql 的异常,而不是 APIJSON 自己的异常)

{
    "Privacy": {
        "phone": "13323332339",
        "_password": "mypassord2"
    },
    "User": {
        "name": "test",
        "id@": "Privacy/id"
    },
    "verify": "5424",
    "ok": false,
    "code": 500,
    "msg": "Duplicate entry '13323332339' for key 'phone_UNIQUE'",
    "sql:generate|cache|execute|maxExecute": "1|0|1|200",
    "depth:count|max": "1|5",
    "time:start|duration|end": "1627580061511|55|1627580061566",
    "throw": "java.sql.SQLIntegrityConstraintViolationException",
    "trace": [ 省略 ]
}

移除数据库 UNIQUE 限定后,重复手机号依然正常注册

{
    "Privacy": {
        "ok": true,
        "code": 200,
        "msg": "success",
        "count": 1,
        "id": 1627580277720
    },
    "User": {
        "ok": true,
        "code": 200,
        "msg": "success",
        "count": 1,
        "id": 1627580277720
    },
    "verify": "5424",
    "ok": true,
    "code": 200,
    "msg": "success",
    "sql:generate|cache|execute|maxExecute": "2|0|2|200",
    "depth:count|max": "1|5",
    "time:start|duration|end": "1627580277712|15|1627580277727"
}

断点调试截图
image

Activity

  1. TommyLemon commented on Jul 31, 2021

    @TommyLemon
    Member

    感谢反馈,某次重构导致的 bug,已解决。
    646bed4

    image

  2. TommyLemon commented on Jul 31, 2021

    @TommyLemon
    Member
  3. jerrylususu commented on Jul 31, 2021

    @jerrylususu
    ContributorAuthor

    4.7.2 验证已解决。感谢帮助!

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