gpt4 book ai didi

java - 使用 @Pattern 验证 UUID 或 UUID.toString()

转载 作者:行者123 更新时间:2023-11-30 01:57:17 26 4
gpt4 key购买 nike

我们知道,@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()使用@Pattern注释?

实际场景:

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-000000a46339”的有效索引。我们希望通过添加验证注释来让这种输入失败。

最佳答案

UUID != 字符串

您必须了解 UUID不是文本。 java.util.UUID 对象不是 String 对象。 UUID 是 128-bit value其中一些位具有特殊含义 the standard spec .

人类不太擅长读/写 128 位,例如一百二十八位 01 数字。

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 位值转换为 hexadecimal 32 个字符的字符串。按照规范,这些十六进制字符用四个连字符分组,总共 36 个字符。

示例为UuidGenerator.net :

af70059c-f604-4cbd-9d27-2cff7e280b13

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

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

要验证规范格式的传入字符串,无需验证模式,只需使用 UUID 类进行解析并捕获异常即可。

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

关于java - 使用 @Pattern 验证 UUID 或 UUID.toString(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53982710/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com