当前位置: 首页 > 知识库问答 >
问题:

使用@模式验证UUID或UUID。toString()

勾起运
2023-03-14

众所周知,@Pattern注释只能用于CharSequence的实现,例如String。因此,以下对UUID的验证将不起作用。

@Pattern(regexp="^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$")
private UUID                id;

有没有办法直接在UUID上或基于UUID使用@模式注释。toString()?

实际情况:

public class IndexController {
    ...
    public ResponseEntity<Void> postIndexes(@ApiParam(value = INDEXES_DESC, required = true) @Valid @RequestBody @Size(min = 1, max = 2000) List<Index> indexes) {
        ...
    }
    ...
}

@JsonInclude(JsonInclude.Include.NON_NULL)
public class Index implements Serializable {
    @ApiModelProperty(value = ID_DESC, example = SINGLE_ID)
    @NotNull
    private UUID                id;
    ...
}

用户输入一个JSON格式的请求正文时,如下所示

[
  {
    ...
    "id": "40336c2b-591a-4472-a270-A46339",
    ...
  }
]

它看起来不像正常的UUID。最后一部分应包含12位数字,并且不应有任何大写字母。但是,此类输入将成功转换为UUID为“40336c2b-591a-4472-a270-000000 A46339”的有效索引。我们希望通过添加验证注释使此类输入失败。

共有1个答案

夹谷琨
2023-03-14

您必须理解UUID不是文本。java.util.UUID对象不是String对象。UUID是一个128位的值,其中一些位根据标准规范具有特殊含义。

人类不擅长读/写128位,比如一百二十八0

1010 1111 0111 0000 0000 0101 1001 1100

1111 0110 0000 0100 0100 1100 1011 1101

1001 1101 0010 0111 0010 1100 1111 1111

0111 1110 0010 1000 0000 1011 0001 0011

因此,当呈现供人类使用的UUID时,我们将128位值转换为32个字符的十六进制字符串。通常,这些十六进制字符由四个连字符组成,总共36个字符。

每个UuidGenerator的示例。净值:

af 70059 c-f 604-4 cbd-9 d 27-2 cff 7 e 280 b 13

这样的十六进制字符串不是一个UUID,它代表一个UUID值,一个方便的方式来读取或写入128位。

如果您手头有Java中的UUID对象,则无需进行任何验证。事实上,您没有可以进行任何验证的字符串。所以regex是不相关的。在大多数实现中,您只有128位,在内部存储为一对64位整数。

要以规范格式验证传入字符串,无需模式进行验证,只需使用UUID类和异常陷阱进行解析即可。

顺便说一句,UUID标准规范要求任何十六进制表示都要以小写形式生成。许多实现违反了这一规则,包括苹果和微软的实现。该规范还要求解析输入以容忍大写。

 类似资料:
  • UUID 1 - IEEE 802 MAC Address # uuid_getnode.py import uuid print(hex(uuid.getnode())) # uuid_uuid1.py import uuid u = uuid.uuid1() print(u) print(type(u)) print('bytes :', repr(u.bytes)) print(

  • 问题内容: 我有两个表声明如下: 我想用一些值填充liquibase changelog文件中的两个表: 在此示例中,由于简单起见,我使用了aaaa和bbbb。我想通过DBMS生成那些UUID。 最好的方法是什么?我必须在变更日志文件中使用SQL还是可以在XML中使用?我更喜欢DBMS独立解决方案,例如XML或JSON。 我的第二个问题是,如何声明带有UUID的列,该列会在插入时创建UUID。就像

  • 您应该使用哪个版本的UUID?我看到很多线程解释每个版本需要什么,但我很难找出什么最适合什么应用程序。

  • 问题内容: 我需要将GUID / UUID作为行的ID列。 这是为了能够在线和离线创建条目,并且合并时当然不会在PK上存在这些冲突。我知道我可以缓解这种情况,但是我想保持简单,并且已有一些遗留应用程序已经在使用uuid / guid定义关系。以后还需要双向同步数据。重写现有应用程序不是一种选择。 当我尝试在grails上使用GUID或UUID时,出现错误500。(在h2上使用GUID会导致另一个错

  • JUG 是一个纯 Java 的 UUID 生成器。 UUID是指在一台机器上生成的数字,它保证对在同一时空中的所有机器都是唯一的。通常平台会提供生成UUID的API。UUID按照开放软件基金会 (OSF)制定的标准计算,用到了以太网卡地址、纳秒级时间、芯片ID码和许多可能的数字。由以下几部分的组合:当前日期和时间(UUID的第一个部分与 时间有关,如果你在生成一个UUID之后,过几秒又生成一个UU

  • 问题内容: 我正在尝试为我的Django对象获取唯一的ID。在Django 1.8中,它们具有UUIDField。我不确定如何使用此字段来为模型中的每个对象生成唯一的ID。 这是我对UUIDField的要求 我可以重现UUID模型的ID,但是每次我都得到完全相同的ID。:(。 例如: id然后每次都给我相同的id。怎么了,我该如何解决?感谢您的帮助! 问题答案: 我不确定为什么要创建UUID模型。