Используйте @Pattern для проверки UUID или UUID.toString () - PullRequest
0 голосов
/ 31 декабря 2018

Как известно, аннотация @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;

Есть ли способ использовать аннотацию @Pattern непосредственно для 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-000000a46339".Мы хотим, чтобы ввод такого рода завершился неудачей, добавив аннотацию проверки.

1 Ответ

0 голосов
/ 31 декабря 2018

UUID! = String

Вы должны понимать, что UUID - это , а не текст.Объект java.util.UUID является , а не a String объектом.UUID - это 128-битное значение , где некоторые биты имеют специальное значение для стандартной спецификации .

Люди плохо справляются с чтением / записью 128 бит, например, сто двадцать восемь 0 & 1 цифр.

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.net :

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

Такая шестнадцатеричная строкане UUID, он представляет значение UUID, удобный способ чтения или записи 128 бит.

Если у вас под рукой есть объект UUID в Java, вам нужноне делать никаких проверок .На самом деле, у вас нет строки для проверки.Так что регулярное выражение не имеет значения.В большинстве реализаций у вас есть только 128-битные данные, которые хранятся внутри как пара 64-битных целых чисел.

Чтобы проверить входящую строку в каноническом формате, нет необходимости проверять ваш шаблон, просто выполните анализ с использованием класса UUID и ловушку для исключения.

Кстати, стандартная спецификация UUID требует, чтобы любое шестнадцатеричное представление генерировалось строчными буквами.Это правило нарушается многими реализациями, в том числе Apple и Microsoft.Спецификация также требует синтаксического анализа входных данных для переноса прописных букв.

...